7

HBase がリージョンサーバー間でテーブルを分割する方法を教えてください。

たとえば、行キーが 0 ~ 10M の整数で、10 個のリージョン サーバーがあるとします。
これは、最初の regionserver が値 0 - 10M、2 番目の 1M - 2M、3 番目の 2M-3M 、... 10 番目の 9M - 10M のキーを持つすべての行を格納することを意味しますか?

行キーをタイムスタンプにしたいのですが、ほとんどのクエリが最新の日付に適用され、すべてのクエリが 1 つのリージョン サーバーによってのみ処理される場合、それは本当ですか?

それとも、このデータは別の方法で拡散されるのでしょうか?
または、リージョンサーバーよりも多くのリージョンを作成することもできます。そのため、(与えられた例によれば) サーバー 1 は 0 - 0,5M と 3M - 3,5M のキーを持ち、この方法で私のデータはより均等に分散されます。可能?


アップデート

オプション があることがわかりましたhbase.hregion.max.filesize。これで問題が解決すると思いますか?

4

2 に答える 2

8

WRT パーティショニングについては、HBase のアーキテクチャに関する Lars のブログ記事や、HBase が「複製」する Google の Bigtable に関する論文を読むことができます。

行キーがタイムスタンプのみの場合、はい、最大のキーを持つリージョンが常に新しいリクエストでヒットします (リージョンは単一のリージョン サーバーによってのみ処理されるため)。

短いスキャンを行うためにタイムスタンプを使用しますか? その場合は、鍵のソルト化を検討してください (Google で Mozilla が Sorocco でどのようにソルト化したかを検索してください)。

タイムスタンプの前に任意の ID を付けることはできますか? たとえば、特定のユーザーのデータのみを要求する場合、ts の前にそのユーザー ID を付けると、負荷分散が大幅に改善されます。

そうでない場合は、キーをランダムに配布する UUID またはその他のものを使用します。

hbase.hregion.maxfilesize

そのテーブルに maxfilesize を設定しても (シェルで実行できます)、各領域が正確に X MB (X は設定した値) の大きさになるわけではありません。したがって、行キーがすべてタイムスタンプであるとしましょう。つまり、新しい行キーはそれぞれ前のものよりも大きくなります。これは、空の終了キー (最後のキー) を持つリージョンに常に挿入されることを意味します。ある時点で、ファイルの 1 つが (圧縮によって) maxfilesize よりも大きくなり、その領域が中央で分割されます。低いキーは独自のリージョンにあり、高いキーは別のリージョンにあります。ただし、新しい行キーは常に前のものよりも大きいため、これは、その新しいリージョン (など) にのみ書き込むことを意味します。

tl;dr 1,000 を超えるリージョンがある場合でも、このスキーマでは、最大の行キーを持つリージョンが常に書き込みを取得します。つまり、ホスティング リージョン サーバーがボトルネックになることを意味します。

于 2010-08-05T16:24:25.700 に答える
0

hbase.hregion.max.filesizeデフォルトで256MBのオプションは、この制限領域に達した後、最大領域サイズを設定します。これは、私のデータが256MBの複数の領域に保存され、場合によっては1つ小さい領域に保存されることを意味します。
それで

行キーをタイムスタンプにしたいのですが、ほとんどのクエリが最新の日付に適用され、すべてのクエリが1つのリージョンサーバーによってのみ処理される場合があります。本当ですか?

最新のデータもサイズ256MBのリージョンに分割され、異なるリージョンサーバーに保存されるため、これは当てはまりません。

于 2010-08-05T20:04:11.607 に答える