概念
YARN是一个用于作业调度和资源管理的框架。
- 核心思想:
将MapReduce1中的JobTracker的资源管理和作业调度两个功能分开,分别由
ResourceManager和ApplicationMaster进程来实现
ResourceManager:负责整个集群的资源管理和调度
ApplicationMaster:负责应用程序相关的事务,比如任务调度,任务监控和容错等
YARN的出现可以使得多个计算框架运行在一个集群当中
每个应用程序对应一个ApplicatonMaster
目前可以支持多种计算框架运行在YARN上,比如MapReduce,Strom,Spark,Flink,
- YARN与MapReduce关系:
YARN是一个资源管理系统,负责资源管理和调度
MapReduce只是运行在YARN上的一个应用程序
如果把YARN看作androd,则mapreduce只是一个app
mapreduce1.0是一个独立系统,直接运行在linux上
mapreduce2.0则是运行在YARN上的框架,且可以与多种框架一起运行在YARN上
- YARN 系统架构:
ResourceManager
负责集群中所有资源的统一管理和分配,它接受来自各个节点的NodeManager的资源汇报信息,并把这些信息按照一定的策略分配给各个应用程序,是整个YARN集群中最重要的组件之一,他的设计直接决定了系统的可扩展性,可用性和容错性,它的功能较多,包括ApplicationMaster管理,NodeManager管理,Application管理,状态机管理等
主要有以下几个功能:
1.与客户端交互,处理来自客户端的请求
2.启动和管理ApplicationMaster,
并且在它失败时重新启动它
3.管理NodeManager,接受来自NodeManager的资源汇报信息,下达管理指令
4.资源管理和调度,接受来自ApplicationMaster的资源申请请求并向让NodeManager为之分配资源
- Nodemanager
是运行在单个节点上的代理,管理hadoop集群中单个计算节点,他需要与相应用程序ApplicationMaster和集群管理者ResourceManager交互
1.从ApplicationMaster上接收有关Contioner的命令并执行
2.向ResourceManager汇报各个container运行状态和节点健康状况,并领取有关的Container的命令并执行
- ApplicationMaster
与应用程序相关的组件
1.负责数据切分,把每份数据分配给对应的Map Task
2.为应用程序申请资源并进一步分配给内部的任务。比如从ResourceManager获取分配的资源,然后分配给Task任务
3.任务的监控与容错。一旦一个任务挂掉之后,他可以重新向ResourceManager申请资源
- Container
Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存,CPU,磁盘,网络等。当AM向RM申请资源时,RM为AM返回的资源便是用Container表示的。
YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。需要注意的是,Container不同于MR(mapreduce)v1中的slot(也是资源分配单位),他是一个动态资源划分单位,是根据应用程序的需求动态生成的
- MapReduce on YARN
对数据进行打乱冲洗,合并所需要的数据
运行在YARN上的应用程序分为两类:短应用程序和长应用程序。
短应用程序:
是指在一定时间内可以运行完成并正常退出的应用程序,比如MapReduce作业 离线计算
长应用程序:
是指不出意外,永不停止的应用程序,通常是一些服务比如
Strom Service(主要包括Nimbus和Supervisor两类服务)
HBase Service(包括Hmaste:和RegionServer两类服务)等,
而他们本身作为一个框架提供了编程接口供用户使用 spark 实时计算
当用户向YARN中提交一个应用程序后,YARN将分为两个阶段运行该应用程序:
第一个阶段是启动ApplicationMaster
第二个阶段是由ApplicationMater创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。
流程:
1.客户端(IDEA)向 RM(NN)申请运行app
2.RM 把运行 APP 所需要的JOB资源(数据)路径返回给客户端
3.客户端将做好的应用程序(代码)需要的JOB资源提交到HDFS中,NM (DN)可以从HDFS中取数据。
4.客户端向RM 提交JOB
5.RM 初始化TASK,其中由个FIFO对队列进行维护
6.RM 将任务调度给 NM 运行,NM运行容器(AppMaster),
7.AM拷贝资源,资源来自HDFS
8.向RM注册自己,并申请资源,客户端就可以通过RM过去AM的地址,查看任务进度。
9.RM依据数据的存放位置调度容器,运行map任务。这些可以通过 AM进行控制。
10.NM从 AM 中拷贝启动脚本
11.map 向AM 提交任务的运行状态,返回心跳。
12.客户端就可以从AM中获取作业进度。
13.各个结点的map任务完成后,开始reduce合并任务
同样以容器的方式运行,重复前面的步骤(AM向RM申请reduce资源),来完成reduce合并任务
14.任务全部结束后,AM 向 RM 注销自己,并释放资源。
AM申请,RM调度,NM(map)完成。
配置
我们可以通过设置一些参数并另外运行ResourceManager守护进程和NodeManager守护进程,从而在YARN上以伪分布式模式运行MapReduce作业。
[cay@server1 hadoop]$ vim mapred-site.xml
<!-- Put site-specific property overrides in this file. --><configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property><property><name>mapreduce.application.classpath</name><value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value></property>
</configuration>
$HADOOP_MAPRED_HOME 这个变量在我们的hadoop环境变量中并没有指明,我们要去声明一下:
[cay@server1 hadoop]$ vim etc/hadoop/hadoop-env.sh
export JAVA_HOME=/home/cay/jdk# Location of Hadoop. By default, Hadoop will attempt to determine
# this location based upon its execution path.
export HADOOP_HOME=/home/cay/hadoop
export HADOOP_MAPRED_HOME=/home/cay/hadoop
[cay@server1 hadoop]$ vim etc/hadoop/yarn-site.xml <configuration><!-- Site specific YARN configuration properties --><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><name>yarn.nodemanager.env-whitelist</name> 白名单,那些路径是可用的<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value></property>
</configuration>
打开yran组件:
[cay@server1 sbin]$ ./start-yarn.sh
Starting resourcemanager
Starting nodemanagers
[cay@server1 sbin]$ jps
7092 NameNode
9558 Jps
7278 SecondaryNameNode
9246 ResourceManager
在 NN 结点启动了ResourceManager守护进程。
[cay@server2 ~]$ jps
4966 NodeManager
5064 Jps
3772 DataNode
在DN 结点上启动了 NodeManager守护进程