Hiveserver2 OOM問題解法


數據平台做一些計算需要通過hive jdbc方式連到hiveserver2執行job,但是hiveserver 正常運行一段時間后,總是會報如下OOM:

 

偶爾碰到未解決問題,重啟HiveServer2,印證了那句老話,重啟能解決80%以上的問題,但是好景不長,經過長期的觀察,發現是HiveServer進程GC狀況:

hiveserver2_gc

到這一步可以斷定有資源沒有釋放, 再看下Heap對象分布:

hiveserver2_jmaphisto

看到這里我確實找不到招了,HashMap HashTable代碼在Hive源碼遍地都是,壓根無法定位是哪個代碼片段存在內存泄漏

然后我嘗試去官網查下別人是否也碰到過同樣的問題,果然在jira里搜索 “HiveServer2 OutOfMemoryError” ,存在一個Case跟我的情況一模一樣,但Bug是Open狀態,也就是還未解決!!  https://issues.apache.org/jira/browse/HIVE-9893

有問題就解決問題,考慮到HiveServer2是單點,對系統高可用、穩定性都會帶來隱患;於是我想到了一個解決辦法——開啟多個HiveServer2,上層用Haprocxy來轉發請求,再通過服務撥測實時對OOM的節點報警通知,以便研發能第一時間發現問題。但OOM依然存在,治標不治本。

這個Bug一直持續了將近半年,直到最近在調研Spark並計划將Spark取代Mapreduce來提升平台的計算效率時,發現Spark-sql能完美的兼容Hive SQL,同時還提供了ThriftServer(就是SparkHiveServer),不止於此,由於Spark更好的使用了內存,期執行效率是MR/Hive的10倍以上。

其實就是在Spark集群上執行$SPARK_HOME/sbin/start-thriftserver.sh –master=spark://MASTER:7077 就默認開啟了10000端口,該服務可以取代hiveserver2,如果與HiveServer2在同一台服務器上,可以先shutdown hiveserver2,再啟動spark thriftserver。運行了1個禮拜,服務非常穩定,GC也正常!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM