任务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的实例名,在【设置主机】页面的实例名输入框中修改。
在【设置主机】页面点击【高级设置】,修改主机名。
其他两台CVM主机的实例名和主机名分别修改为hadoop-core1
和hadoop-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实例如下图所示。
在实例列表界面,点击实例名为hadoop-master
的CVM实例右侧的【登录】按钮,点击标准登录方式下的【立即登录】。
选择购买CVM时设置的登录方式,输入密码或选择密钥。
登录后的界面。
2.配置ssh免密码登录
配置hosts文件。
vi /etc/hosts
添加下面内容:
<hadoop-masterCVM内网地址> hadoop-master
<hadoop-core1CVM内网地址> hadoop-core1
<hadoop-core2CVM内网地址> hadoop-core2
内网地址可以在控制台查看。
生成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免密登录配置结果,能够直接登录相应CVM则说明配置成功。
ssh hadoop-master
exit
ssh hadoop-core1
exit
ssh hadoop-core2
exit
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
保存后,使其生效。
source ~/.bash_profile
测试变量配置,如果出现下图的结果,说明环境变量配置成功。
java -version
下载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
保存后,使其生效。
source ~/.bash_profile
测试配置是否生效。
hadoop version
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
配置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>
复制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>
配置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>
修改slaves
文件,并保存。
vi $HADOOP_HOME/etc/hadoop/slaves
修改为:
hadoop-master
hadoop-core1
hadoop-core2
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
登录到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
5.启动集群
HDFS文件系统格式化。
hdfs namenode -format
启动集群,这时候会提示输入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
执行结果。
可以看到,我们的执行结果被保存到out文件夹中,所以现在需要将文件拉取到本地,拉取后可以看到本地有out文件夹。
hadoop fs -get /user/root/out
ls
ls ~/out
这时,输出的part-00000
就是任务输出的结果,如果输出结果更大,那么也会出现part-00001
,part-00002
等,以此类推。所以我们使用通配符来根据词频进行排序。
cat out/part-* | sort -rnk2,2 > sorted
输出最后一次排序中,每行长度大于等于2的第一个参数(也就是词语),并输出前50行。也就是说,我们输出了除单个字以及字符之外的前50的词频,如下图所示。
cat sorted | awk '{if(length($1)>=2) print $0}' | head -n 50
至此,我们就已经完成了自建Hadoop集群统计《水浒传》词频的任务了,
接下来我们将使用腾讯云弹性MapReduce提供的Hadoop集群来完成同样的任务。
学员评价