之前用虛擬機搭建Hadoop集群(包括偽分布式和完全分布式:Hadoop之偽分布式安裝),但是這樣太消耗資源了,自學了Docker也來操練一把,用Docker來構建Hadoop集群,這里搭建的Hadoop主要服務於之前沒有完成的項目:網站日志流量分析系統(該系統目前用虛擬機實現了離線分析模塊,實時分析由於資源問題尚未完成,我想這次不擔心了)考慮到阿里雲ECS對於我個人來說,成本有點太高了,但是自從學了Dokcer以后,我再也不怕了,用這一台就夠啦,哈哈哈哈……下面開始吧!安裝過程較長,so please be patient!
一、環境准備
①阿里雲輕量應用服務器(學生價很實惠的~),我的配置:1C、2G、40G(足夠了)
②CentOS7.3,內核4.4(可用uname -r 查看,自帶的3.10.x可能會導致Docker運行不穩定,鄙人踩過的坑,可參考鄙人另一篇博客:從centos7鏡像到搭建kubernetes集群(kubeadm方式安裝)里面有關於升級內核命令)
③Docker版本:19.03.5(安裝參考官網即可,鏡像加速可參考鄙人另一篇博客:Docker配置阿里雲鏡像源)
④JDK1.8:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
⑤Hadoop:http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz (ps:source為源碼包,binary為安裝包)
二、構建ssh-centos鏡像
1、創建對應目錄
mkdir centos-ssh cd centos-ssh vim Dockerfile #這里docker build時缺省名為Dockerfile
2、編寫Dockerfile

FROM centos # 鏡像的作者 MAINTAINER xiedong # 安裝openssh-server和sudo軟件包,並且將sshd的UsePAM參數設置成no RUN yum install -y openssh-server sudo RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config #安裝openssh-clients RUN yum install -y openssh-clients # 添加測試用戶root,密碼root,並且將此用戶添加到sudoers里 RUN echo "root:root" | chpasswd RUN echo "root ALL=(ALL) ALL" >> /etc/sudoers RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key # 啟動sshd服務並且暴露22端口 RUN mkdir /var/run/sshd EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]
3、構建鏡像
docker build -t 'xd/centos-ssh' . #注意別忘記末尾的點
三、構建jdk1.8鏡像
1、創建目錄並上傳JDK至該目錄
mkdir centos-ssh-root-jdk
cd centos-ssh-root-jdk
2、編輯Dockefile(docker build 缺省名為Dockerfile)
#基於上一個ssh鏡像構建
FROM xd/centos-ssh
#拷貝並解壓jdk ADD jdk-8u231-linux-x64.tar.gz /usr/local/ RUN mv /usr/local/jdk1.8.0_231 /usr/local/jdk1.8 ENV JAVA_HOME /usr/local/jdk1.8 ENV PATH $JAVA_HOME/bin:$PATH
3、構建jdk1.8鏡像
docker build -t 'xd/centos-jdk' .
四、構建hadoop鏡像
1、創建目錄並上傳Hadoop安裝包
mkdir centos-ssh-root-jdk-hadoop
cd centos-ssh-root-jdk-hadoop
2、編寫Dockerfile
FROM xd/centos-jdk ADD hadoop-2.7.7.tar.gz /usr/local RUN mv /usr/local/hadoop-2.7.7 /usr/local/hadoop ENV HADOOP_HOME /usr/local/hadoop ENV PATH $HADOOP_HOME/bin:$PATH
3、構建鏡像
docker build -t 'xd/hadoop' .
五、啟動容器並固定IP
1、集群規划
主節點:hadoop0 ip:192.168.2.10
從節點1:hadoop1 ip:192.168.2.11
從節點2:hadoop2 ip:192.168.2.12
ps:這里Docker容器重啟后IP會發生變化,所以需要給Docker設置固定IP,使用pipework給docker固定ip
2、啟動容器
分別為hadoop0、hadoop1、hadoop2
docker run --name hadoop0 --hostname hadoop0 -d -P -p 50070:50070 -p 8088:8088 xd/hadoop #hadoop0對外開放端口50070和8088
docker run --name hadoop1 --hostname hadoop1 -d -P xd/hadoop
docker run --name hadoop2 --hostname hadoop2 -d -P xd/hadoop
docker ps查看剛剛啟動的3個容器
3、固定IP
docker容器重啟以后ip會發生變化,所以這里通過pipework給docker固定ip,pipework下載地址:https://github.com/jpetazzo/pipework
①上傳、解壓並改名該壓縮包
unzip pipework-master.zip mv pipework-master pipework cp -rp pipework/pipework /usr/local/bin/
②安裝birdge-utils
yum -y install bridge-utils
③創建網絡
brctl addbr br0 ip link set dev br0 up ip addr add 192.168.2.1/24 dev br0
④設置固定IP
pipework br0 hadoop0 192.168.2.10/24 pipework br0 hadoop1 192.168.2.11/24 pipework br0 hadoop2 192.168.2.12/24
⑤驗證
分別ping這3個ip即可驗證ip是否設定成功
六、集群搭建
ps:以下操作均是對hadoop0主節點配置(可參考博主之前寫的虛擬機內搭建的Hadoop集群:Hadoop之偽分布式安裝)----還是那條路子:配置主機名與IP映射、ssh免密登錄……等。
1、進入容器
docker exec -it hadoop0 /bin/bash (當然也可以用attach進入)
2、配置主機名與IP映射(3個節點)
192.168.2.10 hadoop0 192.168.2.11 hadoop1 192.168.2.12 hadoop2
3、ssh免密登錄
ssh-keygen #剩下的一路回車即可 ssh-copy-id hadoop0 #根據提示輸入yes以及主機密碼,開頭我們設置的是root/root
ssh-copy-id hadoop1
ssh-copy-id hadoop2
4、hadoop的相關配置
進入/usr/local/hadoop/etc/hadoop目錄,涉及的配置文件有:core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml
①配置hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.8 #修改JAVA_HOME
②core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop0:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> </property> <property> <name>fs.trash.interval</name> <value>1440</value> </property> </configuration>
③hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> </configuration>
④yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>
⑤mapred-site.xml(需要修改模板:mv mapred-site.xml.template mapred-site.xml)
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
5、格式化hadoop並啟動偽分布式hadoop
進入進入到/usr/local/hadoop目錄下
①格式化(格式化操作不能重復執行。如果一定要重復格式化,帶參數-force即可)
bin/hdfs namenode -format
注意:在執行的時候會報錯,是因為缺少which命令,安裝即可
執行下面命令安裝
yum install -y which
②啟動偽分布hadoop
sbin/start-all.sh
6、完全分布式hadoop搭建
進入/usr/local/hadoop
①停止上一步的偽分布式hadoop
sbin/stop-all.sh
②指定nodemanager的地址,修改文件yarn-site.xml
<property> <description>The hostname of the RM.</description> <name>yarn.resourcemanager.hostname</name> <value>hadoop0</value> </property>
③修改hadoop0中hadoop的一個配置文件etc/hadoop/slaves
刪除原來的所有內容,修改為如下
hadoop1
hadoop2
④拷貝至其他兩個節點
scp -rq /usr/local/hadoop/ hadoop1:/usr/local/
scp -rq /usr/local/hadoop/ hadoop2:/usr/local/
⑤啟動hadoop分布式集群服務
執行sbin/start-all.sh
ps:在執行的時候會報錯,是因為兩個從節點缺少which命令,安裝即可(yum install -y which)
7、驗證完全分布式集群是否正常
①hadoop0主節點需要有以下進程
②hadoop1從節點需要有以下進程
③hadoop2從節點需要有以下進程
七、wordcount單詞計數驗證集群服務
1、創建本地文件並寫入任意內容
vi a.txt
hello hadoop
hello spark
hello flink
2、上傳該文件至HDFS並驗證是否上傳成功
hdfs dfs -put a.txt /
hadoop fs -ls /
3、提交job程序至hadoop集群
cd /usr/local/hadoop/share/hadoop/mapreduce hadoop jar hadoop-mapreduce-examples-2.7.7.jar wordcount /a.txt /out
4、查看計算結果
hadoop fs -ls /out hadoop fs -cat /out/part-r-00000
至此、使用Docker搭建Hadoop集群成功!
八、瀏覽器訪問Hadoop集群服務
1、docker ps查看主節點容器
啟動的容器的時候指定了對外開放端口:50070和8088
2、瀏覽器訪問:http://IP:50070/dfshealth.html#tab-overview即可看到以界面
3、瀏覽器訪問:http://IP:8088/cluster
九、重啟容器注意點
1、停止3個容器
docker stop hadoop0
docker stop hadoop1
docker stop hadoop2
2、啟動3個容器
docker start hadoop0
docker start hadoop1
docker start hadoop2
3、固定IP
pipework br0 hadoop0 192.168.2.10/24 pipework br0 hadoop1 192.168.2.11/24 pipework br0 hadoop2 192.168.2.12/24
4、主機名與IP映射
ps:每次修改比較麻煩,干脆一個腳本:runhosts.sh
#!/bin/bash echo 192.168.2.10 hadoop0 >> /etc/hosts echo 192.168.2.11 hadoop1 >> /etc/hosts echo 192.168.2.12 hadoop2 >> /etc/hosts
chmod +x runhosts.sh
scp runhosts.sh hadoop1:~
scp runhosts.sh hadoop2:~
./runshots.sh
5、查看是否映射成功
有一些docker版本中不會在hosts文件中自動生成下面這些映射,所以我們才在這里手工給容器設置固定ip,並設置主機名和ip的映射關系
6、啟動hadoop集群
sbin/start-all.sh
參考自:https://blog.csdn.net/xu470438000/article/details/50512442(如有侵權,請聯系刪除)