HBaseFsck(hbase hbck)について(1) - 概要 (Cloudera cdh3u3の場合)


研究開発Gの久保です。

Hadoopの関連プロジェクトに、HBaseがあります。
HBaseはHadoopの基盤の上に構築されたスケーラブルな分散データベースです。

さて、HBaseを動かしていると、時々HBaseのデータ整合性がおかしくなることがあります。
整合性がおかしくなると、データをscanしようとしてもエラーになってデータが取得できなくなったりします。

そういうときにHBaseFsck(hbase hbck (-fix)コマンド)を使って整合性をチェックしたり、直したりする・・・らしいのですが、このツールのことが今ひとつわかりません。
不整合がある場合には

1799 inconsistencies detected.
Status: INCONSISTENT

という風に表示されますが、修復のため-fixオプションを使っても全くinconsistencyの数が減らないこともありますし、減ることもあります。

というわけで、挙動がよく分からないので、今回実際にソースコードを読むことでHBaseFsckの挙動について調べてみることにしました。

対象バージョン

今回はCloudera CDH3 Update3 (Cloudera's Distribution including Apache Hadoop)で確認しました。
HBaseFsckは現在も進化しているようで、CDH3 Update4にはCDH3 Update3には存在しないオプションが沢山あります。
リリースノートにも

The HBase repair tool, hbck, has been significantly enhanced with new options for repairing new inconsistency classes that include region overlaps, region holes, and orphaned regions.

とあります。
これで-fixしてもinconsistencyが減らない問題はなんとかなるかも!!ということで、後日確認してみます。

HBaseFsck(hbck)概要

HBaseFsckはregionの一貫性や完全性をチェックし、破損箇所の修復を行うためのツールです。
これはコマンドラインツールとして提供されており、HBaseをインストールすれば使えるようになります。

使い方

HBaseのinstallされた環境で
hbase hbck --help
と入力すると「Unknown command line option : --help」と言われ、下記usageが表示されます。
(不思議なことに、直接usageを表示するオプションは無いようです。)


Usage: fsck [opts] 
 where [opts] are:
   -details Display full report of all regions.
   -timelag {timeInSeconds}  Process only regions that  have not experienced any metadata updates in the last  {{timeInSeconds} seconds.
   -fix Try to fix some of the errors.
   -sleepBeforeRerun {timeInSeconds} Sleep this many seconds before checking if the fix worked if run with -fix
   -summary Print only summary of the tables and status.

基本的な使い方としては、
hbase hbck
として実行します。
-summaryおよび-detailsを指定すれば、出力情報の詳細さを変更できます。
また問題が確認できた場合には-fixオプションにより修復します。

hbase hbckコマンドは何をしているのか?

見るべきクラスは org.apache.hadoop.hbase.util.HBaseFsck です。
これは全体で1700行程度です。
おおまかに言って以下のような動作をしています。

  1. HBaseの.META.テーブルと、HBaseの実データが置かれたHDFSから、regionに関する情報(テーブルの構造、Deployされているregion serverの情報など)を取得する。
  2. checkConsistencyメソッドにより、データの一貫性をチェックする。具体的には、.META.テーブルとHDFSのHBaseデータ、および実際にDeployされているサーバ情報の整合性を調べる。また-fixオプションが付いている場合でかつ直せそうなケースでは整合性を修復する。
  3. checkIntegrityメソッドにより、(2)で問題が発生していない一貫性のとれているテーブルについて、region chain をたどることでRow Keyの「holes, overlaps, and cycles」、つまりrow keyに穴がないか、重複や繰り返しが発生してないかどうか調べる。

要するに、例えば以下のような状況の場合にinconsistencyになるということです。

  1. .META.テーブルにはregion情報があるのに、実際のHDFSのデータとしては存在しない
  2. HDFSには存在してるregion情報が、.META.テーブルには存在しない

.META.テーブルの情報を見てみる

.META.テーブルは、HBase上で通常のテーブルと同様に見ることができます。
具体的にはhbase shellから次のようにします。

hbase(main):005:0 > scan '.META.'
table-hoge,,1323061410347.1be2a9269d0caed631060c5bfcc3a705.  column=info:regioninfo, timestamp=1323061411461, value=REGION => {NAME => 'table-hoge,,1323061410347.1be2a9269d0caed631060c5bfcc3a705.', STARTKEY => '', ENDKEY => '', ENCODED => 1be2a9269d0caed631060c5bfcc3a705, TABLE => {{NAME => 'table-hoge', FAMILIES => [{NAME => 'cloud', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', COMPRESSION => 'SNAPPY', VERSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}, {NAME => 'freq', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '0', COMPRESSION => 'SNAPPY', VERSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}]}}
table-hoge,,1323061410347.1be2a9269d0caed631060c5bfcc3a705.   column=info:server, timestamp=1338102928799, value=hadoop-slave01:60020
table-hoge,,1323061410347.1be2a9269d0caed631060c5bfcc3a705.   column=info:serverstartcode, timestamp=1338102928799, value=1338102712115

ここで表示される内容は、HMasterの管理画面(xxx.xxx.xxx.xxx:60010)から見られる内容と近く、

  • regionの情報
  • tableの情報
  • regionをdeployしているserverの情報

などが分かります。

HDFSのHBaseデータを見てみる

hadoop dfsコマンドを使うと、HDFS上のHBaseデータが確認できます。
hbase-site.xmlのhbase.rootdirで指定したパスを確認します。

> hadoop dfs -ls hdfs://hadoop01:54310/hbase/
drwxr-xr-x   - hbase supergroup          0 2012-02-27 18:31 /hbase/.META.
drwxr-xr-x   - hbase supergroup          0 2012-02-27 18:31 /hbase/-ROOT-
drwxr-xr-x   - hbase supergroup          0 2012-03-05 14:03 /hbase/table-hoge

一覧に出てくるのはテーブルごとのディレクトリです。
さらに一つテーブルを指定して、中身を確認します。

> hadoop dfs -ls hdfs://hadoop01:54310/hbase/
drwxr-xr-x   - hbase supergroup          0 2011-12-05 14:03 /hbase/table-hoge/1be2a9269d0caed631060c5bfcc3a705

これでHDFS上で、テーブルを構成するregionファイルを確認できました。

ここまでで分かっていないこと

今回ソースコードを読むことで大まかな動作は分かりましたが、以下の点がよくわかっていません。

  • cdh3u4ではどのようにhbckが強化されたのか
  • checkConsistencyでは、詳細にはどういう一貫性チェックを行なっているのか?
  • hbase hbck -fixコマンドで何を直せるのか?
  • hbase hbck -fixコマンドでも不整合を直せなかった場合、どうすればいいのか?(よりよい復旧方法があるのか?)
  • そもそもどういう場合に不整合が起こるのか?
  • 書き込みの処理フローはどうなっているのか?

今回はここまでということで、次回以降上記について調べてきたいと思います。

関連情報


This entry was posted in 技術 and tagged , , , , , . Bookmark the permalink.