ビッグデータ時代の到来により、大量のデータの保存と処理が特に重要になっています。 NoSQL データベースに関しては、HBase が現在広く使用されているソリューションです。 Go 言語は静的に強く型付けされたプログラミング言語であり、そのシンプルな構文と優れたパフォーマンスにより、クラウド コンピューティング、Web サイト開発、データ サイエンスなどの分野で使用されることが増えています。この記事では、Go 言語で HBase を使用して効率的な NoSQL データベース アプリケーションを実装する方法を紹介します。
HBase は、拡張性と信頼性に優れたカラムベースの分散データ ストレージ システムです。 Hadoop クラスター上で実行され、非常に大規模なデータ ストレージと処理タスクを処理できます。 HBase のデータ モデルは、列ベースの NoSQL データベースである Google の Bigtable に似ています。 HBase には次の特徴があります。
Go 言語は、HBase 上で操作を実装するための Thrift ライブラリを提供します。 Thrift は、Java、Python、Ruby、C などの複数の言語でコードを生成できる、Apache のクロス言語フレームワークです。 Thrift を使用すると、開発者は単純な定義言語を使用して RPC サービスを定義し、クライアント側およびサーバー側のコードを生成できます。 Go 言語では、開発に thriftgo ライブラリを使用できます。
2.1 Thrift のインストール
Thrift を使用する前に、まず Thrift コンパイラをインストールする必要があります。 Thrift 公式 Web サイトから対応するバージョンのコンパイラーをダウンロードし、解凍して環境変数に追加できます。
2.2 HBase の Thrift インターフェースを定義する
Thrift 定義ファイルは IDL (Interface Definition Language、インターフェース定義言語) と呼ばれます。 HBase の Thrift インターフェイス ファイルは Hbase.thrift です。公式ドキュメントから、または git clone コマンドを介して github からダウンロードできます。
$ git clone https://github.com/apache/hbase
HBase のすべての Thrift インターフェイス定義は Hbase.thrift ファイルにあり、それらを次のように使用することを選択できます。必要です。たとえば、次はテーブルをリストするインターフェイス定義です。
struct TColumnDescriptor {
1: required binary name, 2: binary value, 3: bool __isset.value, 4: optional CompressionType compression, 5: optional int32 maxVersions, 6: optional int32 minVersions, 7: optional int32 ttl, 8: optional bool inMemory, 9: optional BloomType bloomFilterType, 10: optional int32 scope, 11: optional bool __isset.compression, 12: optional bool __isset.maxVersions, 13: optional bool __isset.minVersions, 14: optional bool __isset.ttl, 15: optional bool __isset.inMemory, 16: optional bool __isset.bloomFilterType, 17: optional bool __isset.scope
}
TColumnDescriptor は列ファミリーの定義と考えることができます。列ファミリー名、圧縮タイプ、最大バージョン、有効期限、メモリストレージ、その他の属性が含まれます。 Go 言語では、Thrift コンパイラーを使用して Hbase.thrift ファイルを Go 言語コードにコンパイルする必要があります。コンパイル前に thriftgo ライブラリをインストールする必要があります。
$ go get -u github.com/apache/thrift/lib/go/thrift
次に、HBase ディレクトリで次のコマンドを実行して Go 言語コードを生成します。
$ thrift --gen go src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
コマンドを実行すると、生成された gen- go ディレクトリ 生成されたすべての Go 言語コード ファイルを表示します。
2.3 HBase サーバーへの接続
HBase サーバーに接続するには、トランスポート リンクを作成し、接続プールを使用してリンクを管理する必要があります。接続プールは複数のトランスポート リンクを維持でき、これらのリンクを再利用することで全体のスループットを向上させることができます。以下は、HBase に接続するためのコード例です。
package main
import (
"context" "fmt" "sync" "git.apache.org/thrift.git/lib/go/thrift" "hbase"
)
type pool struct {
hosts []string // HBase服务器地址列表 timeout thrift.TDuration // 连接超时时间 size int // 连接池大小 pool chan *conn // 连接池 curConns int // 当前连接池中的连接数 lock sync.RWMutex
}
type conn struct {
trans hbase.THBaseServiceClient // HBase客户端 used bool // 是否被使用
}
// NewPool は接続プールを初期化します
func NewPool(hosts []string, timeout int, size int ) *pool {
p := &pool{ hosts: hosts, timeout: thrift.NewTDuration(timeout * int(thrift.MILLISECOND)), size: size, pool: make(chan *conn, size), curConns: 0, } p.lock.Lock() defer p.lock.Unlock() for i := 0; i < size; i++ { p.newConn() } return p
}
// AddConn 接続の追加
func (p *pool) AddConn() {
p.lock.Lock() defer p.lock.Unlock() if p.curConns < p.size { p.newConn() }
}
// Close 接続プールを閉じます
func (p *pool) Close() {
p.lock.Lock() defer p.lock.Unlock() for i := 0; i < p.curConns; i++ { c := <-p.pool _ = c.trans.Close() }
}
// GetConn 接続を取得します
func (p pool) ) GetConn() ( conn, error) {
select { case conn := <-p.pool: if conn.used { return nil, fmt.Errorf("Connection is already in use") } return conn, nil default: if p.curConns >= p.size { return nil, fmt.Errorf("Connection pool is full") } p.lock.Lock() defer p.lock.Unlock() return p.newConn(), nil }
}
// PutConn は接続
func (p pool) PutConn(conn ) を返しますconn) {
conn.used = false p.pool <- conn
}
// newConn 接続の作成
func (p pool) newConn() conn {
socket := thrift.NewTSocketTimeout(p.hosts[0], p.timeout) transport := thrift.NewTFramedTransport(socket) protocol := thrift.NewTBinaryProtocolTransport(transport, true, true) client := hbase.NewTHBaseServiceClientFactory(transport, protocol) if err := transport.Open(); err != nil { return nil } p.curConns++ return &conn{ trans: client, used: false, }
}
使用上のコード例では、HBase に接続するための接続プールを作成できます。ホスト、タイムアウト、サイズなどのパラメータを設定した後、NewPool メソッドを使用して接続プールを作成できます。接続プール内の接続は、GetConn メソッドを使用して取得でき、PutConn メソッドによって返されます。
2.4 データに対する操作
HBase サーバーに接続した後、接続プール内の接続を使用してデータを操作できます。データに対する操作の例をいくつか示します。
// テーブルのリストを取得します
func GetTableNames(c *conn) ([]string, error) {
names, err := c.trans.GetTableNames(context.Background()) if err != nil { return nil, err } return names, nil
}
// データ行を取得
func GetRow(c conn, tableName string, rowKey string) (hbase.TRowResult_, error) {
// 构造Get请求 get := hbase.NewTGet() get.Row = []byte(rowKey) get.TableName = []byte(tableName) result, err := c.trans.Get(context.Background(), get) if err != nil { return nil, err } if len(result.Row) == 0 { return nil, fmt.Errorf("Row %s in table %s not found", rowKey, tableName) } return result, nil
}
// データ行を書き込みます
func PutRow(c *conn, tableName string, rowKey string, columns map[string]map[string][]byte,
timestamp int64) error { // 构造Put请求 put := hbase.NewTPut() put.Row = []byte(rowKey) put.TableName = []byte(tableName) for cf, cols := range columns { family := hbase.NewTColumnValueMap() for col, val := range cols { family.Set(map[string][]byte{ col: val, }) } put.ColumnValues[[]byte(cf)] = family } put.Timestamp = timestamp _, err := c.trans.Put(context.Background(), put) if err != nil { return err } return nil
}
GetTableNames メソッドはテーブルのリストを取得でき、GetRow メソッドはデータ行を取得でき、PutRow メソッドはデータ行を書き込むことができます。TPut リクエストは PutRow で構築する必要があることに注意してください。方法。 ###
この記事では、Go 言語で HBase を使用して効率的な NoSQL データベース アプリケーションを実装する方法を紹介します。 Thriftインターフェースの定義からHBaseサーバーへの接続、データの操作まで、Go言語を使ってHBaseを操作する方法をステップごとに説明しています。 Go 言語の高いパフォーマンスと Thrift フレームワークの言語間機能を利用して、効率的な NoSQL データベース アプリケーションを構築できます。
以上がGo 言語で HBase を使用して効率的な NoSQL データベース アプリケーションを実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。