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.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、配置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/,顯示界面如下:
在這裏插入圖片描述
集羣啓動成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章