1. 程式人生 > >hadoop之docker偽分散式部署

hadoop之docker偽分散式部署

配置環境: macbook、兩臺ubuntu 16.04 server虛擬機器,用VMware Fusion建立的,虛擬機器網路介面卡模式是NAT模式(注意此處一定要是NAT模式)

第一步:搭建虛擬網橋br0,br1

不過我要說下為什麼要用虛擬網橋,在知道這個東西前,我也嘗試了很多方法讓不同虛擬機器之間的docker互相訪問,剛開始想用埠對映,把虛擬機器的22埠對映到docker,這樣雖然解決了ssh的問題,但是一旦有實際程式跑起來,需要其他埠,就不行了,遂放棄;後面又想用--net host模式,但是這樣搞得虛擬機器和docker分不清哪個用哪個,於是也放棄了。後面看到虛擬網橋的方法,感覺可行,它的原理就是把一臺虛擬機器的eth0網絡卡作為虛擬網橋br0的一個埠,這臺虛擬機器的docker裡也把eth0作為虛擬網橋br0的埠,這樣單臺虛擬機器和它的docker就能互相訪問;同樣在另一臺虛擬機器配置虛擬網橋br1,由於NAT模式的存在(不是很確信),br0和br1也可以互相訪問,於是全部打通了。

第二步:下載映象

docker pull daocloud.io/shenaishiren/hadoop-run

這個映象是我基於 kiwenlau/hadoop:1.0這個映象,加了bridge-utils和vim之後構建的映象,pull下來之後在一臺虛擬機器(作為master)上執行如下命令

docker run -itd --name hadoop-master --hostname hadoop-master -p 50070:50070 -p 8088:8088 daocloud.io/shenaishiren/hadoop-run &> /dev/null

(如果docker ps發現沒執行起來,你可能要執行docker rm -f hadoop-master刪掉以前的容器了)

另一臺執行

docker run -itd --name hadoop-slave1 --hostname hadoop-slave1 daocloud.io/shenaishiren/hadoop-run &> /dev/null
然後執行下面的命令進入hadoop-master
docker exec -it hadoop-master bash
接著執行(192.168.1.64是hadoop-slave1的ip地址)
echo "192.168.1.64 hadoop-slave1" >> /etc/hosts
在容器hadoop-slave1上同樣(192.168.1.128是hadoop-master的ip地址)
echo "192.168.1.128 hadoop-master" >> /etc/hosts
然後在hadoop-master容器裡先執行./start-hadoop.sh,再執行./run-wordcount.sh就行了

最後再說一下遇到的坑和解決辦法

遇到問題第一件事就是關掉hadoop

/usr/local/hadoop/sbin/stop-dfs.sh && /usr/local/hadoop/sbin/stop-yarn.sh

然後第一個問題就是“there is no datanode(0)啥的”,遇到這個問題,首先要去從節點用jps看看DataNode有沒有在執行,像我遇到這個問題是因為我多次格式化namenode,造成namenode的clusterID和datanode的clusterID不一樣,導致DataNode開啟失敗,具體解決辦法看連結http://jingyan.baidu.com/article/3c343ff7e75e9e0d36796347.html

第二個問題就是9000埠訪問拒絕,解決辦法是記得開啟前格式化namenode,而且你的dfs.datanode.data.dir對應的資料夾下的current資料夾必須存在
hadoop namenode -format

然後正常執行上面提到了的start-hadoop.sh和run-wordcount.sh

解決了所有問題,終於迎來了勝利的曙光,成功執行字元統計!

(N臺分散式的配置同上)