YARN统一资源管理
Apache YARN即Yet Another Resource Negotiator,是 hadoop 2.0 引入的集群资源管理系统。用户可以将各种服务框架部署在 YARN 上,由 YARN 进行统一地管理和资源分配Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
资源管理:
它会对集群中各类的资源进行抽象,然后根据各种应用程序或者服务的要求,按照一定的调度策略
将资源分配给她们使用资源管理采用一定的隔离机制防止应用程序或者服务之间因为抢占资源而互相干扰。它弱化了计算框架之争,是他们都可以发挥自己的优势yarn进行统一的管理,可以使各大框架有条不紊的运行在一个大的集群上
分布式安装
分布式应用配置,3个节点
node1 node2 node3
NameNode+DataNode DataNode DateNode+SecondaryNameNode
NodeManager NodeManager+ResourceManager NodeManager
core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-3.3.4/data</value>
</property>
hdfs-site.xml1
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node3:9868</value>
</property>
mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node2</value>
</property>
<property>
<name>yarn.application.classpath</name> <!-- 对应值为hadoop classpath命令
结果 -->
<value>/usr/local/hadoop-3.3.4/etc/hadoop:/usr/local/hadoop-
3.3.4/share/hadoop/common/lib/*:/usr/local/hadoop-
3.3.4/share/hadoop/common/*:/usr/local/hadoop-
3.3.4/share/hadoop/hdfs:/usr/local/hadoop-
3.3.4/share/hadoop/hdfs/lib/*:/usr/local/hadoop-
3.3.4/share/hadoop/hdfs/*:/usr/local/hadoop-
3.3.4/share/hadoop/mapreduce/*:/usr/local/hadoop-
3.3.4/share/hadoop/yarn:/usr/local/hadoop-
3.3.4/share/hadoop/yarn/lib/*:/usr/local/hadoop-3.3.4/share/hadoop/yarn/*
</value>
</property>
workers
node1
node2
node3
编码验证
文件上传处理
Configuration configuration = new Configuration();
2 configuration.set("fs.defaultFS","hdfs://172.20.10.3:9000"); //NN对应的地址端口
3 FileSystem fileSystem = FileSystem.get(configuration);
4 fileSystem.copyFromLocalFile(new Path("bbb.txt"),new Path("/abc.txt"));
5 fileSystem.close();
查看上传文件信息
Configuration configuration = new Configuration();
2 configuration.set("fs.defaultFS", "hdfs://172.20.10.3:9000");
3 FileSystem fileSystem = FileSystem.get(configuration);
Path path = new Path("/abc.txt");
FileStatus fileStatus = fileSystem.getFileStatus(path);
// 获取文件所在集群位置
BlockLocation[] fileBlockLocations =
fileSystem.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
for (BlockLocation blockLocation : fileBlockLocations) {
System.out.println(blockLocation);//0,120,hadoop
}
// 获取checksum
FileChecksum fileChecksum = fileSystem.getFileChecksum(path);
// 获取集群中的所有节点信息
DistributedFileSystem dfs = (DistributedFileSystem) fileSystem;
DatanodeInfo[] dataNodeStats = dfs.getDataNodeStats();
for (DatanodeInfo datanodeInfo : dataNodeStats) {
System.out.println(datanodeInfo);//三个节点信息
}
检验校验和
1、DataNode接收数据后存储数据前。DataNode接收数据一般有两种情况:1.从客户端上传数据。
2.DataNode从其他DataNode上接收数据。当客户端上传数据时,正在写数据的客户端将数据及其校验和发送到由一系列datanode组成的Pipeline管线。Pipeline管线中最后一个datanode负责验证校验和。
2、DataNode数据存储是校验。Hadoop不会在数据每流动到一个DataNode都检查校验和,只会在数据流达到最后一个节点时才检查校验和。如果在验证过程中发现有不一致的块,就会抛出
CheckSumException异常信息
3、客户端读取DataNode上的数据时。Hadoop会在客户端读取DataNode上的数据时,使用DFSClient中的read函数先将数据读入到用户的数据缓冲区,然后再检查校验和。将他们与datanode中存储的校验和进行比较
4、DataNode后台守护进程的定期检查。DataNode会在后台运行DataBlockScanner,这个程序定期验证存储在这个datanode上的所有数据块,阈值3周,该项措施是解决物理存储媒体上位衰减,位损坏的有力措施
Hadoop系统为了保证数据的一致性,会对文件生成相应的校验文件.crc文件,并在读写的时候进
行校验,确保数据的准确性。hadoop比较适合做离线处理,为了保证数据的一致性,每次写文件
时,针对数据的io.bytes.per.checksum字节,都会创建一个单独的校验和。默认值为512字节,
因为crc-32校验是4字节,存储开销小于1%。而客户端读取数据时,默认会验证数据的crc校验
和。
CRC-32循环冗余校验:使用CRC-32算法任何大小的数据输入均计算得到一个32位的整数校验码。
由于CRC32产生校验值时源数据块的每一个bit位都参与了计算,所以数据块中即使只有一位发生
了变化,也会得到不同的CRC32值
YARN架构
YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成
ResourceManager
ResourceManager 通常在独立的机器上以后台进程的形式运行,它是整个集群资源的主要协调者和管理者。ResourceManager 负责给用户提交的所有应用程序分配资源,它根据应用程序优先级、队列容量、ACLs、数据位置等信息,做出决策,然后以共享的、安全的、多租户的方式制定分配策略,调度集群资源。4.1.2 NodeManager
NodeManager 是 YARN 集群中的每个具体节点的管理者。主要负责该节点内所有容器的生命周期的管理,监视资源和跟踪节点健康。具体如下:
启动时向ResourceManager 注册并定时发送心跳消息,等待ResourceManager 的指令;
维护Container的生命周期,监控Container的资源使用情况;
管理任务运行时的相关依赖,根据ApplicationMaster的需要,在启动Container之前将需要的程序
及其依赖拷贝到本地;
ApplicationMaster
在用户提交一个应用程序时,YARN 会启动一个轻量级的进程ApplicationMaster。ApplicationMaster负责协调来自ResourceManager的资源,并通过NodeManager监视容器内资源的使用情况,同时还负
责任务的监控与容错。具体如下:
根据应用的运行状态来决定动态计算资源需求;
向 ResourceManager 申请资源,监控申请的资源的使用情况;
跟踪任务状态和进度,报告资源的使用情况和应用的进度信息;
负责任务的容错;
Container
Container是 YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络
等。当 AM 向 RM 申请资源时,RM 为 AM 返回的资源是用Container表示的。YARN 会为每个任务分配一个Container,该任务只能使用该Container中描述的资源。ApplicationMaster可在Container内运行任何类型的任务。如MapReduce ApplicationMaster请求一个容器来启动 map 或 reduce 任务,而Graph ApplicationMaster请求一个容器来运行Graph 任务。
YARN原理概述
1. Client提交作业到 YARN 上;
2. Resource Manager选择一个Node Manager,启动一个Container并运行Application Master实
例;
3. Application Master根据实际需要向Resource Manager请求更多的Container资源。如果作业很
小,应用管理器会选择在其自己的 JVM 中运行任务;
4. Application Master通过获取到的Container资源执行分布式计算。1、MR程序提交到客户端所在的节点。
2、YarnRunner向ResourceManager申请一个Application。
3、RM将该应用程序的资源路径返回给YarnRunner。
4、该程序将运行所需资源提交到HDFS上。
5、程序资源提交完毕后,申请运行mrAppMaster。
6、RM将用户的请求初始化成一个Task。
7、其中一个NodeManager领取到Task任务。
8、该NodeManager创建容器Container,并产生MRAppmaster。
9、Container从HDFS上拷贝资源到本地。
10、MRAppmaster向RM 申请运行MapTask资源。
11、RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
12、MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动
MapTask,MapTask对数据分区排序。
13、MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
14、ReduceTask向MapTask获取相应分区的数据。
15、程序运行完毕后,MR会向RM申请注销自己。
4.2.1 YARN工作原理4.2.1.1 作业提交
client调用job.waitForCompletion方法,向整个集群提交 MapReduce 作业 (第 1 步) 。新的作业 ID(应用 ID) 由资源管理器分配 (第 2 步)。作业的 client 核实作业的输出, 计算输入的 split , 将作业的资源(包括 Jar 包,配置文件, split 信息) 拷贝给 HDFS (第 3 步)。 最后, 通过调用资源管理器的
submitApplication() 来提交作业 (第 4 步)。
作业初始化
当资源管理器收到 submitApplciation() 的请求时, 就将该请求发给调度器 ( scheduler ), 调度器分配
container , 然后资源管理器在该 container 内启动应用管理器进程, 由节点管理器监控 (第 5 步)。
MapReduce作业的应用管理器是一个主类为 MRAppMaster 的 Java 应用,其通过创造一些
bookkeeping 对象来监控作业的进度, 得到任务的进度和完成报告 (第 6 步)。然后其通过分布式文件系统得到由客户端计算好的输入 split (第 7 步),然后为每个输入 split 创建一个 map 任务, 根据
mapreduce.job.reduces 创建 reduce 任务对象。
任务分配
如果作业很小, 应用管理器会选择在其自己的 JVM 中运行任务。
如果不是小作业, 那么应用管理器向资源管理器请求 container 来运行所有的 map 和 reduce 任务 (第 8步)。这些请求是通过心跳来传输的, 包括每个 map 任务的数据位置,比如存放输入 split 的主机名和机架 (rack),调度器利用这些信息来调度任务,尽量将任务分配给存储数据的节点, 或者分配给和存放输入split 的节点相同机架的节点。4.2.1.4 任务运行
当一个任务由资源管理器的调度器分配给一个 container 后,应用管理器通过联系节点管理器来启动
container(第 9 步)。任务由一个主类为 YarnChild 的 Java 应用执行, 在运行任务之前首先本地化任务需要的资源,比如作业配置,JAR 文件, 以及分布式缓存的所有文件 (第 10 步。 最后, 运行 map 或
reduce 任务 (第 11 步)。YarnChild 运行在一个专用的 JVM 中, 但是 YARN 不支持 JVM 重用。
进度和状态更新
YARN中的任务将其进度和状态 (包括 counter) 返回给应用管理器, 客户端每秒 (通mapreduce.client.progressmonitor.pollinterval 设置) 向应用管理器请求进度更新, 展示给用户。
作业完成
除了向应用管理器请求作业进度外, 客户端每5分钟都会通过调用 waitForCompletion() 来检查作业是否完成,时间间隔可以通过 mapreduce.client.completion.pollinterval 来设置。作业完成之后, 应用管理器和 container 会清理工作状态, OutputCommiter 的作业清理方法也会被调用。作业的信息会被作业历史服务器存储以备之后用户核查。
提交作业到YARN上运行
提交 Hadoop Examples 中计算 Pi 的 MapReduce 程序 hadoop jar hadoop-mapreduce-
examples.jar pi 3 3 ,相关 Jar 包在 Hadoop 安装目录的 share/hadoop/mapreduce 目录下
cd /usr/local/hadoop./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jarpi 5 500