Skip to content
Published on

HBaseテーブルのpresplit方法

Authors
  • Name
    Twitter

Overview

HBaseは分散処理のために、1つのテーブルをregionという単位で複数に分割して保存・管理します。 1つのRegionから始まり、リージョンのサイズが大きくなるにつれて、大きなリージョンは自動的にSplitされ、2つのregionに分割されます。 しかし、このsplit処理には大きなコストがかかります。 そのため、初期データが多いと判断される場合は、テーブル作成時にリージョンを事前に分割しておくことで、クラスタへの負荷を軽減できます。

では、どのような基準でテーブルをsplitすればよいのでしょうか?おそらく正解はrow-keyの設計によって異なるでしょう。 rowkeyの範囲が1xxxxxxから9xxxxxxであることが事前にわかっている場合、prefixが1から9のregionに事前分割するのが良いでしょう。

一般的な状況でよく使われるrowkeyパターンにも汎用的に使える3つの方法を紹介します。

PreSplit方法

  1. HexStringSplit

以下のように、テーブル作成時にsplitアルゴリズムとしてHexStringSplitを選択すると、HexString[1-9a-z]を基準にregionをsplitして生成します。

HexStringSplit
create 'user-table', 'cf', {NUMREGIONS =>10, SPLITALGO => 'HexStringSplit'}
hex_string_algo
  1. UniformSplit

UniformSplitオプションも存在します。テーブルをrandom bytes keysで分割する方式で、regionは以下のように生成されます。

UniformSplit
create 'user-table2', 'cf', {NUMREGIONS =>10, SPLITALGO => 'UniformSplit'}
uniform_string_algo
  1. Custom Split

HBaseがデフォルトで提供するsplitアルゴリズムの代わりに、split関数を設定してリージョンを事前分割することも可能です。 例えば、データがすべてuser#xxxxというrowkeyを持っており、user#というprefixを先頭に付ける必要がある場合、hbase shellで以下のようにテーブルを作成できます。

custom_split
n_splits = 10
create 'usertable', 'family', {SPLITS => (1..n_splits).map {|i| "user#{1000+i*(9999-1000)/n_splits}"}}

Reference

以上、HBase Tableをpresplitする3つの方法についての投稿を終わります。