HBaseのデータ書き込みフロー

馬本をつらつら読んだのでデータ書き込みのあたりについてメモがてら書いてみる。

HBaseはLog-Structured Merge-tree (LSM-tree)という技術を使ってデータの読み書きを行います。

LSM-treeはMemtable, SS Table, Commit Logという3つの記憶領域を使います。

Memtableはメモリ上の領域でHBase用語でいうとMemStoreになります。
SS Tableはディスク上の領域でHBase用語でいうとHFileになります。
Commit Logはディスク上の領域でHBase用語でいうとHLogになります。WAL(Write Ahead Log, 先攻先行書き込みログ)ですね。

HBaseでデータを書き込むとMemstoreとHLogに書き込まれます。
Memstoreが一定量に達するとHFileに書き込まれます。HFileは一度作成されると更新されません。HFileは何世代も作成されることになります。差分が積み重なるイメージです。この辺SubversionとかMercurialと似てるかも。複数のHFileをまとめることをコンパクションといいます。


リージョンサーバーがクラッシュするなどでMemStoreが消えた場合はHLogから復旧します。
HLogが無いとデータロストにつながります。
HLogの実態はSequence FileでHDFSに書き込まれます。レプリカ数分だけ、つまり通常3台のDataNodeに同期的に書き込みます。
この場合一番遅い書き込みに引っ張られます。つまり1台のDataNodeの性能劣化が複数のサーバーに波及する可能性があります。これはCAP定理のCを重視するHBaseのような分散DBでは避ける事が難しいようです。


追記
コメントにあるようにこのためにバルクロードでWALを切ったりすることもあるようです。


またこの同期的に書き込む部分(durable syncというようですが)は以前はHadoopのappendブランチを使わなければ動かなかったようですが、[HADOOP-8230] Enable sync by default and disable append - ASF JIRAでその依存性は切り離されたようです。

なおCDHでは3u4にHADOOP-8230が入っています。