最近早上來發現hive叢集排程平台所有的任務都處于ACCPETED狀态,之前以為是叢集的原因,重新開機了之後感覺好了,結果第二天來還是同樣的情況,排查了情況沒看到報錯資訊,倒是看到了如下關鍵日志:
not starting application as amIfStarted exceeds amLimit
大緻意思就是不能運作應用因為所需要的資源已經超過最大資源了,如果你的也有類似日志,通過yarn指令檢視各個節點的情況:
yarn node-list all
如上圖,現在叢集的所有節點均處于RUNNING狀态,如果你的節點有被辨別為UNHEALTH狀态的,那就說明對應節點的資源變得不可用了(記憶體cpu變得不可用),對應的applicaiton就拿不到資源啟動,這是因為在hadoop配置檔案yarn-site.xml中有那麼一個控制節點磁盤最大使用率的參數:
yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage
<property>
<name>yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage</name>
<value>98</value>
</property>
這個參數預設是90,也就是該節點磁盤資源使用率超過90%對應的資源就變得不可用了,再使用指令檢視叢集的資源使用情況:
hadoop dfsadmin -report
這裡叢集總的使用情況已經超過80%,其實叢集資源超過80%的時候就應該達到告警級别了!
解決方案:
1.因為情況緊急,磁盤使用率已達到92%,無法馬上擴容,眼下隻有将參數調大,将如下參數磁盤使用率最高調至98%(上面)
yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage
不過這隻能緩解燃眉之急,就有了方案2
2.排查數倉資料表占用情況,使用指令(記得替換數倉位址)
hdfs dfs -du -s hdfs://SH1/user/hive/warehouse/nginxlogdb.db/* | sort -nr > disk.txt
挑選占用情況比較嚴重并且不太重要的表,将曆史維表删除,隻保留最近一個月的資料,然後!!!!重點來了,這也是hive比較核心的東西,很多公司都不重視,覺得hive就是寫sql,誰不會(鄙視臉,沒看過hive程式設計指南的童鞋們經常寫一些執行低效的sql,直接把資源耗完!當然如果你覺得公司有的是錢買伺服器那就當我沒說),那就是壓縮存儲,hive中幾種壓縮格式請參看下面這篇文章 https://blog.csdn.net/helloxiaozhe/article/details/78465467 ,其中,orc壓縮格式壓縮率是最秀的,本地對同一批資料進行了測試壓縮率高達90%,這是什麼概念,十台伺服器存的資料我現在用一台伺服器就行了!省了九台伺服器的錢!當然最後總體壓縮下來壓縮率維持在60%-70%,也是非常棒的了,選了幾張占用情況比較嚴重的表重做成以orc格式存儲的表,最後叢集磁盤占用直接由90%以上降到40%附近!成功搞定上述問題!具體細節就不細說了,hive中使用orc格式常用做法:
set hive.default.fileformat=orc;
create table tb_name stored as orc as select * from table_name; // 強烈推薦
create table tb_name(
xxx string
)stored as orc;
最後所有application都能無障礙跑了!