pandazx's blog

Hadoop, データ分析など雑多な技術ブログ

HBaseへのbulkload時のデータフロー設計

HBaseにbulkloadする際にMapReduceでHFileを作成しますが、その際にデータフローをちゃんと考えておく必要があります。

HBaseのスキーマ定義によるが、1つのCellにたくさんのデータを詰める場合、
何も考えないとMapでグルーピングしてReduceで処理する必要があります。

この場合、shuffleでたくさんのデータが流れてしまうので時間がかかります。

無駄を省くために連続したMapReduceの流れを設計しておく必要があります。

生データ -> HDFS -> 任意の単位にグルーピング圧縮(GZ) -> HFile作成 -> bulk load

なぜ、GZ圧縮かというと、GZはファイルの途中で分割されないから。

GZはデータが分割されないのでMapReduceに不向きである。通常はSnappyを使うと思います。

しかし、意図した単位でデータをグルーピングし、その単位で次のMapの入力としたい場合がある。この場合、分割されないGZが使えます。

ここで述べたように、HFile作成のためだけに、GZ圧縮のグルーピングを行うのは無駄だが、それは必要とされるデータ処理全体で最適化を行えばいいです。

補足

同じデータを別形式にする場合があるので、Hadoopのディスク容量はレプリカ3つで想定の元データ量の3倍に加えて、余裕を係数をさらにかける必要があります。

一時的に別形式でデータを持つ場合はディスク容量節約のために、そのデータだけレプリカを一つにした方がいいかもしれません。

また、MapReduceは処理中の一時ファイルサイズも無視できないものがあります。

大きなデータを処理したあげくにディスク満杯でエラーは泣けてくるので、ディスクはできるだけ積んでおくことをオススメします。