ブログトップ 記事一覧 ログイン 無料ブログ開設

wyukawa’s blog

2012-07-29

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をまとめることをコンパクションといいます。

f:id:wyukawa:20120729233840p:image


リージョンサーバーがクラッシュするなどで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が入っています。

shiumachishiumachi 2012/07/30 00:21 > この場合一番遅い書き込みに引っ張られます。つまり1台のDataNodeの性能劣化が複数のサーバーに波及する可能性があります。これはCAP定理のCを重視するHBaseのような分散DBでは避ける事が難しいようです。
だからバルクロードとかするときにはWALを切ったりします。11章参照。
ちなみに11章該当箇所のメソッド名が間違ってますのでご注意ください。writeToWAL() ではなく setWriteToWAL()。

shiumachishiumachi 2012/07/30 00:22 あと、
s/先攻書き込みログ/先行書き込みログ/
です

wyukawawyukawa 2012/07/30 00:43 コメントありがとうございます!

>だからバルクロードとかするときにはWALを切ったりします。11章参照。

なるほどー

>ちなみに11章該当箇所のメソッド名が間違ってますのでご注意ください。writeToWAL() ではなく setWriteToWAL()。

あ、ほんとだw

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元