文章目錄
本案例基於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/,顯示界面如下:
集羣啓動成功。