2014年07月31日

hive0.13でstored as textfileで作ったテーブルでjoinすると起こることがあるバグ

hive0.13を使っている際にNullPointerExceptionが起きて落ちる現象が発生する。

at org.apache.hadoop.hive.ql.io.HiveInputFormat.init(HiveInputFormat.java:255)
at org.apache.hadoop.hive.ql.io.HiveInputFormat.getSplits(HiveInputFormat.java:300)
at org.apache.hadoop.hive.ql.io.CombineHiveInputFormat.getSplits(CombineHiveInputFormat.java:371)

落ちるタイミングはMapperが走る前の段階。

特定のテーブルでのみ発生し、同じクエリでも落ちたり落ちなかったりする。読み込むpartitionの数を増やすと落ちる確率が増える。たまにエラーメッセージが変わることもある。

探してみた所、原因はおそらくこれらしい。パッチも出ていて0.14でfixするそうだ。

http://comments.gmane.org/gmane.comp.java.hadoop.hive.user/12370
https://issues.apache.org/jira/browse/HIVE-7011

バグの内容はinputFormatをキャッシュとして持つstaticなHashMapに同時操作が発生した場合にnullが返ったりする。

sequencefileとかorcなどのファイル形式では起こらない(おそらく既にキャッシュされている為、mapにputしにいくことがないのだろう)。textfileのテーブルに対して2つのselectを行いその結果をjoinするようなクエリを実行すると、同時に2つのjobが立ち上がって件のHashMapに同時に操作が走って落ちているっぽく見える。

もちろん内容からして他のケースでも偶然バッティングすれば起こることはあるのだろうけど、put自体が起こるケースがレアなのでほとんど起こらない。ググっても当該バグの情報はかなり少ない。

7/31修正

こっちらしい。

https://issues.apache.org/jira/browse/HIVE-7210

現象自体はやはりHashMapの情報を書き換えるあたりで、内容を見る限り他のファイル形式でも起きそうなように見えるのだけど、事象が起きたのと同じテーブルをstored as sequencefileで作成してクエリを投げてみても再現できなかった。タイミングがシビアなので処理時間のズレでうまく抜けてしまっているだけかもしれない。