hiveのジョブをsubmitできずにそのままhiveクライアントプロセスが残り続ける現象について
再現性は無いんですけどHiveServer経由でhiveのジョブをsubmitしようとしてもできずにそのままhiveクライアントプロセスが残り続けるという現象に遭遇しました。
submitされてないのでMapReduceも進まないという状況です。ジョブが失敗している訳ではないのでazkabanのretryも効かず延々実行中でした。
こういうのは検知が遅れるのでちょっと困るんですよね。
環境はHadoop 1.2.1 + Hive 0.12 + Oracle JDK 1.7_40です。
何回か遭遇しててその度に該当のJavaプロセスをkillしてretryしていました。ログに何もでないので詳細がよく分からなかったんですよね。
で、最近この問題に遭遇してふと思い立って該当のhiveプロセスをjstackするとこんなんが出てました。
java.lang.Thread.State: RUNNABLE at java.util.WeakHashMap.get(WeakHashMap.java:471) at com.sun.beans.WeakCache.get(WeakCache.java:55) at com.sun.beans.finder.MethodFinder.findMethod(MethodFinder.java:68) at java.beans.Statement.getMethod(Statement.java:357) at java.beans.Statement.invokeInternal(Statement.java:287) at java.beans.Statement.access$000(Statement.java:58) at java.beans.Statement$2.run(Statement.java:185) ... at java.beans.XMLEncoder.writeObject(XMLEncoder.java:330) at org.apache.hadoop.hive.ql.exec.Utilities.serializeObject(Utilities.java:666) at org.apache.hadoop.hive.ql.exec.Utilities.serializePlan(Utilities.java:610) at org.apache.hadoop.hive.ql.exec.Utilities.setBaseWork(Utilities.java:495) at org.apache.hadoop.hive.ql.exec.Utilities.setReduceWork(Utilities.java:483) at org.apache.hadoop.hive.ql.exec.Utilities.setMapRedWork(Utilities.java:474) at org.apache.hadoop.hive.ql.exec.mr.ExecDriver.execute(ExecDriver.java:383) at org.apache.hadoop.hive.ql.exec.mr.MapRedTask.execute(MapRedTask.java:144) at org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:151) at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:65) at org.apache.hadoop.hive.ql.exec.TaskRunner.run(TaskRunner.java:55)
- [HIVE-4574] XMLEncoder thread safety issues in openjdk7 causes HiveServer2 to be stuck - ASF JIRA
- [JDK-8028054] com.sun.beans.finder.MethodFinder has unsynchronized access to a static Map - Java Bug System
JIRAを読んで僕が理解した限りだと、OpenJDKのバグです。
スレッドセーフでないWeakHashMapがあってそのラッパーであるWeakCacheにMethodFinderがマルチスレッドでアクセスして、循環参照が起きて無限ループになるみたいな感じっぽいです。
で、僕が使っているのはOpenJDKではなくOracle JDKなのですが、同じなのかなと勝手に想像してます。
7u60で直るみたいなことあいてあるんですけど、Oracle JDKだと最新は7u55だし、なんか要するに[HIVE-5411] Migrate expression serialization to Kryo - ASF JIRAが適用されれば直るようです。まあそれって、要するにHive 0.13にバージョンアップするってことなわけで、バージョンアップはしてみました。その後数日経ちましたが同様の問題は起きてないです。別の問題はたくさんおきましたが。。。ま、それはおいときます。対応したの僕じゃないので。。。