1. 程式人生 > >MapReduce之如何給執行在YARN上的MapReduce作業配置記憶體

MapReduce之如何給執行在YARN上的MapReduce作業配置記憶體

關於mapreduce程式執行在yarn上時記憶體的分配一直是一個讓我蒙圈的事情,單獨查任何一個資料都不能很好的理解透徹。於是,最近查了大量的資料,綜合各種解釋,終於理解到了一個比較清晰的程度,在這裡將理解的東西做一個簡單的記錄,以備忘卻。
首先,先將關於mapreduce和yarn關於記憶體分配的引數貼上上:
yarn.scheduler.minimum-allocation-mb
yarn.scheduler.maximum-allocation-mb
yarn.nodemanager.resource.memory-mb
yarn.nodemanager.vmem-pmem-ratio
yarn.scheduler.increment-allocation-mb
mapreduce.map.memory.mb
mapreduce.reduce.memory.mb
mapreduce.map.java.opts
mapreduce.reduce.java.opts
個人認為,針對mapreduce任務,這些引數只有放在一起學習才能真正理解,如果單獨考慮,理解不清晰。下面開始詳細講解。
一、理解引數yarn.nodemanager.resource.memory-mb,yarn.nodemanager.vmem-pmem-ratio
yarn.nodemanager.resource.memory-mb很簡單,就是你的這臺伺服器節點上準備分給yarn的記憶體;
yarn.nodemanager.vmem-pmem-ratio網上解釋都是"每使用1MB實體記憶體,最多可用的虛擬記憶體數,預設2.1",但是目前我還是不太理解其作用是什麼,有知道的朋友希望能詳細解釋下。
二、理解引數yarn.scheduler.minimum-allocation-mb和yarn.scheduler.maximum-allocation-mb
都知道,在yarn上執行程式時每個task都是在獨立的Container中執行的,單個Container可以申請的最小和最大記憶體的限制就是這兩個引數,注意,並不是這兩個引數決定單個Container申請記憶體的大小,而僅僅是限制的一個範圍。
三、理解yarn的記憶體規整化因子和記憶體規整化演算法
先不說和哪個引數有關,單純理解這一概念。舉例:
假如規整化因子b=512M,上述講的引數yarn.scheduler.minimum-allocation-mb為1024,yarn.scheduler.maximum-allocation-mb為8096,然後我打算給單個map任務申請記憶體資源(mapreduce.map.memory.mb):
申請的資源為a=1000M時,實際得到的Container記憶體大小為1024M(小於yarn.scheduler.minimum-allocation-mb的話自動設定為yarn.scheduler.minimum-allocation-mb);
申請的資源為a=1500M時,實際得到的Container記憶體大小為1536M,計算公式為:ceiling(a/b)*b,即ceiling(a/b)=ceiling(1500/512)=3,3*512=1536。此處假如b=1024,則Container實際記憶體大小為2048M
也就是說Container實際記憶體大小最小為yarn.scheduler.minimum-allocation-mb值,然後增加時的最小增加量為規整化因子b,最大不超過yarn.scheduler.maximum-allocation-mb
四、理解mapreduce.map.memory.mb、mapreduce.reduce.memory.mb
"三"中提到的"打算給單個map任務申請記憶體資源"也就是a,其實就是指的"mapreduce.map.memory.mb"或"mapreduce.reduce.memory.mb",注意其值不要超過yarn.scheduler.maximum-allocation-mb
五、理解mapreduce.map.java.opts、mapreduce.reduce.java.opts
以map任務為例,Container其實就是在執行一個指令碼檔案,而指令碼檔案中,會執行一個 Java 的子程序,這個子程序就是真正的 Map Task,mapreduce.map.java.opts 其實就是啟動 JVM 虛擬機器時,傳遞給虛擬機器的啟動引數,而預設值 -Xmx200m 表示這個 Java 程式可以使用的最大堆記憶體數,一旦超過這個大小,JVM 就會丟擲 Out of Memory 異常,並終止程序。而 mapreduce.map.memory.mb 設定的是 Container 的記憶體上限,這個引數由 NodeManager 讀取並進行控制,當 Container 的記憶體大小超過了這個引數值,NodeManager 會負責 kill 掉 Container。在後面分析yarn.nodemanager.vmem-pmem-ratio 這個引數的時候,會講解 NodeManager 監控 Container 記憶體(包括虛擬記憶體和實體記憶體)及 kill 掉 Container 的過程。
也就是說,mapreduce.map.java.opts一定要小於mapreduce.map.memory.mb
mapreduce.reduce.java.opts同mapreduce.map.java.opts一樣的道理。
六、理解規整化因子指的是哪個引數
"三"中提到的規整化因子也就是b,具體指的是哪個引數和yarn使用的排程器有關,一共有三種排程器:capacity scheduler(預設排程器)、fair scheduler和fifo scheduler
當使用capacityscheduler或者fifoscheduler時,規整化因子指的就是引數yarn.scheduler.minimum-allocation-mb,不能單獨配置,即yarn.scheduler.increment-allocation-mb無作用;
當使用fairscheduler時,規整化因子指的是引數yarn.scheduler.increment-allocation-mb
至此,關於yarn和mapreduce的任務記憶體配置問題講完了,這也是我目前理解的層次。