0%

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

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

下载Hadoop安装包

我们选择安装hadoop cdh5版本,hadoop-2.6.0-cdh5.7.0

下载并解压

1
2
3
4
5
cd /usr/local/hadoop

wget http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.7.0.tar.gz

tar -zxvf hadoop-2.6.0-cdh5.7.0.tar.gz

添加环境变量

1
vi ~/.bash_profile

添加如下内容

1
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.6.0-cdh5.7.0

执行source命令让其配置生效

1
source ~/.bash_profile

设置ssh免密登录

1
2
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub simon@localhost

以上设置成功后,我们可以发现ssh登录时不需要密码了。

1
2
ssh simon@localhost
Last login: Mon Jan 08 10:45:10 2019

其他Linux配置

我目前所有的大数据组件都是用于开发验证,所以都是安装在本地的macOS环境下。如果在真实的Linux集群环境下安装,还需要配置hostname等信息

Linux下修改hostname

1
vi /etc/sysconfig/network

添加如下内容

1
2
NETWORKING=yes
HOSTNAME=hadoop001

修改/etc/hosts文件,配置主机和ip的映射关系

Hadoop配置文件修改

etc/hadoop/hadoop-env.sh

1
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home

etc/hadoop/core-site.xml

伪分布式配置

Hadoop 2.x版本默认端口为8020而非1.x版本的9000。

1
2
3
4
5
6
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:8020</value>
</property>
</configuration>

设置tmp文件夹,默认地址为/tmp/hadoop-${user.name}

1
2
3
4
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>

etc/hadoop/hdfs-site.xml

设置文件系统复本系数。

1
2
3
4
5
6
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

格式化HDFS

这一步操作只需要执行一次,格式化后,HDFS上的数据会被清空。

1
bin/hdfs namenode -format

注:bin目录存放客户端命令,sbin存放服务端命令。

启动HDFS

启动NameNode和DataNode

1
2
3
4
5
6
7
8
9
sbin/start-dfs.sh

19/01/08 13:11:40 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting namenodes on [localhost]
localhost: starting namenode, logging to /usr/local/hadoop/hadoop-2.6.0-cdh5.7.0/logs/hadoop-simon-namenode-localhost.out
localhost: starting datanode, logging to /usr/local/hadoop/hadoop-2.6.0-cdh5.7.0/logs/hadoop-simon-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/hadoop-2.6.0-cdh5.7.0/logs/hadoop-simon-secondarynamenode-localhost.out
19/01/08 13:11:55 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

我们注意到这一句localhost: starting datanode,这句里面的localhost,是和slaves从节点中的名字相同的。

1
2
cat etc/hadoop/slaves
localhost

验证是否启动成功

1
2
3
4
jps
18242 SecondaryNameNode
18150 DataNode
18079 NameNode

拥有这三个进程就说明已经启动成功。

同时我们还可以通过Web UI查看

http://localhost:50070/

有一些网站提供了格式化json的功能,如果没有网络时,或者json字符串很长时,还是需要一个可以格式json的软件,这里我们使用Sublime Text3来格式化json。

下载Sublime Text3

http://www.sublimetext.com/3

我们选择OS X系统

安装Package Control

使用快捷键ctrl+View -> Show Console 打开输入框,复制以下内容到输入框。

SUBLIME TEXT 3

1
import urllib.request,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee' + 'ebe013ee18cced0ef93d5f746d80ef60'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

安装pretty json

快捷键ctrl+shift+p,打开面板,选中Package Control: Install Package并回车,然后再输入pretty json,找到插件回车安装即可。

使用pretty json

使用ctrl+alt+j快捷键来格式化当前页面的内容。