Hadoop介绍以及集群搭建

目录

知识要点

MapReduce

策略理念

工作流程

分片(split)的划分

map任务数量和reduce任务数量的确定

shuffle过程

YARN

架构概述

工作流程

一、环境准备

1.centos单机配置

2.虚拟机克隆

二、搭建HDFS集群

1.配置文件修改

2.启动服务

3.测试

三、配置yarn和mapreduce

1.配置文件修改

2.启动服务

3.测试

四、其他设置

五、mapreduce任务测试

1.新建测试文件并上传至HDFS

2.运行测试单词统计任务

参考文章


知识要点

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

虚拟机配置说明:

 centos01centos02centos03
ip192.168.10.59192.168.10.60192.168.10.61
hostnamebigdata.centos01bigdata.centos02bigdata.centos03
HDFS

namenode

datanode

datanodedatanode
yarn

resourceManager

nodeManager

nodeManagernodeManager

jdk下载

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*

参考文章

MapReduce shuffle过程详解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值