HiveServer2のメモリーリーク

HiveServer2で 「java.lang.OutOfMemoryError: unable to create new native thread」といわれた - wyukawa’s blogで書いた件だけど、GangliaのTotal Processesを見ると下記のように順調に増えていたのでやはりメモリーリークなのかなと思っています。

スレッドを作っていってulimitに引っかかって「java.lang.OutOfMemoryError: unable to create new native thread」というストーリーっぽい。

HDPのHiveServer2を使っているのだけれども/proc/[HiveServer2のpid]/limitsのMax processesを見ると1024しかなくてこれにひっかかったという感じっぽい。まあ1024なのはCentOS6のデフォルトだからという話だと思う。

HiveServer2のヒープ状況はjstatでJVMの統計情報を取得してGrowthForecastに投げて、グラフを作ってくれるスクリプト書いた - blog.nomadscafe.jpを参考にjstat2gfを使ってGrowthForecastになげてグラフ化してみたけれども特に変な点は無いように見えた。

なので対策としては、ulimitを増やすこととHiveServer2の定期的再起動になるのかなと。あとHiveServer2のヒープも増やした。

で、Ambariを使っているのでHiveServer2の定期的再起動をどうやるかってのが問題になる。

これに関していうとAmbariはAPIを提供していて、やり方はUsing API to START/STOP services/host components. - Apache Ambari - Apache Software Foundationを参考にするとよい。-hじゃなくて-Hだろうとか誤植あるけど。

ちなみにPythonクライアント、Ambari python Client - Apache Ambari - Apache Software Foundationもあるんだけど動かなかった。パッケージングに問題がありそうなのとそれ以外にも問題がありそうでちょっと使うのは諦めた。たぶんまだ絶賛開発中なんだと思う。

HiveServer2をstopしたい場合は下記のような感じで実行すればよい。{"state": "INSTALLED"}にするのがポイント。

curl --user ${AMBARI_SERVER_USER}:${AMBARI_SERVER_PASS} -i -H 'X-Requested-By: ambari' -X PUT -d '{"RequestInfo": {"context" :"Stop HiveServer2 via REST"}, "HostRoles": {"state": "INSTALLED"}}' http://${AMBARI_SERVER_HOST}:${AMBARI_SERVER_PORT}/api/v1/clusters/${CLUSTER_NAME}/hosts/${HIVESERVER2_HOST}/host_components/HIVE_SERVER

startする場合は下記。違いはstateのところね。contextのところはブラウザに表示する情報です。

curl --user ${AMBARI_SERVER_USER}:${AMBARI_SERVER_PASS} -i -H 'X-Requested-By: ambari' -X PUT -d '{"RequestInfo": {"context" :"Start HiveServer2 via REST"}, "HostRoles": {"state": "STARTED"}}' http://${AMBARI_SERVER_HOST}:${AMBARI_SERVER_PORT}/api/v1/clusters/${CLUSTER_NAME}/hosts/${HIVESERVER2_HOST}/host_components/HIVE_SERVER