この投稿は元々blogs.apache.org経由で公開されていましたが、便宜上、少し変更した形式でここに再公開しています:
一見すると、Apache HBaseアーキテクチャは、マスターがすべての要求を受信するマスター/スレーブモデルに従っているように見えますが、実際の作業はスレーブによって行われます。これは実際には当てはまりません。この記事では、マスターとスレーブによって実際に処理されるタスクについて説明します。
リージョンとリージョンサーバー
HBaseは、HDFS上で低レイテンシのランダムな読み取りと書き込みを提供するHadoopストレージマネージャーであり、ペタバイトのデータを処理できます。 HBaseの興味深い機能の1つは自動シャーディングです。これは、テーブルが大きくなりすぎると、システムによって動的に分散されることを意味します。
HBaseの水平スケーラビリティの基本単位は、 Regionと呼ばれます。 。リージョンはテーブルのデータのサブセットであり、基本的には連続して並べ替えられた行の範囲であり、一緒に保存されます。
最初は、テーブルの領域は1つだけです。以下に示すように、行を追加した後に領域が大きくなりすぎると、領域は中央のキーで2つに分割され、2つのほぼ等しい半分が作成されます。
HBaseでは、スレーブはリージョンサーバーと呼ばれます。 。各リージョンサーバーは一連のリージョンを提供する責任があり、1つのリージョン(つまり、行の範囲)は1つのリージョンサーバーによってのみ提供されます。
HBaseアーキテクチャには、2つの主要なサービスがあります。 HMaster これは、クラスターの調整と管理操作の実行を担当し、 HRegionServer テーブルのデータのサブセットを処理する責任があります。
HMaster、リージョンの割り当て、およびバランシング
前述のように、HBaseマスターはHBaseクラスターを調整し、管理操作を担当します。
リージョンサーバーは、1つ以上のリージョンにサービスを提供できます。各リージョンは起動時にリージョンサーバーに割り当てられ、マスターは負荷分散操作の結果としてリージョンをあるリージョンサーバーから別のリージョンサーバーに移動することを決定できます。マスターは、リージョンを別のリージョンサーバーに割り当てることで、リージョンサーバーの障害も処理します。
リージョンとリージョンサーバーのマッピングは、METAと呼ばれるシステムテーブルに保持されます。 METAを読むことで、どの地域がキーを担当しているかを特定できます。これは、読み取りおよび書き込み操作の場合、マスターはまったく関与せず、クライアントは要求されたデータの提供を担当するリージョンサーバーに直接アクセスできることを意味します。
行キーの検索:どのリージョンサーバーが責任を負いますか?
行を配置または取得するために、クライアントはマスターに接続する必要はありません。クライアントは、指定された行を処理するリージョンサーバーに直接接続できます。または、クライアントスキャンの場合は、セットの処理を担当するリージョンサーバーのセットに直接接続できます。キーの数:
リージョンサーバーを識別するために、クライアントはMETAテーブルに対してクエリを実行します。
METAは、地域を追跡するために使用されるシステムテーブルです。これには、サーバー名と、テーブル名と開始行キーで構成されるリージョンIDが含まれています。スタートキーと次のリージョンを確認することで、スタートキークライアントは特定のリージョンに含まれる行の範囲を特定できます。
クライアントは、リージョンの場所のキャッシュを保持します。これにより、同じリージョンで操作が発行されるたびにクライアントがMETAテーブルにヒットすることを回避できます。リージョンが分割されたり、別のリージョンサーバーに移動したりした場合(バランシングまたは割り当てポリシーのため)、クライアントは応答として例外を受け取り、METAテーブルから更新された情報をフェッチすることでキャッシュが更新されます。
METAは他のテーブルと同様にテーブルであるため、クライアントはMETAが配置されているサーバーを識別する必要があります。 METAの場所は、マスターによる割り当て時にZooKeeperノードに保存され、クライアントはノードを直接読み取って、METAを含むリージョンサーバーのアドレスを取得します。
HBaseの元の設計はBigTableに基づいており、METAの場所とそれを指すApacheZooKeeperを含む-ROOT-という別のテーブルがあります。 HBase 0.96は、METAを分割できないため、単一のリージョンで構成されているため、ZooKeeperのみを優先してその配置を削除しました。
クライアントAPI:マスターとリージョンの責任
HBase JavaクライアントAPIには、2つの主要なインターフェースがあります。
- HBaseAdmin テーブルを作成/削除/変更することで「テーブルスキーマ」とのやり取りを可能にし、リージョンの割り当て/割り当て解除、リージョンのマージ、フラッシュの呼び出しなどでクラスターとのやり取りを可能にします。このインターフェースはマスターと通信します。
- HTable クライアントがget、put、delete、およびその他すべてのデータ操作を使用して、指定されたテーブルのデータを操作できるようにします。このインターフェースは、要求されたキーのセットの処理を担当するリージョンサーバーと直接通信します。
これらの2つのインターフェースには、別々の責任があります。HBaseAdminは、管理操作の実行とマスターとの通信にのみ使用され、HTableは、データの操作とリージョンとの通信に使用されます。
結論
ここで見てきたように、マスター/スレーブアーキテクチャがあるからといって、各操作がマスターを通過するわけではありません。実際、HBaseクライアントは、データの読み取りと書き込みを行うために、すべてのデータ操作(HTable)の行キーの処理を担当する特定のRegionServerに直接アクセスします。マスターは、テーブルの作成、変更、および削除操作(HBaseAdmin)のためにのみクライアントによって使用されます。
マスターの概念は存在しますが、HBaseクライアントはデータ操作をマスターに依存せず、マスターがダウンしてもクラスターはデータを提供し続けることができます。
Matteo Bertozziは、プラットフォームチームのソフトウェアエンジニアであり、HBaseコミッターです。
HBaseに興味がある場合は、必ず HBaseCon 2013(6月13日、サンフランシスコ)– HBaseの寄稿者、開発者、管理者、およびユーザー向けのコミュニティイベントに登録してください。スペースに限りがあります!