Yarn基础介绍 Ps:在博文开始前,需要说明的是该篇文章有部分的内容和图片摘自网上一些博主的博客,若有冒犯请知会我删除该部分内容,也感谢这些博主的博客给我在学习yarn组件时给予的莫大帮助。 一、Yarn的发展史1) MRv1引入JobTracker、TaskTracker的概念:
A:JobTracker:一个管理者,接受来自TaskTracker的心跳,负责资源管理和job的调度。
B:TaskTracker:像是一个中层的管理者,接受来自JobTracker的请求,也会反馈来自任务的实现情况。 从图中可看到,MRv1实现了一个相对简单的集群管理器来执行MapReduce处理,但是这种架构存在着不足,查阅资料得到,当节点数量大于4000时,就会具有较大的不可预测性以及风险使得JobTracker挂掉,那么就会导致整个集群瘫痪。为了解决这样的问题,就产生了Yarn。
2) MRv2 -- Yarn为了解决这样的问题,将JobTracker中的资源管理和作业控制功能分开,分别由组件ResourceManager 和ApplicationMaster实现,其中,ResourceManager负责所有应用程序的资源分配,而ApplicationMaster仅负责管理一个应用程序,进而诞生了全新的通用资源管理框架Yarn。
二、 Yarn的结构以及工作机制 在看下图之前,我们先熟悉几个概念: 1) ResourceManager 控制整个集群并管理应用程序向基础计算资源的分配,将各个资源部分(计算、内存、带宽等)精心安排给基础NodeManager(Yarn的每个节点)。它主要由两个组件构成:调度器(scheduler)和应用管理器。(Applications Manager),其中调度器(可插拔,后文再做补充)仅根据各个应用程序的资源需求进行资源分配,剩余的交给ASM来做,如监控跟踪应用程序执行状态等。它的一些功能: A:处理客户端请求 B:启动或监控ApplicationMaster C:监控NodeManager D:资源的分配与调度。 2) ApplicationMaster管理一个在Yarn内运行的应用程序的每个实例。负责协调来自ResourceManager的资源,并通过NodeManager监视容器的执行和资源使用(CPU、内存的资源分配)。它的一些功能: A:负责数据的切分
B:为应用程序申请资源并分配给内部的任务
C:任务的监控与容错 3) NodeManagerA:管理yarn中每一个节点,从监督对一个容器的终生管理到监视资源和跟踪节点健康 B:管理单个节点的资源 C:处理来自ResourceManager的命令 D:处理来自NodeManager的命令 4) ContainerA:是Yarn中的资源抽象,可信息以理解为该任务所占用的资源 B:对任务运行环境进行抽象,封装CPU、内存等多维度的资源以及环境变量、启动命令等任务运行相关的 5) Yarn的工作原理A. 用户向Yarn提交任务,其中包括ApplicationMaster程序,ResourceManager就会为这个任务申请一个Container,并交给对应的NodeManager管理,保证这个任务在这个Container中启动。
B. 而后ApplicationMaster可以以轮询的方式通过RPC协议向ResourceManager注册,申请需求的资源,使得用户可以通过ResourcrManager去监控它,直到任务结束。
C. ApplicationMaster申请到资源后,就会与对应的NodeManager通信,要求它启动任务,NodeManager就会为任务设置好任务运行环境,将任务写到一个脚本中,并启动它。
D. 各个任务都会通过RPC协议向ApplicationMaster回报自己的状态和进度,使得ApplicationMaster可以掌握各个任务的状态,从而可以在任务失败的时候重新启动任务,用户也可以随时通过RPC去查询应用程序的状态。
E. 最后任务结束,ApplicationMaster会向ResourceManager注销自己。 三、 浅谈Yarn资源调度与资源隔离1)内存当谈到资源时,通常指的是CPU、内存、IO三种,正常情况下,Yarn不会对任何资源进行隔离,当然,如果采用java语言编写的程序,则会使用JVM内置的隔离机制为内存资源进行隔离。对于Yarn而言,目前所做的工作就是监控每一个任务的进程树,如果每个任务的进程树使用的总物理内存或者总虚拟内存量超过了预先设置值,则依次发送TERM和KILL两个信号将整个进程树杀死。如果你在YARN上运行了一些特殊的任务或者服务,可使用Cgroups对内存进行严格的隔离。
2)CPU目前Yarn对于CPU资源隔离的支持并不是很好,在此就简单介绍一下。CPU资源按照百分比进行使用和隔离,是通过Cgroups中cpu.shares参数来实现的,这个方式能够保证每个节点上的cpu资源得到充分的共享和使用,从而产生较高的CPU利用率,但是要启动这个功能,还需经过复杂的参数配置和调整。限制每个container的CPU资源使用上限。但是该功能仅有可使用的补丁,还没合到hadoop的主干中。如果是异构集群,某些节点上的CPU拥有更强的计算能力,则调整物理CPU和虚拟CPU的比例。虚拟CPU的概念是借鉴内存和虚拟内存的,主要目的是消除集群中cpu计算能力的异构性
3)I/OIO资源分为磁盘IO和网络IO两种。目前YARN已经在这两方面展开工作,初步的设计文档已经发布。IO资源的隔离比CPU和内存复杂的多,为了便于用户量化IO资源,YARN仿照“虚拟cpu”的概念,引入了“虚拟磁盘”(vdisk),第一阶段将尝试使用cgroup的blkio模块实现磁盘IO隔离。当然,在实现该功能之前,还需要将IO资源加入调度器管理的范畴,使得hadoop中的资源调度器,比如公平调度器或者容量调度器,可以对磁盘IO和网络IO进行调度。
四、资源计算
在Spark中,有Yarn-Client和Yarn-Cluster两种模式可以运行在Yarn上,通常Yarn-cluster适用于生产环境,而Yarn-Client更适用于环境测试使用,在spark on yarn模式下,每一个spark executor都会作为一个container运行,接下来我们介绍一下资源计算的公式:
AmMemory :spark-submit申请的AM内存spark.yarn.am.memory,默认是512M
AmMemoryOverhead:spark.yarn.am.memoryOverhead,默认是max(spark.yarn.am.memory * 0.10, 384M)
(AmMemory + AmMemoryOverhead) ,这里计算的是供给AM的Container内存资源
(ExecutorMemory + ExecutorMemoryOverhead),这里则是一个executor所需的Container大小
Ps:值得一提的是在我们的yarn中,有一个资源规整化因子,在fair调度器模式下规整化因子可配置,在capatity和FIFO调度器下就等于我们最小可申请的内存/CPU。我会在下面的脚本代码中作为栗子介绍给大家。
4.1 yarn-clientdriver运行在本地客户端上,从上面公式可以看到,资源的申请总共分两块,一块是AM所需的资源申请,另一则是executor的资源申请
/bigdata/salut/components/spark/bin/spark-submit \
--master yarn \
--deploy-mode client \
--class com.TestDemo \
--name "TestDemo " \
--queue root.default\
--driver-memory 3g \
--num-executors 1 \
--executor-memory 6g \
--executor-cores 4 \
--conf spark.yarn.am.memory=1g \
--conf spark.yarn.am.memoryOverhead=1g \
--conf spark.yarn.executor.memoryOverhead=2g \
4.2 yarn-clusterdriver运行在随机的一个NM上,只不过在cluster模式中,AmMemory=driver-memory。
/bigdata/salut/components/spark/bin/spark-submit \
--master yarn-cluster \
--class com.TestDemo \
--name "TestDemo" \
--queue root.default \
--driver-memory 2g \
--num-executors 1 \
--executor-memory 12g \
--executor-cores 5 \
/bigdata/salut/lib/public/salut-spark-1.2.jar $*
五、 Schedule介绍
1)fair shcedule的特点A:支持多用户多队列
B:资源公平共享 C:支持抢占 D:限制作业并发量 2)capatity schedule特点A:能够设置队列,并且针对每一个队列可以设置资源使用的上下限,以及是否可以抢占别的队列的资源
B:安全,每个队列可以设置严格的访问控制 C:支持队列资源,用户管理的动态调整 D:更加细粒度的资源调度 E:支持优先级调度功能,默认不支持可以在配置文件中配置 六、小结本篇文章仅是对Yarn组件做了一个比较基础的介绍,蛋挞在后面的文章中会陆续介绍Yarn组件资源调度的原理。 最后还是要由衷感谢在蛋挞学习Yarn组件的过程中,网络上各位博主的文章对蛋挞给予的莫大帮助!
|