0%

YARN介绍及环境搭建

YARN架构

1 RM(ResourceManager) + n NM(NodeManager)

ResourceManager的职责

一个集群active状态的RM只有一个,负责整个集群的资源管理和调度

  1. 处理客户端的请求(启动 / kill)

  2. 启动 / 监控ApplicationMaster(一个作业对应一个AM)

  3. 监控NM

  4. 系统的资源分配和调度

NodeManager

集群中有n个NodeManager,负责单个节点的资源管理和使用以及task的运行情况

  1. 定期向RM汇报本节点的资源使用情况和各个Container的运行状态

  2. 接收并处理RM的container启停的各种命令

  3. 单个节点的资源管理和任务管理

ApplicationMaster

每个应用 / 作业对应一个,负责应用程序的管理

  1. 数据切分

  2. 为应用程序向RM申请资源(container),并分配给内部任务

  3. 与NM通信以启停task,task是运行在container中的

  4. task的监控和容错

Container

对任务运行情况的描述:cpu, memory, 环境变量

YARN执行流程

  1. 用户向YARN提交作业

  2. RM为该作业分配第一个container(AM)

  3. RM与对应的NM通信,要求NM在这个container上启动应用程序的AM

  4. AM首先向RM注册,然后AM将为各个任务申请资源,并监控运行情况

  5. AM采用轮询的方式通过RPC协议向RM申请和领取资源

  6. AM申请到资源以后,便和相应的NM通信,要求NM启动任务

  7. NM启动我们作业对应的task

YARN配置

配置etc/hadoop/mapred-site.xml

1
2
3
cd $HADOOP_HOME
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
vi etc/hadoop/mapred-site.xml

添加如下内容

1
2
3
4
5
6
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

配置etc/hadoop/yarn-site.xml

1
vi etc/hadoop/yarn-site.xml

添加如下内容

1
2
3
4
5
6
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

启动YARN

1
2
3
4
sbin/start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop/hadoop-2.6.0-cdh5.7.0/logs/yarn-simon-resourcemanager-localhost.out
localhost: starting nodemanager, logging to /usr/local/hadoop/hadoop-2.6.0-cdh5.7.0/logs/yarn-simon-nodemanager-localhost.out
1
2
3
jps
41620 NodeManager
41546 ResourceManager

说明YARN已经成功启动。

通过浏览器访问地址 http://localhost:8088,可见页面如下

提交作业

1
2
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount
Usage: wordcount <in> [<in>...] <out>

说明需要提供输入文件及输出结果的位置。

我们先创建一个测试文件

1
2
3
4
vi /tmp/input

hello world
hello hello world

把input文件上传到hdfs://data/目录下

1
bin/hadoop fs -put /tmp/input /data

再次执行命令

1
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /data/input /data/out

查看执行结果

1
2
3
4
5
bin/hadoop fs -ls /data/out
19/01/09 21:07:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rw-r--r-- 1 simon supergroup 0 2019-01-29 21:06 /data/out/_SUCCESS
-rw-r--r-- 1 simon supergroup 16 2019-01-29 21:06 /data/out/part-r-00000

wordcount的结果在文件/data/out/part-r-00000里面

1
2
3
4
bin/hadoop fs -text /data/out/part-r-00000
19/01/09 21:08:54 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
hello 3
world 2

如果重复提交作业,会出现如下FileAlreadyExistsException异常。

1
2
3
4
5
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /data/input /data/out
19/01/09 21:09:52 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
19/01/09 21:09:53 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
19/01/09 21:09:53 WARN security.UserGroupInformation: PriviledgedActionException as:simon (auth:SIMPLE) cause:org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:8020/data/out already exists
org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:8020/data/out already exists

所以如果要重复执行,则需要把输出文件先删除掉。