HBaseのテーブルがenableでもなくdisableでもなくなった場合の対応方法

どうもこんばんはwyukawaです。

最近HBaseのテーブルがenableでもなくdisableでもなくまたdropもできないという状態になり、詰んだアカウントがこちらになります。

再現性はたぶん無くて該当のJIRAはたぶんこれ。未解決ですね、はい。
https://issues.apache.org/jira/browse/HBASE-6469

解決策はHMasterの再起動(hbase-daemon.sh restart master)です。
再起動したらenableかdisableのどっちかになります。
1回やってうまくいかなかったら、はりきって再起動しましょう。ここがポイントです、キリ。
僕は最初の再起動ではうまくいきませんでしが、はりきってなかったからですね、たぶん。


2012/11/23追記

http://comments.gmane.org/gmane.comp.java.hadoop.hbase.user/25974
を見てふと思い出したけどHMasterの再起動でうまくいかなかったときはhbase hbckでINCONSISTENTでした。hbase hbck -fixしてCONSISTENTな状態にしてからHMasterを再起動したらうまくいったのではりきって再起動する必要は無いかもw


どんな感じでなったかというとこんなかんじ。

hbase(main):003:0> create 'table1', 'rowkey1'
hbase(main):005:0> disable 'table1'
hbase(main):007:0> alter 'table1', METHOD => 'table_att', DEFERRED_LOG_FLUSH => 'true'
hbase(main):011:0> enable 'table1' //ここでエラー

でこんな感じのデッドロック状態になりましたとさ。あ、いい忘れたけどHBaseのバージョンは0.94.2です。コミュニティ版です。

hbase(main):009:0> is_enabled 'table1'
false
hbase(main):006:0> is_disabled 'table1'
false

某氏から「zookeeper の /hbase/table の下をチェックしてください」とのお告げがあったのでよくわからないながらに見てみました。

zkCli.sh -server ${hbase.zookeeper.quorum}:${hbase.zookeeper.property.clientPort} 

して

get ${zookeeper.znode.parent}/table/テーブル名

したら〜ENABLINGとかなんとか出てたんでなんか不整合な状態になったんだと思います。たぶん。


そもそもは DEFERRED_LOG_FLUSH => 'true' なテーブルを作りたかったわけです。

これはcreate時にはできないのでalterする必要がありそのためにはdisable, enableが必要でなぜかうまくenableできなかったというわけです。

DEFERRED_LOG_FLUSHというのは馬本用語でいうと遅延ログフラッシュです。

下記に記述があります。

  • 5.1.2 テーブルの属性
  • 8.3.5 LogSyncerクラス

デフォルトはfalseでコミットログをファイルシステムに同期的に書き込んで耐障害性を高めるというものです。
trueにすればファイルシステムに非同期に書き込むので耐障害性の低下と引き換えにレイテンシを低くすることができます。

Java APIでいうとHTableDescriptor#setDeferredLogFlushで指定できます。

いじょ