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 はサーバーが一度に返す列数を設定します。