文章目录
本案例基于centos + docker + hadoop进行测试。
上一节介绍了hadoop的环境搭建,以及hadoop的wordcount示例的本地运行模式,本章节介绍hadoop的其它两种运行模式,依然以wordcount为例。
hadoop包括3中运行模式:本地运行模式、伪分布式模式、完全分布式模式
- List item:本地运行模式:没有启动hadoop的守护进程,所有的程序都运行在本地的JVM中,适合开发学习和调试mapreduce程序。
- 伪分布式模式:启动hadoop的守护进程,模拟一个简单的集群,伪分布式集群可以配置只有一台机器,适用于学习和调试。
伪分布式模式
以wordcount为例,下面配置伪分布式运行集群模式。
一、启动HFDS运行MapReduce程序
1、配置集群的JAVA_HOME环境
在hadoop的安装目录下的etc目录下有一个hadoop-env.sh文件(/opt/module/hadoop-2.7.2/etc/hadoop/hadoop-env.sh),添加JAVA_HOME环境路径,如下:
export JAVA_HOME=/opt/module/jdk1.8.0_144
2、配置core-site.xml
在/opt/module/hadoop-2.7.2/etc/hadoop/hadoop-env.sh文件中添加如下配置:
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://lzj01:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
其中lzj01为本案例ip地址
3、配置hdfs-site.xml
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
4、启动集群
- 格式化NameNode(第一次启动时格式化,以后就不要总格式化)
启动命令:hdfs namenode -format - 启动NameNode
启动命令:hadoop-daemon.sh start namenode - 启动DataNode
启动命令:hadoop-daemon.sh start datanode
5、检验集群是否启动成功
执行jps命令,结果如下:
6、操作集群
- 在HDFS文件系统上创建一个input文件夹
执行命令:hdfs dfs -mkdir -p /user/lzj/input
- 将上一节中的wc.input测试文件上传到文件系统上
执行命令:hdfs dfs -put wcinput/wc.input /user/lzj/input/
- 查看上传到集群上的文件
执行命令:hdfs dfs -ls /user/lzj/input/
或hdfs dfs -cat /user/lzj/ input/wc.input
7、执行MapReduce程序进行计算
执行命令:hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/lzj/input/ /user/lzj/output
8、查看运行结果
执行命令:hdfs dfs -cat /user/lzj/output/part-r-00000
查看结果如下
bu 1
chen 3
chuan 1
dao 1
de 1
deng 1
feng 1
hao 1
hong 1
hua 2
huang 2
jia 1
jie 4
ju 1
jun 1
lang 1
li 3
lin 1
liu 1
long 1
lun 1
mao 1
ning 1
qi 2
qian 1
rong 1
sheng 1
song 1
su 1
wang 3
xu 1
xue 3
xun 2
ya 1
yi 2
you 1
yu 1
yuan 1
zhang 2
zheng 1
zhi 2
zhong 1
zhou 1
zhuang 1
9、可以将分析结果文件从文件系统上下载到本地
执行命令:hdfs dfs -get /user/lzj/output/part-r-00000 ./wcoutput/
执行命令后,可以在当前目录下wcoutput目录下查看到从文件系统上下载的文件。
10、可以删除文件系统上的文件或文件夹
执行命令:hdfs dfs -rm -r /user/lzj/output
删除文件系统上的output目录以及其下的文件。
11、可以从网页端查看文件系统中的文件
本案例访问地址:http://lzj01:50070
其中lzj01为运行hadoop的ip地址,50070为hdfs的端口,访问结果如下:
二、启动Yarn运行MapReduce程序
下面配置伪分布式集群,启动yarn运行MapReduce程序,在yarn上执行wordcount案例。
1、配置集群
(a)配置yarn-env.sh
在/opt/module/hadoop-2.7.2/etc/hadoop目录下找到yarn-env.sh文件,并在其中加入JAVA_HOME环境:
export JAVA_HOME=/opt/module/jdk1.8.0_144
(b) 配置yarn-site.xml
在/opt/module/hadoop-2.7.2/etc/hadoop目录下找到yarn-site.xml文件,并在其中添加如下配置:
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>lzj01</value>
</property>
其中lzj01为本宿主机ip地址。
(c) 配置mapred-env.sh
在/opt/module/hadoop-2.7.2/etc/hadoop目录下找到mapred-env.sh文件,并在其中添加java环境:
export JAVA_HOME=/opt/module/jdk1.8.0_144
(d) 配置mapred-site.xml
在/opt/module/hadoop-2.7.2/etc/hadoop目录下找到mapred-site.xml.template文件并重命名为mapred-site.xml文件,在mapred-site.xml文件中配置MapReduce的运行方式:
<!-- 指定MR运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
2、启动集群
(a)在启动集群前必须保证NameNode和DataNode已经启动,通过jps观察如下:
(b) 启动ResourceManager
(c)启动NodeManager
3、集群操作
(a)访问yarn页面
在浏览器中访问http://lzj01:8088/cluster
, 8088为访问yarn端口。页面如下:
其中显示了集群的配置资源和job的执行状态。
(b) 删除文件系统上的output下的文件
在执行案例前,要把之前案例生成的output文件删除掉,否则案例会报错,提示文件已经存在。执行删除命令:
hdfs dfs -rm -R /user/lzj/output
© 执行案例wordcount 的MapReduce程序
wordcount案例的执行命令如下:hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/lzj/input /user/lzj/output
执行结束后,访问yarn的网页界面如下:
当网页中红色标记的progress进度为100%时,表示执行完毕,可以从网页中查看任务执行的状态、节点等信息。
三、配置历史服务器
为了查看MapReduce的历史运行情况,需要配置历史服务器,配置步骤如下:
1、配置mapred-site.xml文件
在mapred-site文件中添加如下配置:
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>lzj01:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>lzj01:19888</value>
</property>
其中lzj01为运行程序的ip地址
2、启动历史服务器
启动历史服务器,执行命令:
mr-jobhistory-daemon.sh start historyserver
3、查看历史服务器是否启动
执行jps命令查看历史服务器运行状态
4、访问历史服务器JobHistory
访问http://lzj01:19888/jobhistory,其中lzj01为配置历史服务器的域名。
由于只运行了一个实例,所以只有一个唯一的job id的任务。
四、配置日志的聚集功能
日志聚集:每次运行完程序后,都会在本地生成log文件,也只能在一台宿主机上查看日志,日志聚集功能就是把应用完成后生成的日志信息上传到HFDS分布式文件系统上,这样集群上的所有宿主机都可以查看日志信息。
配置日志聚集功能步骤如下:
1、配置文件yarn-site.xml
在yarn-site.xml文件中添加如下内容:
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置2天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>172800</value>
</property>
2、重启NodeManager 、ResourceManager和HistoryManager
首先执行关闭命令,分别执行如下命令:
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
mr-jobhistory-daemon.sh start historyserver
3、执行wordcount之前,先删除hdfs分布式文件系统上的输出文件夹,因为执行案例后会重新生成
执行命令:
hdfs dfs -rm -R /user/lzj/output
4、查看日志
访问:http://lzj01:19888/jobhistory
图中红框选中的job id为本案例执行的job,点击,可查看job的详细信息
点击图中橙色标记的logs按钮,就可以查看案例执行的详细日志信息
完全分布式运行模式
一、集群部署介绍
本节介绍完全分布式,也是真正实战时用到的。本例中搭建一个包括三台容器的集群,分别为192.168.85.137、172.17.0.2、172.17.0.3。集群按一下方式进行配置
192.168.85.137 | 172.17.0.2 | 172.17.0.3 | |
---|---|---|---|
HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
YARN | ResourceManager NodeManager | NodeManager | NodeManager |
二、集群配置
下面操作均在192.168.85.137上进行操作
1、核心配置文件core-site.xml
用vi打开core-site.xml文件,添加如下内容:
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.85.137:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
NameNode部署在192.168.85.137容器中。
2、配置HDFS
用vi打开hadoop-env.sh文件,添加如下内容:
export JAVA_HOME=/opt/module/jdk1.8.0_144
用vi打开hdfs-site.xml文件,添加内容如下:
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>172.17.0.3:50090</value>
</property>
把hdfs的辅助接点部署在172.17.0.3容器中。
3、配置YARN
用vi打开yarn-env.sh文件,添加如下内容:
export JAVA_HOME=/opt/module/jdk1.8.0_144
用vi打开yarn-site.xml文件,添加如下内容:
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.address</name>
<value>192.168.85.137</value>
</property>
将yarn的资源管理节点ResourceManager部署在192.168.85.137中。
4、配置MapReduce
配置mapred-env.sh,用vi 打开mapred-env.sh文件,添加如下内容:
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置mapred-site.xml,hadoop中默认文件是mapred-site.xml.template,复制成需要的名字,执行cp mapred-site.xml.template mapred-site.xml
用vi打开mapred-site.xml文件,添加如下内容:
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
三、镜像制作与容器启动
上一步全部配置均在192.168.85.137机器上进行的配置,下面把上述所有配置做成镜像,然后通过镜像启动容器,避免重复繁琐的配置hadoop,关于本例hadoop镜像制作请参考https://blog.csdn.net/u010502101/article/details/97697397,dockerfile内容如下:
#version 0.1
FROM centos
WORKDIR /opt
RUN mkdir module
ADD . /opt/module/
#set java enviroment
RUN echo "#JAVA_HOME" >> /root/.bashrc
RUN echo "export JAVA_HOME=/opt/module/jdk1.8.0_144" >> /root/.bashrc
RUN echo "export PATH=\$PATH:\$JAVA_HOME/bin" >> /root/.bashrc
#set hadoop enviroment
RUN echo "#HADOOP_HOME" >> /root/.bashrc
RUN echo "export HADOOP_HOME=/opt/module/hadoop-2.7.2" >> /root/.bashrc
RUN echo "export PATH=\$PATH:\$HADOOP_HOME/bin" >> /root/.bashrc
RUN echo "export PATH=\$PATH:\$HADOOP_HOME/sbin" >> /root/.bashrc
#install net tools, for using ping
RUN yum -y install net-tools
#set host
RUN echo "172.17.0.3 hadoop003" >> /etc/hosts
RUN echo "172.17.0.2 hadoop002" >> /etc/hosts
RUN echo "192.168.85.137 fanhao-test" >> /etc/hosts
#install which tool, hadoop use it
RUN yum -y install which
#install ssh
RUN yum -y install openssh*
#RUN systemctl start sshd
#install service
#RUN yum -y install initscripts
#解决Docker中CentOS镜像无法使用systemd的问题
#ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]
dockerfile文件与hadoop安装处于同一层目录。
1、执行build命令,制作镜像
docker build -t="softwarebird/hadoop:0.4" .
2、启动容器
用制作的softwarebird/hadoop:0.4镜像分别启动名为hadoop1和hadoop2的容器
启动hadoop1
docker run -itd --privileged=true --name hadoop1 softwarebird/hadoop:0.4
docker exec -it 7e4906d8751f /bin/bash
另外打开一个session,启动hadoop2
docker run -itd --privileged=true --name hadoop2 softwarebird/hadoop:0.4
docker exec -it efea0d9e0841 /bin/bash
3、配置/etc/hosts 【非必须配置】
在hosts文件添加如下配置:
192.168.85.137 lzj
172.17.0.2 hadoop002
172.17.0.3 hadoop003
4、重启ssh服务
在192.168.85.137 、172.17.0.2和172.17.0.3中分别重启ssh服务,命令如下:
systemctl start sshd
5、配置容器密码
为了后面配置ssh,进行免密码互相登录,需要配置容器hadoop2和hadoop3的密码,192.168.85.137为宿主机,已有登录密码,不需要再配
分别在hadoop2和haddop2中执行passwd命令,配置密码。
6、配置ssh免密登录
切换到192.168.85.137宿主机上执行systemctl start sshd
,重启ssh服务。
生成公钥和私钥,执行命令
ssh-keygen -t rsa
将192.168.85.137上的公钥copy到其它机器中,执行命令:
ssh-copy-id 192.168.85.137
ssh-copy-id 172.17.0.2
ssh-copy-id 172.17.0.3
然后分别切换到172.17.0.2和172.17.0.3容器中,分别执行systemctl start sshd
,然后分别执行下面命令:
ssh-keygen -t rsa
ssh-copy-id 192.168.85.137
ssh-copy-id 172.17.0.2
ssh-copy-id 172.17.0.3
四、启动集群
1、配置slaves
分别打开192.168.85.137、172.17.0.2、172.17.0.3集群中hadoop中配置文件slaves,并添加如下内容:
192.168.85.137
172.17.0.2
172.17.0.3
表示集群由这三个机器组成。
2、启动hdfs集群
切换到192.168.85.137宿主机,首次启动集群前,需要格式化namenode,执行命令hdfs namenode -format
启动hdfs,执行命令:
start-dfs.sh
hdfs启动后,执行jps命令,显示如下:
可知192.168.85.137中部署了NameNode和DataNode。
切换到172.17.0.2中,执行jps命令,显示如下:
可知172.17.0.2中只部署了DataNode。
切换到172.17.03中,执行jps命令,显示如下:
可知172.17.0.3中,除启动了DataNode外,还启动了备用节点SecondaryNameNode节点。
3、启动yarn
切换到192.168.85.137中,执行start-yarn.sh启动yarn,然后用jps命令查看进程,显示如下:
可知,192.168.85.137除启动hdfs进程外,又启动了ResourceManager和NodeManager进程。
切换到172.17.0.2容器中,执行jps命令查看,显示如下:
可见172.17.0.2中除启动hdfs进程外,又启动了NodeManager进程。
切换到172.17.0.3容器中,执行jps命令,显示如下:
可见172.17.0.3容器中除启动hdfs进程外,也只是启动了NodeManager进程。
4、验证集群启动是否成功
在浏览器中输入http://192.168.85.137:50070/,显示界面如下:
集群启动成功。