2、hadoop的运行模式(centos+docker+hadoop)


本案例基于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.137172.17.0.2172.17.0.3
HDFSNameNode
DataNode
DataNodeSecondaryNameNode
DataNode
YARNResourceManager
NodeManager
NodeManagerNodeManager

二、集群配置

下面操作均在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/,显示界面如下:
在这里插入图片描述
集群启动成功。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值