yarn資源調優參數
概念介紹
- container
是一個虛擬化的容器,包括memory和vcore兩個維度,作用是運行appmaster和task任務 - 物理核pcore
服務器上實際的物理CPU的核數 - 虛擬核vcore
yarn引入的一個概念,設計的初衷是考慮到每臺服務器的性能不一樣,比如某一個物理CPU是另一個物理CPU的兩倍,通過設置pcore和vcore來彌補這種差距
比如第一臺機器CPU性能強悍,設置pcore:vcore=1:2
第二臺機器CPU性能比較差,設置pcore:vcore=1:1
生產上如何調優
內存參數
在yarn-site.xml中進行配置
key | value | desc |
---|---|---|
yarn.nodemanager.resource.memory-mb | -1 | 可以分配給容器的物理內存總量(以MB爲單位) |
yarn.scheduler.minimum-allocation-mb | 1024 | 單個container向RM能申請到的最小內存 |
yarn.scheduler.maximum-allocation-mb | 8192 | 單個container向RM能申請到的最大內存 |
cpu參數
在yarn-site.xml中進行配置
key | value | desc |
---|---|---|
yarn.nodemanager.resource.pcores-vcores-multiplier | 1 | 將pcore轉化爲vcore的乘數,若爲2,表示pcore*2=vcore。推薦pcore:vcore=1:2 |
yarn.nodemanager.resource.cpu-vcores | -1 | 所有conatiner能使用的物理內存總和 |
yarn.scheduler.minimum-allocation-vcores | 1 | 單個container向RM能申請到的最小vcore數量 |
yarn.scheduler.maximum-allocation-vcores | 4 | 單個container向RM能申請到的最大vcore數量。cloudera公司推薦一個container的vcores最好不要超過5,一般我們設置爲4 |
設置DN和NM的內存數
DN和NM在生產上的參數設置爲2G和4G即可
組件 | 文件 | 參數 | 大小 | desc |
---|---|---|---|---|
DataNode | hadoop-env.sh | HADOOP_HEAPSIZE= | 1000 | 單位M,生產上一般分配2048即可 |
NodeManager | yarn-env.sh | YARN_HEAPSIZE= | 1000 | 單位M,生產上一般分配4096即可 |
樣例
假如服務器有128G內存,16物理cpu,需要裝DN和NM,具體如何設置參數
1、裝centos需要消耗1G內存
2、系統預留15%-20%,包括裝centos的空間,預留的原因是防止全部被使用以及oom事件或者給未來裝其他組件預留空間
128*20=25.6G==26G
還剩下 128-26=102G內存
3、假設只有dn和nm組件,裝dn和nm分別需要2G和4G內存
還剩下102-2-4=96G內存
container內存的分配
yarn.nodemanager.resource.memory-mb 96G
yarn.scheduler.minimum-allocation-mb 1G 極限情況下,只有96個container 內存1G
yarn.scheduler.maximum-allocation-mb 96G 極限情況下,只有1個container 內存96G
container的內存會自動增加,默認1g遞增
container:1-96個
4、container物理核分配 (物理核:虛擬核 =1:2 ==>16:32)
yarn.nodemanager.resource.pcores-vcores-multiplier 2
yarn.nodemanager.resource.cpu-vcores 32
yarn.scheduler.minimum-allocation-vcores 1 極限情況下,只有32個container
yarn.scheduler.maximum-allocation-vcores 32 極限情況下,只有1個container
container:1-32個
4、需要注意的是pcore:vcore=1:2 所以vcore=16*2=32核;cloudera公司推薦,一個container的vcore最好不要超過5,那麼我們設置4
yarn.scheduler.maximum-allocation-vcores 4 極限情況下,只有8個container
5、綜合memory+vcore,確定 vcore=4 container 8個
內存的設置爲
yarn.scheduler.maximum-allocation-mb 12G 極限container 8個
6、最終的設置爲
yarn.nodemanager.resource.cpu-vcores --> 32 # 16*2=32
yarn.scheduler.minimum-allocation-vcores --> 1 # 最多有32個container
yarn.scheduler.maximum-allocation-vcores --> 4 # 最少有8個container
yarn.nodemanager.resource.memory-mb --> 96G # container能使用的最大內存
yarn.scheduler.minimum-allocation-mb --> 1G #
yarn.scheduler.maximum-allocation-mb --> 12G # 極限8個(96/8)
當然當spark計算時內存不夠大,這個參數肯定要調大,
那麼這種理想化的設置個數必然要打破,以memory爲主
假如服務器有256G內存,56物理cpu,需要裝DN、NM和hbase regionserver,具體如何設置參數
1、需要減去內存開銷和其他組件的開銷
預留 15%-20%(包括裝centos消耗的內存)
dn 2G
nm 4G
hbase regionserver 30G
還剩餘256-2560.2-2-4-30 = 168G
2、pcore:vcore=1:2 ,故vcore數量爲562=112;單個container佔用4個vcore,確定 memory和vcore,所以最終爲
yarn.nodemanager.resource.cpu-vcores --> 112 # 56*2=112
yarn.scheduler.minimum-allocation-vcores --> 1 # 最多有112個container
yarn.scheduler.maximum-allocation-vcores --> 4 # 最少有28個container
yarn.nodemanager.resource.memory-mb --> 168G # RM能使用的最大內存
yarn.scheduler.minimum-allocation-mb --> 1G #
yarn.scheduler.maximum-allocation-mb --> 6G # 極限28個(168/28)
yarn的調度器整理三種
在Yarn中有三種調度器可以選擇:FIFO Scheduler ,Capacity Scheduler,FairScheduler。
FIFO 先進先出調度器
先進先出(First In First Out)調度器。FIFO 調度器是 Hadoop 使用最早的一種調度策略,可以簡單的將其理解爲一個隊列,這意味着在集羣中同時只能有一個作業運行。所有的應用程序按照提交順序來執行,在上一個 Job 執行完成之後,下一個 Job 按照隊列中的順序執行。FIFO調度器以獨佔集羣全部資源的方式來運行作業,這樣的好處是 Job 可以充分利用集羣的全部資源,但是對於運行時間短,優先級高或者交互式查詢類的MR Job 需要等待它之前的 Job 完成才能被執行,這也就導致瞭如果前面有一個比較大的 Job 在運行,那麼後面的 Job 將會被阻塞。因此,雖然 FIFO 調度器實現簡單,但是並不能滿足很多實際場景的要求。這也就促使 Capacity 調度器和 Fair 調度器的誕生。
Capacity 計算調度器
而對於Capacity調度器,有一個專門的隊列用來運行小任務,但是爲小任務專門設置一個隊列會預先佔用一定的集羣資源,這就導致大任務的執行時間會落後於使用FIFO調度器時的時間。
Fair 公平調度器
在Fair調度器中,我們不需要預先佔用一定的系統資源,Fair調度器會爲所有運行的job動態的調整系統資源。如上圖所示,當第一個大job提交時,只有這一個job在運行,此時它獲得了所有集羣資源;當第二個小任務提交後,Fair調度器會分配一半資源給這個小任務,讓這兩個任務公平的共享集羣資源。
需要注意的是,在上圖Fair調度器中,從第二個任務提交到獲得資源會有一定的延遲,因爲它需要等待第一個任務釋放佔用的Container。小任務執行完成之後也會釋放自己佔用的資源,大任務又獲得了全部的系統資源。最終的效果就是Fair調度器即得到了高的資源利用率又能保證小任務及時完成。
apache和cdh的默認調度器
Apache Hadoop的默認調度器是什麼
yarn-site.xml進行設置
key | value | desc |
---|---|---|
yarn.resourcemanager.scheduler.class | org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler | 默認是計算調度器 |
cdh的默認調度器是什麼
默認調度器是:公平調度器
可以登錄yarn的頁面查看
yarn的常用命令
運行jar包
yarn jar
hadoop jar
殺死yarn的進程
使用場景,進程夯住了或者提交錯任務了
yarn application -kill < application ID>
下載log日誌
[hadoop@JD ~]$ yarn logs
Retrieve logs for completed YARN applications.
usage: yarn logs -applicationId [OPTIONS]
general options are:
-appOwner AppOwner (assumed to be current user if
not specified)
-containerId ContainerId (must be specified if node
address is specified)
-nodeAddress NodeAddress in the format nodename:port
(must be specified if container id is
specified)