求解:基于docker搭建跨主機hadoop集群遇到的問題

背景

一臺centos ip :172.xx.xxx
一臺mac ip :172.xx.xxx
一臺 windows ip :172.xx.xxx
網(wǎng)絡(luò)為公司內(nèi)網(wǎng)環(huán)境,因為開始沒法申請機器,需要在三個不同環(huán)境下搭建一個hadoop集群,跑一些測試數(shù)據(jù),因為hadoop要求各個機器的目錄一致,我嘗試使用docker搭建,因為docker之前沒有用過,我沒有使用Dockerfile,使用第三方鏡像,并使用端口映射實現(xiàn)跨主機,具體搭建過程如下:

1.獲取鏡像創(chuàng)建Master

  • 獲取鏡像

docker pull registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop

下載完成后使用 docker images可以查看到這個鏡像

注:這個鏡像為我們設(shè)置好了ssh,和要下載的組件,自己之前下載centos,然后在ssh互信上遇到很多問題,就改成了這種已經(jīng)設(shè)置好ssh的鏡像

  • 創(chuàng)建容器

docker run -i -t --name Master -h Master registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop /bin/bash

通過上述的命令行創(chuàng)建了Master,此時在容器外使用下面命令

docker inspect Master

可以看到該容器對外暴露的所有端口號如下:


Snip20171106_13.png

因為要跨主機,端口的暴露是不夠的,我又對端口號做了映射,為防止宿主機的22端口其他服務(wù)需要使用就把容器的22端口映射到22222,具體操作刪除原來的容器,然后重新run一個

docker rm Master
docker run -i -t --name Master -h Master -p 19888:19888 -p 2122:2122 -p 22:22222 -p 49707:49707 -p 50010:50010 -p 8030-8033:8030-8033 -p 8040:8040 -p 8042:8042 -p 8088:8088 -p 50020:50020 -p 50070:50070 -p 50075:50075 -p 50095:50095 registry.cn-hangzhou.aliyuncs.com/kaibb/hadoop /bin/bash

  • 配置環(huán)境
    這個鏡像java和hadoop的內(nèi)容都存放在了/opt/tools目錄下使用下面命令行可以確認是否正常:

java --version
hadoop --version

接下來我們來修改/etc/hosts

vi /etc/hosts

添加以下內(nèi)容
172.XX.XXX1  Slave1 // 另外一臺主機ip
172.XX.XXX2 Master // 當前宿主機ip

source /etc/hosts

接下來配置hadoop
1>hadoop-env.sh:修改有關(guān)java的環(huán)境

cd /opt/tools/hadoop/etc/hadoop
vi hadoop -env.sh

修改默認的ssh端口號

export HADOOP_SSH_OPTS="-p 22222"

2>core-site.xml

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<property>

<name>hadoop.tmp.dir</name>
<value>/hadoop/tmp</value>
</property>
</configuration>

3>hdfs-site.xml

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>

<name>dfs.datanode.data.dir</name>
<value>/hadoop/data</value>

</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/hadoop/name</value>
</property>
</configuration>

4>mapred-site.xml

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

5>yarn-site.xml

<configuration>
<property>
<name>yarn.resourcemanager.address</name>
<value>Master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>Master:8030</value> </property> <property>

<name>yarn.resourcemanager.resource-tracker.address</name>
<value>Master:8031</value>

</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>Master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>Master:8088</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>

5>slaves
在slaves文件里設(shè)置改成如下:

Slave1

  • 運行ssh

/etc/init.d/ssh start

2.制作鏡像,創(chuàng)建Slave1

退出容器然后導(dǎo)出鏡像:

docker export -o master.tar Master

讓另外一臺主機和當前的宿主機互信后遠程拷貝到另外一臺主機上

scp master.tar 另外一臺主機名@ip:/opt/tools/

然后導(dǎo)入鏡像

docker import master.tar newImages

然后docker images 就可以看到我們自己導(dǎo)入的本地鏡像,然后我們run一個Slave1:

docker run -i -t --name Slave1 -h Slave1 -p 19888:19888 -p 2122:2122 -p 22:22222 -p 49707:49707 -p 50010:50010 -p 8030-8033:8030-8033 -p 8040:8040 -p 8042:8042 -p 8088:8088 -p 50020:50020 -p 50070:50070 -p 50075:50075 -p 50095:50095 newImages /bin/bash

3.ssh互信

進入容
器后同樣編輯/etc/hosts文件,同上面一樣設(shè)置。并運行ssh

/etc/init.d/ssh start

設(shè)置完畢后進行互信。

4.啟動hadoop集群

互信成功后回到Master容器內(nèi)

cd /opt/tools/hadoop/sbin
hadoop namenode -format // 格式化

格式化正常后,啟動集群

./start-all.sh

jps后slave1正常,namenode不正常。

5.分析問題

nameNode無法啟動,是因為集群啟動的時候會互信的時候會ssh 自己的ip 22222端口,但是其實是應(yīng)該 ssh Master 22222端口,由于hadoop集群的啟動是從master上讀取的,主從節(jié)點要保持一致,所以最終沒有啟動成功。

6. 結(jié)語

寫這個的時候,其實和我搭建有段時間了,最后出現(xiàn)的問題大概是這個樣子,因為自己對虛擬網(wǎng)橋啥的不是很懂,當時沒有選擇那個方法,以為端口映射會更簡單,其實整個過程下來還是挺復(fù)雜的,如果有看到的高人,希望指點這種端口映射是否可以實現(xiàn)跨主機的集群,或者其他方法有什么比較簡單的。
這里附上這個鏡像的單機集群搭建流程,經(jīng)測試沒有問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容