yarn - yaokun123/php-wiki GitHub Wiki

YARN

  • 于2012年引入的组件,用于管理集群中的计算资源并在这些资源上调度用户应用

  • Apache Hadoop YARN 是开源 Hadoop 分布式处理框架中的资源管理和作业调度技术。作为 Apache Hadoop 的核心组件之一,YARN 负责将系统资源分配给在 Hadoop 集群中运行的各种应用程序,并调度要在不同集群节点上执行的任务。

一、架构

1、cli(切片清单/配置/jar/上传到hdfs)访问ResourceManager申请ApplicationMaster

2、ResourceManager选择一台不忙的节点通知NodeManager启动一个Container,在里面反射一个ApplicationMaster

3、启动ApplicationMaster,从hdfs下载切片清单,向ResourceManager申请资源

4、由ResourceManager根据自己掌握的资源情况得到一个确定清单,通知NodeManager启动Container

5、Container启动后会反向注册到已启动的ApplicationMaster

6、ApplicationMaster(曾经的JobTracker阉割版不带资源管理)最终将任务Task发送给Container(消息)

7、Container从hdfs下载jar/配置 反射相应的Task类为对象,调用方法执行,其结果就是我们的业务逻辑代码的执行

8、计算框架都有Task失败重试机制

二、角色

1.1、ResourceManager(RM)

1、处理客户端请求

2、监控NodeManager

3、启动或者监控ApplicationMaster

4、资源的分配与调度

1.2、NodeManager(NM)

1、管理单个节点上的资源

2、处理来自ResourceManager的命令

3、处理来自ApplicationMaster的命令

1.3、ApplicationMaster(AM)

1、负责数据的切分

2、为应用程序申请资源并分配给内部的任务

3、任务的监控与容错

1.4、Container

Container是Yarn中的资源抽象,它封装了某个节点上的多维度资源,包括:内存、CPU、磁盘、网络等。

三、yarn高可用

3.1、原理

hadoop 1.x 2.x 3.x
hdfs no ha ha(向前兼容,没有过多的改NameNode,而是通过新增了角色zkfc)
yarn no yarn 不是新增角色,而是直接在RM进程中增加了HA模块

3.2、配置

在Hadoop每台节点上$HADOOP_HOME/etc/hadoop下配置mapred-site.xml配置文件,让MapReduce任务运行时使用Yarn资源调度框架进行调度

// mapred-site.xml

<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>

<property>
    <name>yarn.app.mapreduce.am.env</name>
    <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

<property>
    <name>mapreduce.map.env</name>
    <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

<property>
    <name>mapreduce.reduce.env</name>
    <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

在Hadoop每台节点$HADOOP_HOME/etc/hadoop/yarn-site.xml中配置yarn-site.xml配置文件

// yarn-site.xml

<!-- 让yarn的容器支持mapreduce的洗牌,开启shuffle服务 -->
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>

<!-- 启用resourcemanager的HA -->
<property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
</property>

<!-- 指定zookeeper集群的各个节点地址和端口号 -->
<property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>mynode3:2181,mynode4:2181,mynode5:2181</value>
</property>

<!-- 标识集群,以确保 RM 不会接管另一个集群的活动。 -->
<property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>mycluster</value>
</property>

<!-- RM HA的两个resourcemanager的名字 -->
<property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
</property>

<!-- 指定rm1的reourcemanager进程所在的主机名称 -->
<property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>mynode1</value>
</property>

<!-- 指定rm2的reourcemanager进程所在的主机名称 -->
<property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>mynode2</value>
</property>

<property>
    <name>yarn.application.classpath</name>
    <value>
                           /software/hadoop-3.1.4/etc/*,
                           /software/hadoop-3.1.4/etc/hadoop/*,
                           /software/hadoop-3.1.4/lib/*,
                           /software/hadoop-3.1.4/share/hadoop/common/*,
                           /software/hadoop-3.1.4/share/hadoop/common/lib/*,
                           /software/hadoop-3.1.4/share/hadoop/mapreduce/*,
                           /software/hadoop-3.1.4/share/hadoop/mapreduce/lib/*,
                           /software/hadoop-3.1.4/share/hadoop/hdfs/*,
                           /software/hadoop-3.1.4/share/hadoop/hdfs/lib/*,
                           /software/hadoop-3.1.4/share/hadoop/yarn/*,
                           /software/hadoop-3.1.4/share/hadoop/yarn/lib/*
    </value>
</property>

<property>
    <name>yarn.resourcemanager.webapp.address.rm1</name>
    <value>mynode1:8088</value>
</property>

<property>
    <name>yarn.resourcemanager.webapp.address.rm2</name>
    <value>mynode2:8088</value>
</property>

注意:workers可以不用管,搭建hdfs的时候已经改过了。NodeManager和DataNode是一一对应的。

配置start-yarn.sh&stop-yarn.sh脚本

在$HADOOP/sbin目录下,在start-yarn.sh和stop-yarn.sh脚本中加入以下两行配置,指定操作Yarn的用户,配置完成之后,我们也同步到其他Hadoop节点上。

YARN_RESOURCEMANAGER_USER=root
YARN_NODEMANAGER_USER=root

首先启动zookeeper,HDFS,然后启动Yarn,命令如下:

start-yarn.sh

// 如果在ResourceManager有没启动的,需要手动启动
yarn-daemon.sh start resourcemanager

webapp

随后可以使用mynode1:8088/mynode2:8088在web网页上查看资源管理的状态。

访问standby的会自动重定向到active。

Memory Total 和 VCores Total 默认是按照一台机器8核8G来算的,需要修改配置。

1、yarn.nodemanager.resource.memory-mb
表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。

2、yarn.nodemanager.vmem-pmem-ratio
任务每使用1MB物理内存,最多可使用虚拟内存量,默认是2.1。

3、yarn.nodemanager.pmem-check-enabled
是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true。

4、yarn.nodemanager.vmem-check-enabled
是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。

5、yarn.scheduler.minimum-allocation-mb
单个container可申请的最少物理内存量,默认是1024(MB),如果一个任务申请的物理内存量少于该值,则该对应的值改为这个数。

6、yarn.scheduler.maximum-allocation-mb
单个container可申请的最多物理内存量,默认是8192(MB)。

7、yarn.nodemanager.resource.cpu-vcores
表示该节点上YARN可使用的虚拟CPU个数,默认是8,注意,目前推荐将该值设值为与物理CPU核数数目相同。
如果你的节点CPU核数不够8个,则需要调减小这个值,而YARN不会智能的探测节点的物理CPU总数。

8、yarn.scheduler.minimum-allocation-vcores
单个任务可申请的最小虚拟CPU个数,默认是1,如果一个任务申请的CPU个数少于该数,则该对应的值改为这个数。

9、yarn.scheduler.maximum-allocation-vcores
单个任务可申请的最多虚拟CPU个数,默认是32。
⚠️ **GitHub.com Fallback** ⚠️