HBase シリーズ - HBase の読み書きプロセス#
内容整理自:
データ書き込みプロセス#
クライアント書き込みプロセス#
-
ユーザーが put リクエストを送信すると、HBase クライアントは設定に基づいて
autoflush=true/false(デフォルトはtrue)を判断し、サーバーに直接送信して処理するかどうかを決定します。falseの場合、リクエストはローカルバッファに追加され、一定の閾値(デフォルトは 2M、設定ファイルで変更可能)を超えた後にのみ送信されます。これにより書き込み性能が向上しますが、クライアントがクラッシュした場合にリクエストが失われる可能性があります。 -
送信前に、HBase は
メタデータテーブル.meta.内で rowkey に基づいてそれらが属する region server を見つけます。この位置決定プロセスはHConnectionのlocateRegionメソッドを使用して取得されます。バッチリクエストの場合、これらの rowkey はHRegionLocationに基づいてグループ化され、各グループは 1 回の RPC リクエストに対応します。 -
HBase は各 HRegionLocation のためにリモート RPC リクエスト
MultiServerCallable<Row>を構築し、rpcCallerFactory.<MultiResponse> newCaller()を通じて呼び出しを実行します。失敗した場合の再送信やエラー処理は無視され、クライアントの送信操作はここで終了します。
サーバーサイド書き込みプロセス#
サーバーサイドの Region Server はクライアントからの書き込みリクエストを受信すると、まずそれをPutオブジェクトにデシリアライズし、次にregionが読み取り専用かどうか、memstoreのサイズがblockingMemstoreSizeを超えているかなどのチェックを行い、次のコア操作を実行します:

-
行ロック、Region更新共有ロックの取得:HBase では行ロックを使用して同一行データの更新が排他的な操作であることを保証し、更新の原子性を確保します。更新は成功するか失敗するかのいずれかです。 -
書き込みトランザクションの開始:write number を取得し、MVCC を実現します。データの非ロック読み取りを実現し、読み書きの整合性を保証しながら読み取り性能を向上させます。 -
memstoreへの書き込み:HBase では各列族に対応する store があり、その列データを保存します。各 store には書き込みキャッシュ memstore があり、書き込まれたデータをキャッシュします。HBase はデータを直接ディスクに書き込むのではなく、まずキャッシュに書き込み、キャッシュが一定のサイズに達した後にまとめてディスクに書き込みます。 -
HLogの追加:HBase はWAL メカニズムを使用してデータの信頼性を保証します。つまり、まずログを書き込み、次にキャッシュに書き込みます。たとえクラッシュが発生しても、HLog を復元することで元のデータを復元できます。このステップではデータを WALEdit オブジェクトに構築し、順次 HLog に書き込みます。この時点では sync 操作を実行する必要はありません。0.98 バージョンでは新しい書き込みスレッドモデルを採用して HLog の書き込みを実現し、全体のデータ更新性能を大幅に向上させることができます。 -
行ロックおよび共有ロックの解放 -
HLogの同期:HLog が実際に HDFS に同期されます。行ロックを解放した後に sync 操作を実行するのは、ロック保持時間をできるだけ短縮し、書き込み性能を向上させるためです。Sync が失敗した場合、memstore に既に書き込まれたデータを削除するロールバック操作を実行します。 -
書き込みトランザクションの終了:この時点でスレッドの更新操作は他の読み取りリクエストに対して可視化され、更新が実際に有効になります。 -
memstoreのフラッシュ:書き込みキャッシュが 64M に達すると、フラッシュスレッドが起動し、データをハードディスクにフラッシュします。HBase の memstore データがディスクにフラッシュされると、storefile が形成されます。storefile の数が一定の程度に達すると、storefile ファイルに対してコンパクション操作を実行する必要があります。Compact の役割:ファイルの統合、期限切れや余分なバージョンデータの削除、読み書き効率の向上
WAL の永続化レベル#
SKIP_WAL: キャッシュのみを書き込み、HLog には書き込まない。メモリのみを使用するため、性能は非常に良いが、データが失われやすく、推奨されません。ASYNC_WAL: 非同期でデータを HLog に書き込みます。SYNC_WAL: 同期でデータをログファイルに書き込みます。注意が必要なのは、データはファイルシステムに書き込まれただけで、実際にはディスクに落ちていないことです。FSYNC_WAL: 同期でデータをログファイルに書き込み、強制的にディスクに落とします。最も厳格なログ書き込みレベルで、データが失われないことを保証できますが、性能は比較的低下します。USER_DEFALUT: ユーザーが永続化レベルを指定しない場合、HBase は SYNC_WAL レベルでデータを永続化します。
ユーザーはクライアントを通じて WAL の永続化レベルを設定できます。コード:put.setDurability(Durability. SYNC_WAL );
読み取りプロセス#
クライアントが HBase 上のデータを初めて読み書きするプロセス:
- クライアントは Zookeeper から
METAテーブルが存在する Region Server を取得します; - クライアントは
METAテーブルが存在する Region Server にアクセスし、METAテーブルからアクセス行キーが存在する Region Server を照会し、その後クライアントはこれらの情報とMETAテーブルの位置をキャッシュします; - クライアントは行キーが存在する Region Server からデータを取得します。
再度読み取る場合、クライアントはキャッシュから行キーが存在する Region Server を取得します。これにより、クライアントは再度METAテーブルを照会する必要がなくなります。ただし、Region が移動してキャッシュが無効になった場合は、再度照会してキャッシュを更新します。
注:METAテーブルは HBase 内の特別なテーブルで、すべての Region の位置情報を保存しています。META テーブル自身の位置情報は ZooKeeper に保存されています。

より詳細なデータ読み取りプロセスについては、以下を参照してください:
HBase のクエリ方法#
-
全表クエリ:
scan tableName -
rowkey に基づく単行クエリ:
get tableName,'1' -
rowkey に基づく範囲スキャン:
scan tableName, {STARTROW=>'1',STOPROW=>'2'}
setCache () と setBatch () メソッド
Cache はサーバーが一度に返す行数を設定し、Batch はサーバーが一度に返す列数を設定します。