1. 程式人生 > >spark+yarn調整計算任務的記憶體佔用

spark+yarn調整計算任務的記憶體佔用

調整的背景

公司正式環境有一個小小的spark+hadoop叢集,yarn的可用記憶體只有小小的40G,五個節點,每個節點8G記憶體,因此需要對每個上線的計算任務佔用的資源都要精打細算。 寫了兩個sparkstreaming的任務,發現其中一個任務用了三個container,每個container佔用了2G的記憶體,另外一個任務用了四個container,每個container佔用了2G的記憶體,這樣算下來,兩個任務一共佔用了14G 的記憶體,由於任務分配有時候不太均勻,導致有時候一個節點上就跑了個container,使得其他離線任務在佔用資源較多的時候,會出現資源競爭激烈,長時間排隊等待無法執行的情況。 而實際上,streaming的任務並不需要佔用如此多的資源,應該就可以完成任務,於是開始尋找調小任務佔用資源的方法

修改spark任務提交時的引數

第一步:嘗試調整提交spark任務時設定的--executor-memory引數,由原來的2G,調整為500m, 修改以後,發現任務可以正常的執行,可是每個container佔用的記憶體仍然是2G,沒有得到任何的改善。 經過檢視各種文件,各種百度,發現,當executor-memory小於yarn中設定的yarn.scheduler.minimum-allocation-mb時,yarn講分配給container yarn.scheduler.minimum-allocation-mb中設定的記憶體,所以會出現無論我怎麼設定 executor-memory,最後分配的記憶體都是2G,因為我的yarn.scheduler.minimum-allocation-mb設定的是2048


修改yarn.scheduler.minimum-allocation-mb

於是我修改了hadoop/etc/hadoop/yarn-site.xml中的yarn.scheduler.minimum-allocation-mb為500m,將該配置檔案分發到其他的yarn節點中,重啟yarn。 重新提交任務,結果提交任務的時候如下錯誤 spark ERROR YarnClientSchedulerBackend: Yarn application has already exited
於是又是一頓百度,一頓各種文件,發現原因是這樣的, 由於我的yarn.scheduler.minimum-allocation-mb設定的比較小,當spark任務啟動的時候,會有一瞬間,記憶體的佔用會出現翻倍的情況,這個我在yarn控制檯看到過這樣的現象,然後就會恢復到正常水平,yarn中有這樣的配置 yarn.nodemanager.pmem-check-enabled   是否啟動一個執行緒檢查每個任務正使用的實體記憶體量,如果任務超出分配值,則直接將其殺掉,預設是true

yarn.nodemanager.vmem-check-enabled   是否啟動一個執行緒檢查每個任務正使用的虛擬記憶體量,如果任務超出分配值,則直接將其殺掉,預設是true
這樣就很明確了,原來是任務被yarn殺死了,

修改 yarn.nodemanager.pmem-check-enabled yarn.nodemanager.pmem-check-enabled

將這兩個引數設定為false ,並將hadoop/etc/hadoop/yarn-site.xml分發的所有節點中,並重啟yarn 再次提交任務,任務正常執行,記憶體的佔用也降下來了,基本是原來的1/2左右的佔用量

總結

對於小型的叢集來說,資源的精打細算還是十分有必要的,當然,本次的調優並不是spark調優的全部,後續還需要對並行度進行調優,以及如何防止傾斜進行調優,革命尚未成功,同志仍需努力