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は処理中の一時ファイルサイズも無視できないものがあります。
大きなデータを処理したあげくにディスク満杯でエラーは泣けてくるので、ディスクはできるだけ積んでおくことをオススメします。