26分钟

任务2 使用自建Hadoop集群执行任务

任务目的

本任务将通过Apache Hadoop 2.6.0-cdh5.15.1发行版本来搭建以三台CVM为节点的Hadoop集群,其中一台作为Master节点,另外两台作为Core节点。搭建并启动集群后,将通过Hadoop Streaming提交Map/Reduce作业,完成对《水浒传》的词频统计。

任务步骤

1.准备集群所需CVM并登录Master节点

不熟悉如何新建CVM的学员请参考课程《快速搭建网站实战》的实验步骤任务1来新建CVM实例。3台CVM地域相同,以保证内网通信速度。

为方便在控制台识别相应CVM在集群中的角色,可以修改3个Linux CVM的实例名,在【设置主机】页面的实例名输入框中修改。

修改Master实例名

在【设置主机】页面点击【高级设置】,修改主机名。

修改Master主机名

其他两台CVM主机的实例名和主机名分别修改为hadoop-core1hadoop-core2

本实验修改的3个Linux CVM实例名以及主机名如下:

修改项

Master

Core1

Core2

实例名

hadoop-master

hadoop-core1

hadoop-core2

主机名

hadoop-master

hadoop-core1

hadoop-core2

本实验所使用的3台CVM配置如下(供参考):

配置项

配置

地域

南京

网络

Default-VPC(默认)/Default-Subnet(默认)

实例类型

标准型S5

vCPU及内存

1核2GB

镜像类型

公共镜像CentOS7.6 64位

公网带宽

2Mbps

安全组

放通全部端口

新建的三台CVM实例如下图所示。

创建好的CVM

在实例列表界面,点击实例名为hadoop-master的CVM实例右侧的【登录】按钮,点击标准登录方式下的【立即登录】。

登录CVM

选择购买CVM时设置的登录方式,输入密码或选择密钥。

登录方式

登录后的界面。

登录后的CVM

2.配置ssh免密码登录

配置hosts文件。

vi /etc/hosts

添加下面内容:

<hadoop-masterCVM内网地址> hadoop-master
<hadoop-core1CVM内网地址> hadoop-core1
<hadoop-core2CVM内网地址> hadoop-core2
修改hosts文件

内网地址可以在控制台查看。

查看内网地址

生成ssh密钥。输入ssh-keygen,敲三次回车。

生成密钥

配置ssh免密登录。

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh-copy-id -i .ssh/id_rsa hadoop-core1
ssh-copy-id -i .ssh/id_rsa hadoop-core2
配置ssh免密登录core1
配置ssh免密登录core2

测试ssh免密登录配置结果,能够直接登录相应CVM则说明配置成功。

ssh hadoop-master
exit
ssh hadoop-core1
exit
ssh hadoop-core2
exit
测试ssh免密登录配置结果

3.在Master节点安装相关依赖以及Hadoop

安装pip以及jieba模块。

yum install python-pip -y
pip install jieba -i http://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn

安装JDK8。

yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y

添加环境变量。

vi ~/.bash_profile

在其中插入:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$PATH:$JAVA_HOME/bin
添加JAVA环境变量

保存后,使其生效。

source ~/.bash_profile

测试变量配置,如果出现下图的结果,说明环境变量配置成功。

java -version
测试JAVA版本

下载hadoop-2.6.0-cdh5.15.1,并解压到/usr/local/文件夹下(解压需要等待30秒左右)。

wget https://course-public-resources-1252758970.cos.ap-chengdu.myqcloud.com/%E5%AE%9E%E6%88%98%E8%AF%BE/%E5%BC%B9%E6%80%A7MapReduce%E5%AF%B9%E5%B0%8F%E8%AF%B4%E5%90%8D%E8%91%97%E8%AF%8D%E9%A2%91%E5%88%86%E6%9E%90/hadoop-2.6.0-cdh5.15.1.tar.gz
tar -xzvf hadoop-2.6.0-cdh5.15.1.tar.gz -C /usr/local/

下载并解压完毕后,配置Hadoop环境变量。

vi ~/.bash_profile

在其中插入:

export HADOOP_HOME=/usr/local/hadoop-2.6.0-cdh5.15.1
export PATH=$PATH:$HADOOP_HOME/bin
添加Hadoop环境变量

保存后,使其生效。

source ~/.bash_profile

测试配置是否生效。

hadoop version
查看Hadoop版本

Hadoop环境配置,注释原本JAVA_HOME语句,插入export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk

vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh

插入:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
Hadoop环境配置

配置core-site.xml文件,并保存。

vi $HADOOP_HOME/etc/hadoop/core-site.xml

添加如下配置:

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop-master:8020</value>
    </property>
</configuration>
core-site.xml文件

复制mapred-site.xml.template文件为mapreduce-site.xml并配置,配置完毕后保存。

cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml
vi $HADOOP_HOME/etc/hadoop/mapred-site.xml

添加如下配置:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
mapred-site.xml文件

配置yarn-site.xml文件,并保存。

vi $HADOOP_HOME/etc/hadoop/yarn-site.xml

添加如下配置:

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop-master</value>
    </property>
</configuration>
yarn-site.xml文件

修改slaves文件,并保存。

vi $HADOOP_HOME/etc/hadoop/slaves

修改为:

hadoop-master
hadoop-core1
hadoop-core2
slaves文件

4.分发Hadoop环境

分发Hadoop文件,时间可能会有点长,请耐心等待。

scp -r $HADOOP_HOME root@hadoop-core1:/usr/local/
scp -r $HADOOP_HOME root@hadoop-core2:/usr/local/

分发环境变量配置文件。

scp -r ~/.bash_profile root@hadoop-core1:/data
scp -r ~/.bash_profile root@hadoop-core2:/data

登录到Core1,安装JDK8,pip,jieba模块,并使环境变量配置文件生效,测试环境变量,并退出。

ssh hadoop-core1
cat /data/.bash_profile > .bash_profile
yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y
yum install python-pip -y
pip install jieba -i http://pypi.tuna.tsinghua.edu.cn/simple/  --trusted-host pypi.tuna.tsinghua.edu.cn
source ~/.bash_profile
java -version
hadoop version
exit
Core1配置测试

登录到Core2,安装JDK8,pip,jieba模块,并使环境变量配置文件生效,测试环境变量,并退出。

ssh hadoop-core2
cat /data/.bash_profile > .bash_profile
yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y
yum install python-pip -y
pip install jieba -i http://pypi.tuna.tsinghua.edu.cn/simple/  --trusted-host pypi.tuna.tsinghua.edu.cn
source ~/.bash_profile
java -version
hadoop version
exit
Core2配置测试

5.启动集群

HDFS文件系统格式化。

hdfs namenode -format
格式化HDFS文件系统

启动集群,这时候会提示输入yes,请输入yes。

$HADOOP_HOME/sbin/start-all.sh
启动集群

分别查看集群中各节点java进程状态(Hadoop应用),集群配置为:

Master

Core1

Core2

NameNode、ResourceManager、SecondaryNameNode、NodeManager、DataNode

NodeManager、DataNode

NodeManager、DataNode

这些应用是HDFS以及YARN的主要应用,但本次实验的重点为词频分析,所以不再赘述各应用具体作用,感兴趣的学员可以自行检索。

jps
ssh hadoop-core1
jps
exit
ssh hadoop-core2
jps
exit
查看集群状态

创建mapper.py文件与reducer.py文件,内容分别为任务1中的mapper.py文件与reducer.py文件,并添加可执行权限。

vi mapper.py
vi reducer.py
chmod +x mapper.py
chmod +x reducer.py

下载小说。

wget https://course-public-resources-1252758970.cos.ap-chengdu.myqcloud.com/%E5%AE%9E%E6%88%98%E8%AF%BE/%E5%BC%B9%E6%80%A7MapReduce%E5%AF%B9%E5%B0%8F%E8%AF%B4%E5%90%8D%E8%91%97%E8%AF%8D%E9%A2%91%E5%88%86%E6%9E%90/shuihuzhuan.txt

这时目录结构如下:

ls
目录结构

此时可以先测试脚本是否可以正常执行。

cat shuihuzhuan.txt | ./mapper.py |./reducer.py

输出以下结果即为正常执行(可以使用Ctrl+C打断执行),如果无法执行,请检查脚本是否添加可执行权限,或者检查代码复制是否缺少某些部分。

测试脚本

创建执行MapReduce作业所需的HDFS目录。

hdfs dfs -mkdir -p /user/root

上传小说到该HDFS目录。

hdfs dfs -put ~/shuihuzhuan.txt /user/root

进行词频分析,这里解释一下参数含义:

  • -mapper:后面跟Mapper的可执行文件
  • -reducer:后面跟Reducer的可执行文件
  • -file:使Mapper,Reducer可执行文件在计算节点上本地可用,也就是说,可以使Core也运行此任务,达到分布式计算的目的。(前提是要有运行环境)
  • -input:输入文件或文件夹路径作为标准输入给Mapper可执行程序
  • -output:后面跟输出的文件夹,文件夹被保存到HDFS的/user/<username>/<文件夹名>
hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.6.0-cdh5.15.1.jar\
 -mapper ~/mapper.py -file ~/mapper.py\
 -reducer ~/reducer.py -file ~/reducer.py \
 -input shuihuzhuan.txt -output out

执行结果。

执行结果1
执行结果2

可以看到,我们的执行结果被保存到out文件夹中,所以现在需要将文件拉取到本地,拉取后可以看到本地有out文件夹。

hadoop fs -get  /user/root/out
ls
输出文件夹
ls ~/out
输出文件

这时,输出的part-00000就是任务输出的结果,如果输出结果更大,那么也会出现part-00001part-00002等,以此类推。所以我们使用通配符来根据词频进行排序。

cat out/part-* | sort -rnk2,2 > sorted

输出最后一次排序中,每行长度大于等于2的第一个参数(也就是词语),并输出前50行。也就是说,我们输出了除单个字以及字符之外的前50的词频,如下图所示。

cat sorted | awk '{if(length($1)>=2) print $0}' | head -n 50
词频前50

至此,我们就已经完成了自建Hadoop集群统计《水浒传》词频的任务了,

接下来我们将使用腾讯云弹性MapReduce提供的Hadoop集群来完成同样的任务。