Go 言語で HBase を使用して効率的な NoSQL データベース アプリケーションを実装する

王林
リリース: 2023-06-15 20:56:14
オリジナル
1233 人が閲覧しました

ビッグデータ時代の到来により、大量のデータの保存と処理が特に重要になっています。 NoSQL データベースに関しては、HBase が現在広く使用されているソリューションです。 Go 言語は静的に強く型付けされたプログラミング言語であり、そのシンプルな構文と優れたパフォーマンスにより、クラウド コンピューティング、Web サイト開発、データ サイエンスなどの分野で使用されることが増えています。この記事では、Go 言語で HBase を使用して効率的な NoSQL データベース アプリケーションを実装する方法を紹介します。

  1. HBase の概要

HBase は、拡張性と信頼性に優れたカラムベースの分散データ ストレージ システムです。 Hadoop クラスター上で実行され、非常に大規模なデータ ストレージと処理タスクを処理できます。 HBase のデータ モデルは、列ベースの NoSQL データベースである Google の Bigtable に似ています。 HBase には次の特徴があります。

  • Hadoop 分散コンピューティング プラットフォームに基づいており、PB レベルのデータを数千台のマシンに保存できます。
  • データの高速な読み取りと書き込みをサポートし、ストレージとアクセスの速度が非常に高速です。
  • ランダム読み取り、スキャン読み取り、フルテーブルスキャンなどの複数のデータアクセス方法をサポートします。
  • マルチバージョン データのストレージとクエリをサポートし、時系列データを効果的に処理できます。
  • 水平方向の拡張をサポートしており、ストレージと処理能力を簡単に拡張できます。
  • データの処理と変換をサポートする一連のフィルターとエンコーダーを提供します。
  1. Go 言語は 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 で構築する必要があることに注意してください。方法。 ###

  1. 概要

この記事では、Go 言語で HBase を使用して効率的な NoSQL データベース アプリケーションを実装する方法を紹介します。 Thriftインターフェースの定義からHBaseサーバーへの接続、データの操作まで、Go言語を使ってHBaseを操作する方法をステップごとに説明しています。 Go 言語の高いパフォーマンスと Thrift フレームワークの言語間機能を利用して、効率的な NoSQL データベース アプリケーションを構築できます。

以上がGo 言語で HBase を使用して効率的な NoSQL データベース アプリケーションを実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート