本部分主要是關(guān)于 YARN懊亡。Yarn 是在 hadoop 2 中引入的資源管理系統(tǒng)椎组。用戶代碼并不會(huì)與其直接交互丹拯,但是許多分布式計(jì)算框架都是作為一個(gè) Yarn 應(yīng)用來(lái)運(yùn)行的祈争。
還有一些應(yīng)用如 Pig斤程,Hive,Crunch 等是運(yùn)行在 MP铛嘱,Spark 或 Tez 上的暖释,不會(huì)與 Yarn 直接交互。
Yarn Application 運(yùn)行
YARN 有兩種 daemon 進(jìn)程:
- resource manager 每個(gè)集群一個(gè)墨吓,管理集群資源的使用
- node manager 集群中每個(gè) node 都有,啟動(dòng)和監(jiān)控 containers纹磺。
通過(guò) jcmd 可以看到這些 daemon 進(jìn)程:
hadoop@millions-server:~$ jcmd
22256 org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode
22561 org.apache.hadoop.yarn.server.nodemanager.NodeManager
21973 org.apache.hadoop.hdfs.server.namenode.NameNode
22085 org.apache.hadoop.hdfs.server.datanode.DataNode
20141 sun.tools.jcmd.JCmd
22447 org.apache.hadoop.yarn.server.resourcemanager.ResourceManager
Yarn 應(yīng)用運(yùn)行的過(guò)程可以用下圖描述帖烘,容器請(qǐng)求可以表述為容器消耗的計(jì)算資源的量(主要包括 CPU 和內(nèi)存):
YARN 調(diào)度
當(dāng)集群資源緊缺時(shí),需要按照一些預(yù)定的策略來(lái)分配給不同的任務(wù)資源橄杨。有三種調(diào)度方式:
- FIFO:
先進(jìn)先出秘症,但是在共享型集群中不合適 - Capacity scheduler(hadoop 默認(rèn)的):
(1) 計(jì)算能力保證。支持多個(gè)隊(duì)列式矫,某個(gè)作業(yè)可被提交到某一個(gè)隊(duì)列中乡摹。每個(gè)隊(duì)列會(huì)配置一定比例的計(jì)算資源,且所有提交到隊(duì)列中的作業(yè)共享該隊(duì)列中的資源采转。
(2) 靈活性聪廉。空閑資源會(huì)被分配給那些未達(dá)到資源使用上限的隊(duì)列故慈,當(dāng)某個(gè)未達(dá)到資源的隊(duì)列需要資源時(shí)板熊,一旦出現(xiàn)空閑資源資源,便會(huì)分配給他們察绷。
(3) 支持優(yōu)先級(jí)干签。隊(duì)列支持作業(yè)優(yōu)先級(jí)調(diào)度(默認(rèn)是FIFO)
(4) 多重租賃。綜合考慮多種約束防止單個(gè)作業(yè)拆撼、用戶或者隊(duì)列獨(dú)占隊(duì)列或者集群中的資源容劳。
(5) 基于資源的調(diào)度。 支持資源密集型作業(yè)闸度,允許作業(yè)使用的資源量高于默認(rèn)值竭贩,進(jìn)而可容納不同資源需求的作業(yè)。不過(guò)筋岛,當(dāng)前僅支持內(nèi)存資源的調(diào)度娶视。 - Fair Scheduler
在多個(gè) Job 間分配資源,如果只有一個(gè) Job 則其享有全部資源,如果加入新的 Job肪获,則資源在2個(gè) Job 間分配寝凌。
Capacity Scheduler 的配置
對(duì)于 Capacity scheduler,會(huì)將 Job 提交到若干 Queue中孝赫,然后每個(gè) Queue 是 FIFO 的较木,如果 Queue 中有超過(guò)一個(gè) Job,并且有空閑資源青柄,給這個(gè) Queue 分配的資源是可以超過(guò)其預(yù)定的量的伐债。
一個(gè)配置文件的示例(配置文件為 capacity-scheduler.xml),有層次的在各個(gè)隊(duì)列之間分配資源比例:
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>dev,prod</value>
<description>
The queues at the this level (root is the root queue).
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.prod.capacity</name>
<value>40</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.capacity</name>
<value>60</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.maximum-capacity</name>
<value>75</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.science.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.eng.capacity</name>
<value>50</value>
</property>
詳細(xì)的配置說(shuō)明在這里官方文檔致开。
在提交 Job 時(shí)峰锁,可以指定 Queue,對(duì)于 MapReduce双戳,可以指定 property mapreduce.job.queuename
虹蒋。
Fair Scheuler 配置
Fair 調(diào)度也有 Queue 的概念,資源在 Queue 之間是公平分配的飒货,對(duì)同一個(gè) Queue 中的 Job魄衅,資源同樣是均勻分配的。比如 2 個(gè) Queue:Queue1 Queue2塘辅;Queue1 有 Job1晃虫,Queue2 有 Job2 以及 Job3,則 Job1 使用 50% 資源扣墩, Job2 和 Job3 各 25% 資源哲银。
在 yarn-site.xml 中 設(shè)置 yarn.resourcemanager.scheduler.class
可以修改默認(rèn)的 scheduler:org.apache.yarn.server.resourcemanager.scheduler.fair.FairScheduler
。
Fair Scheuler 的配置文件為 fair-scheduler
(可以通過(guò) yarn.scheduler.fair.allocation.file 修改):
<?xml version="1.0"?>
<allocations>
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<queue name="prod">
<weight>40</weight>
<schedulingPolicy>fifo</schedulingPolicy>
</queue>
<queue name="dev">
<queue name="eng">
<queue name="science">
</queue>
<queuePlacementPolicy>
<rule name="specified" create="false">
<rule name="primaryGroup" create="false">
<rule name="default" create="dev.eng">
</queuePlacementPolicy>
</allocations>
defaultQueueSchedulingPolicy 默認(rèn)為 fair沮榜,也可以指定為 FIFO 等盘榨。通過(guò) weight 可以分配 Queue 之間分配資源的比例。更詳細(xì)的配置細(xì)節(jié)見官方文檔蟆融。
如何將 Job 放到指定的 Queue 中去由 queuePlacementPolicy 決定:對(duì)每一條 rule 逐一嘗試草巡。specified 指由應(yīng)用自己指定 Queue 的名字,如果沒(méi)有指定或指定的 Queue 不存在型酥,則進(jìn)入下一條山憨;primaryGroup 指使用用戶的 unix group 作為隊(duì)列名稱;最終默認(rèn)的隊(duì)列是 dev.eng弥喉,將會(huì)處理所有沒(méi)有被處理的 Job郁竟。默認(rèn)的策略是:
<queuePlacementPolicy>
<rule name="specified">
<rule name="user">
</queuePlacementPolicy>
搶占式
配置 property yarn.scheduler.fair.preemption
設(shè)置為 true 可以使 Job 搶占式的獲取資源,而不用等別人釋放由境。
延遲以本地運(yùn)行
配置 property yarn.scheduler.capacity.node-locality-delay
會(huì)使 scheduler 嘗試等待一段時(shí)間以獲取本地執(zhí)行的機(jī)會(huì)(本地執(zhí)行就是在數(shù)據(jù)所在的 node 運(yùn)行)棚亩。
DRF 主要資源 Fairness
默認(rèn)情況下占用資源主要指內(nèi)存蓖议,如果打開了 DRF,那么在總資源中占比多的將會(huì)成為所謂的 DRF讥蟆,以其在總資源中的占比來(lái)評(píng)價(jià)其所需資源勒虾。比如需要集群 6% 的 cpu 和 3% 的內(nèi)存,那么 cpu 將成為主要資源瘸彤。
打開 DRF 的方式:
- 對(duì)于capacity scheduler修然,在 capacity-scheduler.xml 中設(shè)置
yarn.scheduler.capacity.resource-calculator
為org.apache.hadoop.yarn.util.resource.DominantResourceCalculator
- 對(duì)于 fair scheduler,在 allocation 文件里設(shè)置頂層元素 defaultQueueSchedulingPolicy 為 drf质况。