HiveとHBaseの連携は難しい

Hive 0.11.0にバージョンアップしてmultiple insertに関わるバグである[HIVE-3699] Multiple insert overwrite into multiple tables query stores same results in all tables - ASF JIRAを心配しなくて良くなったけど代わりにネストしたgroup byに関わるバグである[HIVE-5237] Incorrect group-by aggregation in 0.11.0 - ASF JIRAを踏んだwyukawaです、こんにちは。ユニークユーザとか求める時にネストしたgroup byが出てくる可能性はあるのですがcount(distinct ...)とか使って回避しました。


で、今回書くのはそういう話じゃなくてHiveとHBaseとの連携に関してです。結論から言うと結構難しいです。少なくとも僕にとっては難しくて周りにHiveとHBaseのエキスパートがいるからなんとか運用がまわっているのが実態です。

Hiveだけならまだ良いのですがHBaseもあるとなかなか大変です。HBaseはリアルタイム検索に強いしHiveはバッチ集計にはもってこいだし、この2つを連携して使えば鬼に金棒だぜ!そう根拠もなく思っていた時期が僕にはありました。

HiveとHBaseとの連携は以前こちらに書きました。
HBaseのデータをHiveからselectする - wyukawa’s blog

僕の環境ではHBaseのテーブルをHiveから見えるように外部テーブルを作成して使っています。

それはいいんですが、そのまんまだと性能が出ないし、バージョンの組み合わせによってはエラーが出たり、Hiveのオプションを変えないとエラーが出たり、、、となかなか厳しいものがあります。

性能面に関してはこの辺のパッチを当てると良いと思います。

あとクエリによってはreduce数を増やしたりとかもしてます。

厄介なのがHBaseのテーブルをHiveからアクセスするmapreduce jobで処理がなかなか終わらずtaskのsyslogで下記のようになっているケースです。map数がregion数になるのですが、mapで時間かかっているケースです。

INFO org.apache.hadoop.ipc.HBaseRPC: Problem connecting to server: ...

この場合HBaseのregionserverのログを見るとなんかエラーが出ていると思いますので見て対応する必要があります。

まあ問題が無くともHiveからHBaseにアクセスするとHBaseの負荷も高まりますのでアクセスするのは最小限にした方が無難そうです。
最初にHBaseからHiveにデータを持ってきて後はHiveの世界で閉じるようにするとか。
isolation重要です。

HiveのHBase Storage Handler周りはおそらくまだexperimentalな状況で上記2つのパッチが取り込まれているHive 0.13頃には安定して使えるようになっているのかなあと想像しています。

ただしHBaseのtimestampにアクセスできるようになるかどうかは不明ですが。

バージョンの組み合わせに関しては下記のJIRAがあります。Hive 0.11.0+HBase 0.94.11/12だと大丈夫な感じです。

Hiveのオプション周りではhive.auto.convert.join.noconditionaltaskをfalseにしてます。
あとhive.auto.convert.joinもfalseにしてます。これは多分HBase関係ないと思いますけど。

この自動mapjoinのオプション自体は前からあったんですがHive 0.11.0からdefault trueになりましたね。

詳細はこの辺読むと良い気がします。

まあそんな感じです。