HBase は、Java 以外の言語に対する Thrift インターフェイスのサポートを提供します。ここでは、HBase Thrift インターフェイス (HBase バージョン 0.92.1) の使用経験に基づいて、発生した問題のいくつかと関連する注意事項をまとめます。
1. バイトの格納順序
HBase では、行 (行キーと列ファミリー、列修飾子、タイムスタンプ) が辞書編集順に並べ替えられるため、short、int、long およびその他の型のデータはBytes.toBytes(...) によってバイト配列に変換された後、ビッグ エンディアン モード (上位バイトが下位アドレスに、下位バイトが上位アドレスに) で格納される必要があります。価値についても同様です。したがって、Thrift API (C++、Php、Python など) を使用する場合は、統一されたビッグエンディアン方式で行と値をパックおよびアンパックすることが最善です。
たとえば、C++ では、int 型変数は次の方法で辞書順に変換されます:
コードをコピーします コードは次のとおりです:
string key;
int32_t timestamp = 1352563200;
const char * pTs = (const char*) ×tamp;
size_t n = sizeof(int32_t);
key.append(pTs, n);
次の方法で辞書順を int に変換します:
コードをコピーします コードは次のとおりです:
const char * ts = key.c_str();
int32_t timestamp = *((int32_t*)(ts));
Php は変換のためのパックメソッドとアンパックメソッドを提供します。
コードをコピーします コードは次のとおりです:
$key = Pack("N", $num);
$num = unpack("N", $key);
2. TScan
HBase の使用方法 PHP Thrift インターフェイスでは、TScan は startRow、stopRow、列、フィルター、およびその他の属性を直接設定できます。デフォルトでは、これらの属性は null であり、設定後は (TScan のコンストラクターを介して) null 以外になります。または TScan のメンバー変数に値を直接割り当てます)。 write() メソッドを通じて Thrift Server で RPC 操作を実行する場合、これらの属性が null ではないという事実に基づいて直接判断され、属性は Thrift プロトコルを通じて Thrift Server に送信されます。 しかし、C++ の Thrift インターフェイスでは、TScan に _TScan__isset __isset 型変数があり、その内部構造は次のとおりです: コードをコピーします コードは次のとおりです:
typedef struct _TScan__isset {
_TScan__isset() : startRow( false)、stopRow(false)、timestamp(false)、columns(false)、caching(false)、filterString(false) {}
bool startRow;
bool stopRow;
bool timestamp;
bool columns ;
bool キャッシュ;
bool filterString;
} _TScan__isset;
TScan の write() メソッドは、_TScan__isset の各ブール変数タグに startRow、stopRow、列、フィルターなどの属性が設定されているかどうかを判断し、これらの属性を Thrift プロトコルを通じて Thrift サーバーに送信するかどうかを決定します。設定は __set_xxx() メソッドを通じて有効になります。 TScan のデフォルトのコンストラクターでは、これらの属性に対応する __isset タグが true に設定されていません。
したがって、TScan のコンストラクターを通じて startRow、stopRow、カラム、フィルター、その他の属性を直接初期化すると、__set_xxx() メソッドが呼び出された場合にのみ、テーブルが最初から走査され、対応する bool フラグが true に設定されます。 、サーバーがスキャンのために startRow、stopRow、列、フィルターなどの属性を Thrift サーバーから取得できるようにします。
3. 同時アクセス スレッドの数
まず、ネットワーク送信による時間のオーバーヘッドを最小限に抑えるために、HBase の Thrift Server はアプリケーション クライアントと同じマシンにデプロイするのが最適です。 Thrift Server の起動時に、パラメータを使用して同時スレッドの数を設定できます。そうしないと、Thrift Server スレッドが簡単にいっぱいになり、クライアントの読み取りおよび書き込み要求に応答しなくなります。 特定のコマンド: bin/hbase-daemon.sh start thrift - -threadpool -m 200 -w 500 (その他のパラメータについては、bin/hbase-daemon.sh start thrift -h を参照してください)。
4. 最大ヒープ メモリ構成
クライアントが Thrift Server でスキャン操作を実行してデータを順次読み取り、特定の数のキャッシュ レコードが設定されている場合 (TScan の int32_t キャッシュ変数を通じて設定)、次のようになります。特に複数のクライアントが同時にアクセスする場合、多数のレコードが Thrift Server のヒープ メモリのかなりの部分を占める可能性があります。
したがって、Thrift Server を起動する前に、最大ヒープ メモリを増やすことができます。そうしないと、特にスキャン中に多数のキャッシュ レコードが設定されている場合 (デフォルトは、export HBASE_HEAPSIZE)、java.lang.OutOfMemoryError 例外によりプロセスが強制終了される可能性があります。 =1000MB、conf/hbase-env.sh で設定できます)。
http://www.bkjia.com/PHPjc/327254.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/327254.html技術記事 HBase は、非 Java 言語に対する Thrift インターフェイスのサポートを提供します。HBase Thrift インターフェイス (HBase バージョン 0.92.1) の使用経験に基づいて、発生した問題のいくつかと関連する注意事項を以下にまとめます。