目录
知识要点
MapReduce
策略理念
策略:分而治之
理念:计算向数据靠拢而不是数据向计算靠拢
工作流程
由InputFormat进行格式验证和split(切片),split并不是把数据进行物理的切片,而是一个逻辑定义。RecordRead(RR)根据分片的位置长度信息从HDFS把相关分片读出来,以<key-value>的数据形式交由Map处理,分片的数量决定了Map任务的数量。执行Map任务,输出<key-value>格式的数据,然后进行shuffle(分区、排序、合并、归并)复杂操作,再将处理结果以<key-List<value>>的形式作为Reduce的输入。执行Reduce任务,输出<key-value>格式的数据,最后由OutputFormat再将最终处理结果保存到HDFS
分片(split)的划分
分片的过程是由用户自己定义,一般来讲分片的大小和HDFS的block块(hadoop1.x默认大小为64M而hadoop2.x默认块大小为128M)大小一致,如果一个分片横跨两个block,而这两个block又不在同一个节点,就会有额外的网络资源开销
map任务数量和reduce任务数量的确定
map任务数量:分片的数量决定了Map任务的数量
reduce任务数量:最优的reduce任务的数据取决于集群中可用的reduce任务槽(slot:TaskTracker将资源划分成很多slot,一部分分配给Map任务,一部分分配给Reduce任务,slot是MapReduce1.0的说法)数目,通常设置比reduce任务槽数目稍小一些reduce任务
shuffle过程
shuffle过程分为map shuffle以及reduce shuffle。
map shuffle是对map输出结果进行分区、排序、合并,再对同一分区数据进行归并,最终得到一个分区有序的输出文件的过程。一个分片(split)会对应一个map任务,由于频繁的写磁盘会带来很大的寻址开销,所以map操作输出结果不会立马写入到磁盘,而是写入环形缓存区,缓冲区默认大小为100M(io.sort.mb设置)。数据并不是无止境的写入缓存区,当达到阈值(默认是0.8,可通过io.sort.spill.percent设置)就会触发溢写(pill)操作,即默认写入量达到80M触发溢写操作。在溢写操作之前,会发生分区(partition)、排序(sort)和可能的合并(combine)操作,有多少个reduce任务就会划分成多少个分区,分区内数据是有序的。每次溢写操作都会生成一个临时文件(保存在mapreduce.cluster.local.dir目录下),当整个map操作完成溢写后,会对磁盘中所有临时文件进行归并(merge)操作,从而生成整个map任务的输出文件。归并操作会对所有临时文件的相同分区进行合并,并对各个分区进行再一次的排序,最终输出数据就是<key-List<value>>的格式。
reduce shuffle主要是复制map输出以及排序合并两个阶段。reduce任务会以Http的方式将属于自己分区的数据从所有map任务所在的机器上拿取过来,拿取过来的数据也不会直接写入磁盘,而是先写入内存缓存区,缓存区的默认大小是JVM堆大小的70%(可通过mapred.job.shuffle.input.buffer.percent设置),如果缓冲区中能放得下这次数据的话就直接把数据写到内存中,即内存到内存归并,该种方式默认不启用。和map环形缓存区类似,内存终究是有限的,当超过阈值(默认是66%,可通过mapred.job.shuffle.merge.percent设置)之后会发生溢写,会将内存的数据merge写入到磁盘临时文件,也就是内存到磁盘归并,当有设置合并(combine)操作,写入磁盘之前还会执行合并操作。当所有的复制完成,会有多个临时文件,此时会把临时文件进行归并和排序操作,即磁盘到磁盘归并,reduce的排序就发生在这个地方。
YARN
架构概述
ResourceManager是全局资源管理器,主要包含调度器(Scheduler)和和应用程序管理器(Applications Manager),调度器用来接受ApplicationMaster资源请求,把集群中资源以容器(Container)的形式分配给应用程序;应用程序管理器负责系统中应用程序的管理工作,主要包括应用程序的提交,与调度器协商资源以启动ApplicationMaster,监控ApplicationMaster的状态并在失败时重启。ResourceManager作用概括如下:
- 处理客户端请求
- 监控NodeManager
- 启动/监控ApplicationMaster
- 整个资源的分配与调度
ApplicationMaster作用:
- 为应用程序向ResourceManager申请资源并分配给内部任务
- 任务调度、监控和容错
NodeManager作用:
- 节点的资源管理
- 处理来自ResourceManager的命令
- 处理来自ApplicationMaster的命令,完成任务的启动/停止等
工作流程
1) 用户编写提交应用程序,提交包括ApplicationMaster程序、启动ApplicationMaster命令以及用户程序
2) ResourceManager负责接收和处理客户端的请求,为应用程序分配一个容器,在该容器中启动ApplicationMaster
3) ApplicationMaster创建后向ResourceManager注册
4) ApplicationMaster轮循方式向ResourceManager申请资源
5) ResourceManager以容器的形式向提出申请的ApplicationMaster分配资源
6) 在容器中启动map/reduce任务(MapReduce框架)
7) 每个任务向ApplicationMaster汇报自己的状态和进度
8) 应用程序执行完成后ApplicationMaster向ResourceManager的应用程序管理器注销关闭
一、环境准备
版本说明:VMware虚拟机来构建集群,系统使用的是centos 6.4,Hadoop的版本是2.5.0 ,jdk使用1.8
虚拟机配置说明:
centos01 | centos02 | centos03 | |
ip | 192.168.10.59 | 192.168.10.60 | 192.168.10.61 |
hostname | bigdata.centos01 | bigdata.centos02 | bigdata.centos03 |
HDFS | namenode datanode | datanode | datanode |
yarn | resourceManager nodeManager | nodeManager | nodeManager |
Hadoop下载
http://archive.cloudera.com/cdh5/cdh/5/
http://archive.apache.org/dist/
1.centos单机配置
- 新建用户
# 添加用户
useradd <username>
# 为用户设置密码
passwd <username>
# 重启系统,再使用<username>登录
reboot
- 修改主机名
# 切换到root用户
su root
# 查看当前的主机名
hostname
# 修改主机名
hostname bigdata.centos01
# 修改配置文件,设置永久主机名,修改HOSTNAME配置项
# HOSTNAME=bigdata.centos01
vi /etc/sysconfig/network
# 设置主机名和ip地址的映射
vi /etc/hosts
# 添加如下
# 192.168.10.59 bigdata.centos01
# 重启
reboot
- 配置jdk
# 根目录下新建目录,为方便规范化管理
cd /opt
# 新建softwares(存放软件包),modules(存放Hadoop...)
su root
mkdir softwares
mkdir modules
# 更改两个目录所属用户和用户组
chown -R <username>:<group> softwares
chown -R <username>:<group> modules
# 将下载好的jdk上传至虚拟机/opt/softwares目录,解压
tar xzvf jdk-8u11-linux-x64.tar.gz
# 更名
mv jdk1.8.0_11 jdk8
# 将jdk8移到modules目录
mv jdk8 ../modules
# 配置jdk环境变量
vi /etc/profile
# 增加如下两行
# export JAVA_HOME=/opt/modules/jdk8
# export PATH=$PATH:$JAVA_HOME/bin
reboot
- 下载Hadoop
# 下载Hadoop
wget http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.5.0-cdh5.3.9.tar.gz
# 解压
tar xzvf hadoop-2.5.0-cdh5.3.9.tar.gz
# 更名,移到modules目录
mv hadoop-2.5.0-cdh5.3.9 hadoop
mv hadoop ../modules
# 配置Hadoop环境变量
vi /etc/profile
# 添加如下两行
# export HADOOP_HOME=/opt/modules/hadoop
# export PATH=$PATH:$HADOOP/bin:$HADOOP/sbin
# 重启
reboot
2.虚拟机克隆
步骤:
在VMware中右击要克隆的虚拟机 -> 管理 -> 克隆
重复此步骤,依次克隆出另外两台虚拟机
- centos01 配置:
su root
# 配置另外两台虚拟机的主机名和ip的映射
vi /etc/hosts
# 添加如下两行
192.168.10.60 bigdata.centos02
192.168.10.61 bigdata.centos03
- centos02 配置
# 事先修改虚拟机固定的ip为192.168.10.60
su root
# 修改主机名,由于是从centos01克隆过来的,所以还是centos01的配置
hostname bigdata.centos02
# 永久修改主机名
vi /etc/sysconfig/network
# 修改HOSTNAME如下
# HOSTNAME=bigdata.centos02
# 配置另外两台虚拟机的主机名和ip的映射
vi /etc/hosts
# 添加如下两行
192.168.10.60 bigdata.centos02
192.168.10.61 bigdata.centos03
- centos03配置
# 事先修改虚拟机固定的ip为192.168.10.61
su root
# 修改主机名,由于是从centos01克隆过来的,所以还是centos01的配置
hostname bigdata.centos03
# 永久修改主机名
vi /etc/sysconfig/network
# 修改HOSTNAME如下
# HOSTNAME=bigdata.centos03
# 配置另外两台虚拟机的主机名和ip的映射
vi /etc/hosts
# 添加如下两行
192.168.10.60 bigdata.centos02
192.168.10.61 bigdata.centos03
二、搭建HDFS集群
1.配置文件修改
先修改centos01的Hadoop配置,在通过scp命令同步到其他机器
# 切换至hadoop配置文件所在文件夹
cd /opt/modules/hadoop/etc/hadoop
vi hadoop-env.sh
# 修改以下内容
# export JAVA_HOME=/opt/modules/jdk8
vi core-site.xml
# 添加如下内容
#<configuration>
# <property>
# <name>fs.defaultFS</name>
# <value>hdfs://bigdata.centos01:9000</value>
# </property>
#</configuration>
vi hdfs-site.xml
# 添加以下内容
#<configuration>
# <!-- 数据副本数 -->
# <property>
# <name>dfs.replication</name>
# <value>2</value>
# </property>
#</configuration>
# 添加节点机器
vi slaves
# 添加centos01、centos02、centos03作为datanode
# bigdata.centos01
# bigdata.centos02
# bigdata.centos03
# 将etc/hadoop配置文件同步到centos02
scp -r etc/hadoop <username>@bigdata.centos02:/opt/modules/hadoop/etc
# 将etc/hadoop配置文件同步到centos03
scp -r etc/hadoop <username>@bigdata.centos03:/opt/modules/hadoop/etc
2.启动服务
- 格式化(3台虚拟机都执行)
bin/hdfs namenode -format
- 启动namenode(centos01执行)
sbin/hadoop-daemon.sh start namenode
- 启动datanode(3台虚拟机都执行)
sbin/hadoop-daemon.sh start datanode
3.测试
在浏览器地址栏输入如下url:
http://bigdata.centos01:50070
结果如图所示:
datanode子节点运行截图:
三、配置yarn和mapreduce
1.配置文件修改
- centos01 yarn-site.xml 的修改
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 配置resourcemanager节点机器 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>bigdata.centos01</value>
</property>
<!-- 日志聚集 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志的生命周期,单位秒 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>10000</value>
</property>
</configuration>
- centos01 mapred-site.xml 的修改
<configuration>
<!-- 配置mapreduce任务运行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 配置记录已运行完的MapReduce日志地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>bigdata.centos01:10020</value>
</property>
<!-- 日志查看 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>bigdata.centos01:19888</value>
</property>
</configuration>
- 将配置分发到其他两台机器
# 将etc/hadoop配置文件同步到centos02
scp -r etc/hadoop <username>@bigdata.centos02:/opt/modules/hadoop/etc
# 将etc/hadoop配置文件同步到centos03
scp -r etc/hadoop <username>@bigdata.centos03:/opt/modules/hadoop/etc
2.启动服务
- 启动resourcemanager(centos01执行)
sbin/yarn-daemon.sh start resourcemanager
- 启动nodemanager(三台虚拟机执行)
sbin/yarn-daemon.sh start nodemanager
- 启动jobhistory
sbin/mr-jobhistory-daemon.sh start historyserver
3.测试
在浏览器地址栏输入如下url:
http://bigdata.centos01:8088
结果如图所示:
四、其他设置
- core-site.xml
<!-- 在网页界面访问数据使用的用户名 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>username</value>
</property>
<!-- 设置Hadoop其他临时目录的基础目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/hadoop-2.5.0/data/tmp</value>
</property>
- hdfs-site.xml
<!-- 配置不开启权限检查 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
配置完成后整体分发到所有机器,启动hdfs、yarn、jobhistory.(前面有命令介绍)
五、mapreduce任务测试
1.新建测试文件并上传至HDFS
- 在 /opt/datas 下新建 wordcount.input 文件,内容如下:
hadoop hive
hive spark
hbase java
java spark
- 将 wordcount.input 上传至HDFS
bin/hdfs dfs -mkdir -p /user/data
# 上传
bin/hdfs dfs -put /opt/datas/wordcount.input /user/data
2.运行测试单词统计任务
- 运行mapred任务
# 如果输出目录不存在,yarn会自己新建
bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.9.jar wordcount /user/data/wc.input /user/data/output/wordcount
- 查看运行结果
bin/hdfs dfs -text /user/data/output/wordcount/part*