使用Docker搭建Hadoop集群(偽分布式與完全分布式)


  之前用虛擬機搭建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.ta​​r.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"]
View Code

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(如有侵權,請聯系刪除)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM