HBase hbckについて その2

HBaseには`hbck`という、リージョンやテーブルの整合性や完全性をチェックしたり、壊れていたりした場合に修復するツールがあります。この記事では、そのhbckの使い方や仕組みを説明したいと思います。バージョンはHBase 1.1.2 (HDP 2.5) をベースにしています。

本記事は以下の記事の続きです。

HBase hbckについて その1
http://qiita.com/brfrn169/items/3c4c3c1b04c36db250f6

# 検出できる不整合とその直し方

検出できる不整合とその直し方をエラーメッセージ別に説明していきます。
[前回](http://qiita.com/brfrn169/items/3c4c3c1b04c36db250f6)は、「メタデータ、アサイン系のエラーメッセージ」のメッセージを説明しましたが、今回は残りの「HDFS上のファイル系のエラーメッセージ」と「ホール系のエラーメッセージ」、「オーバラップ系のエラーメッセージ」、「その他のエラーメッセージ」について説明していきます。

## HDFS上のファイル系のエラーメッセージ

ここからはHDFS上のファイル系の不整合です。

以下のオプションを使って不整合の修復を行います。

|オプション|説明|
|---|---|
|-fixVersionFile|消失しているHDFS上のバージョンファイル(hbase.version)の修復を行います|
|-fixTableOrphans|消失している.tableinfoファイルの修復を行います|
|-fixHdfsOrphans|消失している.regioninfoファイルの修復を行います|

以下、エラーメッセージとその修復方法になります。

### "Version file does not exist in root dir [root dir]"

バージョンファイルが設定されたルートディレクトリ上に無い。

このエラーは`-fixVersionFile`オプションを指定することで修復できます。このときhbckは、バージョンファイルを作成します。

### "Unable to read .tableinfo from [root dir]/[table name]"

テーブルのディレクトリ以下の.tableinfoファイルが読み込めない。

このエラーは`-fixTableOrphans`オプションを指定することで修復できます。このときhbckは、.tableinfoファイルを作ります。その時に、もしテーブルの情報がキャッシュ上に残っていればそれを元に作り、ない場合はデフォルト設定の.tableinfoファイルを作成します。

### "Orphan region in HDFS: Unable to load .regioninfo from table A in hdfs dir B! It may be an invalid format or version file. Treating as an orphaned regiondir."

テーブルA(HDFS上のパスはB)の.regioninfoが読み込めない。ファイルのフォーマットかバージョンファイルがおかしい可能性がある。

このエラーは`-fixHdfsOrphans`オプションを指定することで修復できます。これを修復するためにhbckは、新しいリージョンを作成し、そこに必要なデータを移動させ、実際のデータを参照することで開始キーと終了キーを決めます。このようにすると、ホールやオーバラップが発生しそうですが、それはこのあと説明するオプションで処理されます。

## ホール系のエラーメッセージ

ここからは、リージョンのホール系のエラーメッセージについて説明していきます。ホールとは、HDFS上でリージョン間で穴ができてしまい、担当するリージョンのいないキーレンジができてしまうことを言います。

以下のオプションを使って不整合の修復を行います。

|オプション|説明|
|---|---|
|-fixHdfsHoles|ホールの修復を行います。|

以下、エラーメッセージとその修復方法になります。

### "There is a hole in the region chain between A and B. You need to create a new .regioninfo and region dir in hdfs to plug the hole."

キーAとBの間でデータが存在しないホールがある。そのホールを埋めるために、新しいリージョンと.regioninfoファイルを作る必要がある。

このエラーは`-fixHdfsHoles`オプションを指定することで修復できます。このときhbckは、ホールとなっている範囲の新しいリージョンをHDFS上に作成します。

### "First region should start with an empty key. You need to create a new region and regioninfo in HDFS to plug the hole."

テーブルの最初のリージョンは空のキーから始まっていなければならないが、そうではない。そのホールを埋めるために、新しいリージョンと.regioninfoファイルを作る必要がある。

これはテーブルの最初のリージョンが欠落してしまっているというエラーです。このエラーは`-fixHdfsHoles`オプションを指定することで修復できます。このときhbckは、テーブルの最初のリージョンをHDFS上に作成します。

### "Last region should end with an empty key. You need to create a new region and regioninfo in HDFS to plug the hole."

テーブルの最後のリージョンは空のキーで終わっていなければならないが、そうではない。そのホールを埋めるために、新しいリージョンと.regioninfoファイルを作る必要がある。

これはテーブルの最後のリージョンが欠落してしまっているというエラーです。このエラーは`-fixHdfsHoles`オプションを指定することで修復できます。このときhbckは、テーブルの最後のリージョンをHDFS上に作成します。

## オーバラップ系のエラーメッセージ

ここからは、オーバラップ系のエラーメッセージについて説明していきます。オーバラップとは、HDFS上でリージョン間で担当するキーレンジが重複してしまうことを言います。

以下のオプションを使って不整合の修復を行います。

|オプション|説明|
|---|---|
|-fixHdfsOverlaps|オーバラップの修復を行います|

さらに以下のオプションを指定することができます。

|オプション|説明|
|---|---|
|-maxMerge|オーバラップがあった時に、マージする最大リージョン数。デフォルトで5|
|-sidelineBigOverlaps|-maxMergeオプションで指定した数を超えるオーバラップがあった時に、退避させるかどうか|
|-maxOverlapsToSideline|退避させるリージョンの最大数|
|-sidelineDir|退避させる先のディレクトリ|

以下、エラーメッセージとその修復方法になります。

### "There is an overlap in the region chain."

キーの範囲がオーバーラップしてしまっているリージョンがある。

このエラーは`-fixHdfsOverlaps`オプションを指定することで修復できます。このときhbckは、オーバラップしているリージョンの数が-maxMergeオプションで指定した数より少なければそれらのリージョンをマージします。-maxMergeオプションで指定した数より多かった場合で-sidelineBigOverlapsを指定した場合は、オーバラップしているリージョンの一部を退避(sideline)します。

### "The endkey for this region comes before the startkey, startkey=A, endkey=B"

リージョンの終了キーが開始キーより前になってしまっている。

直し方は、上記の"There is an overlap in the region chain."の場合と同じです。

### "Region has the same start and end key."

リージョンの開始キーと終了キーが同じになっている。

直し方は、上記の"There is an overlap in the region chain."の場合と同じです。

### "Multiple regions have the same startkey: A"

複数のリージョンが同じAというキーで始まっている。

直し方は、上記の"There is an overlap in the region chain."の場合と同じです。

## その他のエラーメッセージ

ここからはそれ以外のエラーメッセージを説明していきます。

### "Found lingering reference file [path]"

なかなか消えないreference fileがある。

必要のないsplit parentへの参照ファイルが残っているということです。`-fixReferenceFiles`オプションを指定することで修復できます。このときhbckは、-sidelineDirオプションで指定したディレクトリに参照ファイルを移動させます。

### "Table lock acquire attempt found:[tableName=A, lockOwner=B, threadId=C, purpose=D, isShared=E, createTime=F]"

テーブルのロック取得が検出された。

HBaseでは、管理系のオペレーションをするときに同時に同じテーブルに対して複数のオペレーションを行わないようにロックをかけます。このロックが検出されたというエラーになります。このエラーは`-fixTableLocks`オプションを指定することで、長時間(hbase.table.lock.expire.msで指定。デフォルト10分)取得されているロックを強制的に解放することができます。

### "Table A not found in hbase:meta. Orphaned table ZNode found."

テーブルAはhbase:meta上にはないが、Zookeeper上で存在する。

HBaseではZookeeper上にテーブルの情報を持っています。このエラーはZookeeper上にはそのテーブルが存在しているのにhbase:metaには存在しない場合に起こります。このエラーは`-fixOrphanedTableZnodes`オプションを指定することで修復できます。このときhbckは、hbase:metaには存在しないテーブルをZookeeper上で無効にの状態にします。

# まとめ

今回は「HDFS上のファイル系のエラーメッセージ」と「ホール系のエラーメッセージ」、「オーバラップ系のエラーメッセージ」、「その他のエラーメッセージ」について説明しました。次回はここまで説明していないオプションについて説明していきたいと思います。