天天看點

hive在E-MapReduce叢集的實踐(一)hive異常排查入門一.常見異常表現三.hive日志位置

hive是hadoop叢集最常用的資料分析工具,隻要運作sql就可以分析海量資料。初學者在使用hive時,經常會遇到各種問題,不知道該怎麼解決。

本文是hive實踐系列的第一篇,以E-MapReduce叢集環境為例,介紹常見的hive執行異常,定位和解決方法,以及hive日志檢視方法。

除作者本人的知乎專欄外,其他轉載需要先聯系我。

主要是執行hive sql時卡住,提示異常資訊。

如執行sql時直接提示異常資訊,執行sql時卡住,顯示mapreduce進度一直0%,mapreduce進度長時間不變化,執行一半提示異常退出,等等。

一般是文法問題,資源問題或hive服務異常。

sql寫的有問題。如ParseException

提示table文法錯誤,正确的是show tables。遇到查閱hive文法确定正确寫法。

表test不存在。檢查表名是否拼寫錯誤,大小寫是否正确,等等。

一般是metastore有問題。如

連不上metastore,說明metastore服務有問題,如oom,被作業系統kill,等。先檢查metastore程序是否存在,看程序啟動時間是否有重新開機。再來看metastore的日志,是否有oom,作業系統kill。檢視metastore日志的方式第三章介紹。

如果有oom,一般需要配大metastore的記憶體。如果有被作業系統kill,說明機器使用的總記憶體比實體記憶體大了,要麼更新機器配置,要麼合理規劃主節點記憶體,尤其是要注意限制在主節點上送出作業的程序數,避免占用過多記憶體。

要看hive日志分析原因,一般是hive用戶端遇到某種可重試異常一直在重試,未傳回異常資訊。

有一次遇到,檢視hive用戶端日志,反複有報錯說不能識别一個機器域名。确定問題是因為使用的hive on tez,hive client要通過【叢集内域名:端口】來通路tez作業的appmaster,而執行hive指令的伺服器沒有配置叢集内域名的解析,是以無法識别該域名。在/etc/hosts下增加域名配置,拷貝主節點的/etc/hosts域名配置,解決了該問題。

一般是叢集或者作業所屬的yarn資源池隊列沒有資源,導緻作業狀态一直pending。

可以打開yarn ui,預設是主節點的8088端口(EMR控制台可以在開源元件快捷入口進入),檢視該hive作業是不是一直在pending。

pending首先确定是否配置了yarn資源池,資源池配置有無問題,如配置的資源太少,運作的作業太多。如有問題要修改資源池配置,根據配置修改情況重新整理資源隊列或重新開機resourcemanager。

如果排除了資源池問題,還有可能是運作的hadoop作業太多,那麼要等待其他作業完成釋放資源,或者直接殺掉其他不重要的作業。

極有可能有死鎖。常見場景是叢集或yarn資源池隊列資源有限,同時運作了好多作業job。各作業appmaster,提前啟動的reduce用光了資源,沒資源繼續啟動map了,于是死鎖。

解決方案是避免reduce提前啟動占用資源,設定reduce在map都執行完後再啟動。修改maped-site.xml的mapreduce.job.reduce.slowstart.completedmaps參數,改為0.98,或者1,殺掉所有作業重新執行。這樣隻有98%或100%的map都執行完,才會啟動reduce程序。

要注意修改該參數會延長單個job的運作總時間,隻有同時運作很多job,瞬時資源需要遠大于叢集/資源隊列規模,才有必要調整該參數。

常見map/reduce oom。

檢視job client運作日志,并用yarn ui檢視sql任務的map,reduce task日志,是否有oom資訊。如果有,根據實際需要,調大記憶體。可以在執行的sql前,通過set mapreduce.map.memory.mb =4096;(該數值僅為舉例,以實際需要來确定)修改map,set mapreduce.reduce.memory.mb = 4096;修改reduce的記憶體來避免oom。

還有其他一些造成oom的原因和解決辦法,下篇文章再來介紹。

近期的版本更新會支援在EMR控制台上檢視各服務的日志,敬請期待。目前可以登入叢集檢視hive的日志。

hive日志預設是 /tmp/[user]/hive.log,由于tmp目錄機器重新開機後會清空,是以在EMR叢集裡,hiveserver和metastore程序在啟動時配置了額外的日志參數,日志輸出在/var/log/hive/目錄,分别為hiveserver2.log和metastore.log。每天會滾動生成一個帶日期的新檔案,最多保留30天。

服務程序日志一般用來調查異常日志資訊,是否有oom,作業系統kill,中繼資料通路錯誤,等等。

運作hive的client日志依然在 /tmp/[user]/hive.log裡,例如用root使用者運作sql,日志會在/tmp/root/hive.log檔案裡。

hive job的mapreduce task跟其他hadoop job的mapreduce task一樣,日志分散在叢集的各個節點上,可以通過yarn ui點選job資訊跳轉檢視。