天天看點

hive報錯:running beyond physical memory limitsn××終極解決方式

作者:滌生大資料

1.案例描述:

hive有個定時任務平時正常,沒有啥問題,正常一般大概執行1個小時左右,但是今天突然報錯了,報錯代碼::running beyond physical memory limits. Current usage: 2.0 GB of 2 GB physical memory used; 3.9 GB of 4.2 GB virtual memory used. Killing container。

2.分析解決

看報錯日志,顯示說是記憶體不夠,container配置設定的2g實體記憶體已經使用完了,另外虛拟記憶體4.2g已經使用了3.9g。是以任務被殺死。網上找了一些問題的排查,比如說調整增加了map和reduce的記憶體,,設定虛拟記憶體的比率,取消虛拟記憶體的檢查等等,但是其實好多都沒有用,要具體問題具體分析。下面具體分析一下。

1.檢視大資料叢集配置為每個container配置設定到記憶體的區間,從下面參數的結果可知,我們公司yarn的配置為每個container可申請的記憶體區間是1g-8g之間。具體每個container實際配置設定多少記憶體要看實際平台資源的負載情況 ,以及任務的優先級等因素。甚至有種方法說增加下面set yarn.scheduler.minimum-allocation-mb 參數的值,即将每個container的配置設定記憶體區間值調大。但是實際上這個值要通過yarn-site.xml檔案進行配置,并且需要重新開機叢集才會生效,而實際開發中,這種方法不太可能實作。

1.檢視yarn為每個container配置設定的記憶體區間
hive>set yarn.scheduler.minimum-allocation-mb;
    yarn.scheduler.minimum-allocation-mb=1024
hive>set yarn.scheduler.maximum-allocation-mb;
yarn.scheduler.maximum-allocation-mb=8192           

2.從下面看到叢集的配置為每個maptask和reduce task可使用的記憶體大下預設為2g。是以這個時候,如果是因為平台資源緊張造成部分任務因記憶體不夠而失敗(之前很多時候可以正常跑成功的任務)。這時候單方面調大mapreduce.map.memory.mb和mapreduce.reduce.memory.mb的值沒有任何意義,因為盡管每個container可以配置設定的記憶體是1-8g,但現在因為叢集資源緊張可能配置設定的記憶體很小,比如小于2個g,那麼你在調大運作在container上到map和reduce可使用記憶體,沒有任何意義。有一種情況調大mapreduce.map.memory.mb和mapreduce.reduce.memory.mb的值有用,那就是平台資源很豐富,每個container實際配置設定的記憶體很大,比如6個g。這樣會加快程式的運作,但值太大也會造成資源的浪費。

1.檢視每個map,reduce預設使用記憶體的配置大小
hive>set mapreduce.map.memory.mb;
     mapreduce.map.memory.mb=2048
hive>set mapreduce.reduce.memory.mb;
mapreduce.reduce.memory.mb=2048            

3.增加虛拟記憶體的虛拟化比率

通過下面可知,預設每個maptask和reudcetask虛拟化的記憶體比例是2.1。這裡公司叢集每個map,reduce設定的預設記憶體使用大小為2g。是以虛拟記憶體最大2.1*2=4.2g(上面報錯4.2g的來源:3.9 GB of 4.2 GB virtual memory used.),而且這個參數也是通過yarn-site.xml進行配置。其實實際開發中可以對應的配置大些。

hive (default)> set yarn.nodemanager.vmem-pmem-ratio;
yarn.nodemanager.vmem-pmem-ratio=2.1            

4. 配置yarn不記憶體檢查

通過yarn-site.xml檔案将yarn.nodemanager.vmem-check-enabled設定為false,然後重新開機叢集。但是這種不建議,可能會造成記憶體洩露。

hive (default)> set yarn.nodemanager.vmem-check-enabled;
yarn.nodemanager.vmem-check-enabled=true           

5.增加map和reduce的個數

很顯然,此舉是将每個map和reduce的工作量降小了,可以起到一定作用。一般maptask的個數由檔案大小,切片資訊等确定,而reduce的個數由最終需要聚合的結果決定,如果增加過多,會産生多個小檔案。

1.增加map的個數,可以通過設定切片資訊大小,因為一般一個切片啟動一個maptask。如下公司每個block的大小是128Mb,是以我們可以将 set mapred.max.split.size 成64Mb.這樣一個塊用兩個task執行。

hive>set dfs.block.size;     
       dfs.block.size=134217728           

2.增加reduce數量 可以通過:set hive.exec.reducers.bytes.per.reducer配置

6.是以分析了一下,實際公司開發中,配到這種情況,重新開機叢集也不太靠譜的情況下,隻能檢查優化一下自己的程式了。

1.一般可以給任務設定失敗重試次數,自動多試幾次可能會成功。

2.檢查程式是否有資料傾斜的問題,一般來說大多數這種情況都是資料傾斜造成的。除非是公司的叢集參數配置的不合理,那麼可以修改一下,适當按照上面的情況增加一下值。

繼續閱讀