基於虛擬linux+docker搭建hadoop完全分佈式集羣

本文假設用戶基本瞭解docker,掌握linux的基本使用命令,瞭解hadoop的常規安裝及簡單配置

實驗環境:windows10+Vmware WorkStation 11+Linux.14.04 server+docker 1.7

windows 10作爲實體機操作系統,網段爲:10.41.0.0/24,虛擬機使用NAT網絡,子網爲192.168.92.0/24,網關爲192.168.92.2,linux 14.04爲虛擬系統,充當容器的宿主機,IP爲192.168.92.129。本文將基於以上環境在linux系統中搭建一個hadoop完全分佈式集羣,節點組成爲master+slave1+slave2

一、虛擬系統安裝

windows10上安裝vmware workstation,並創建一個linux虛擬機,根據機器的性能分配磁盤空間、CPU和內存,網絡類型爲NAT(根據實際網絡環境選擇,此處網絡上教程豐富,不再贅述),安裝linux時選擇安裝類型爲SSH服務器。

安裝完Linux虛擬系統後,在vmware workstation的網絡編輯器中可看到虛擬機分配的子網爲192.168.92.0/[email protected],在虛擬機終端執行ifconfig可看到linux自動獲取到的IP爲192.168.92.129編輯/etc/network/interfaces文件,配置靜態IP地址:

執行命令使網絡配置生效:

sudo /etc/init.d/networking restart #有時候該命令沒什麼效果,重啓一下吧

使用linux遠程管理工具(如xshell、putty)登錄linux系統


二、安裝docker

參考該鏈接安裝docker: http://dockerpool.com/static/books/docker_practice/install/ubuntu.html


三、獲取鏡像

從docker倉庫下載ubuntu14.04的鏡像(文件不大,不到200MB)

sudo docker pull ubuntu:14.04 #下載鏡像
sudo docker images #查看本地倉庫中的鏡像


最下面的14.04是下載的鏡像,其他均爲在此鏡像基礎上commit得到的新鏡像


四、定製容器

執行如下命令創建並啓動一個容器:

sudo docker run -ti ubuntu:14.04

此時會切換到容器的臨時終端,默認直接進入root用戶環境,接着做如下工作:

1、修改安裝源,因爲docker pull得到的鏡像使用的是國外的安裝源,在使用該安裝源下執行apt-get install 操作時下載階段會特別慢甚至下載不成功,建議替換成國內的源,如cn99、網易等,也可參考宿主機的源配置(它訪問的是ubuntu部署在國內的服務器),找到新源後替換 /etc/apt/sources.list 文件即可。

2、安裝ssh

sudo apt-get update
sudo apt-get install openssh-server

3、配置ssh免密登錄

在用戶目錄下創建.ssh文件夾,執行命令:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

接着修改ssh的配置文件(/etc/ssh/sshd_config),將PermitRootLogin without-password 改成PermitRootLogin yes,之後修改root密碼。

如果不想允許root直接登錄,則需要自己創建一個用戶,所有操作都在該用戶環境下進行。
4、下載安裝JDK

sudo apt-get install oracle-java8-installer #也可使用wget直接從oracle官網下載

下載後配置JDK環境變量,執行java、javac命令進行測試。

5、配置hosts

按照上文實驗環境的描述,hadoop集羣由一個master節點和兩個slave節點組成,需要在hosts文件中添加IP到主機名的映射,執行ifconfig命令可以看到docker給容器分配的eth0網卡的IP爲172.17.0.x網段(不同的環境該私有IP段可能不同),且重啓容器後該IP會變動,而hadoop集羣最好配置靜態的地址,在後續步驟中,將會用到一個工具給容器虛擬一個新的網卡,同時分配一個固定的地址,該地址和docker服務在宿主機中創建的網橋docker0的地址爲同一網段。

重新開啓一個遠程管理終端程序登錄linux宿主機,執行ifconfig命令可以到docker0網橋的IP(本文的實驗環境爲172.17.42.1),且每次重啓系統,該IP均不變化,因而可以在該網段給容器分配IP,這裏做如下分配:

172.17.42.2 master
172.17.42.3 slave1
172.17.42.4 slave2

需要注意的是,容器在啓動後會初始化hosts文件,且會自行添加一條eth0網卡地址到主機名的映射,這會導致hadoop集羣啓動後監聽的網卡爲eth0,所以需要重新生成該文件,這裏提供一個簡單的腳本做這項工作:

#!/bin/bash
echo "#ip and hostname information" > /etc/hosts
echo "127.0.0.1 localhost" >> /etc/hosts
echo "172.17.42.2 master" >> /etc/hosts
echo "172.17.42.3 slave1" >> /etc/hosts
echo "172.17.42.4 slave2" >> /etc/hosts

將腳本添加到開機啓動即可。

6、下載配置hadoop

使用wget下載hadoop2.6(可根據實際情況選擇想要安裝的版本):

wget http://mirrors.sonic.net/apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz

將壓縮包解壓到某個目錄,然後編輯hadoop-2.6.0/etc/hadoop目錄下的配置文件,修改相應配置。


五、保存鏡像

執行exit命令退出容器終端,然後執行命令保存對容器的更改到一個新的鏡像:

sudo docker commit -m "description information about the images" <容器ID> ubuntu:hadoop

六、創建並啓動新容器

執行命令創建並啓動新的hadoop集羣容器:

sudo docker run -d -h master --name=hadoop_master ubuntu:hadoop /usr/sbin/sshd -D #啓動hadoop主節點
sudo docker run -d -h slave1 --name=hadoop_slave1 ubuntu:hadoop /usr/sbin/sshd -D #啓動hadoop從節點
sudo docker run -d -h slave2 --name=hadoop_slave2 ubuntu:hadoop /usr/sbin/sshd -D #啓動hadoop從節點
sudo docker ps -a #查看所有創建的容器



七、安裝pipework工具並創建虛擬網卡

1、從gitub上下載一個名叫pipework的工具,地址爲:https://github.com/jpetazzo/pipework

該工具主要是給容器虛擬一張新的網卡,給網卡配置靜態地址,同時把新網卡和docker在宿主機中創建的網橋橋接起來,使得容器和宿主機能通過該網卡互通。

下載並解壓該工具,然後拷貝解壓目錄下的pipework文件至/usr/local/bin目錄,至此,工具安裝完畢。

2、創建虛擬網卡

執行如下命令給三個容器創建指定地址的虛擬網卡:

sudo pipework docker0 hadoop_master 172.17.42.2/[email protected]
sudo pipework docker0 hadoop_slave1 172.17.42.3/[email protected]
sudo pipework docker0 hadoop_slave2 172.17.42.4/[email protected]

該命令參數爲:<網橋名稱> <容器名稱> <新網卡地址/網絡號@網關地址>,網關就是網橋的地址,默認創建的網卡名稱爲eth1,可通過<-i name>參數指定網卡名稱。執行該命令時可能會有警告信息,目前沒發現有什麼影響。


八、訪問測試

在宿主機中ping容器的新網卡地址,發現三個節點均測試通過,在宿主機中使用ssh命令也可正確登錄容器。



九、啓動hadoop集羣

登錄容器的master節點後,執行命令格式化namenode節點,然後啓動集羣:

bin/hadoop namenode -format
sbin/start-dfs.sh && sbin/start-yarn.sh

結果如下:



至此,已經可以從宿主機訪問容器了,但是宿主機是沒有桌面環境,只能通過實體機在瀏覽器中訪問集羣提供的web UI,但現在實體機無法ping通容器地址,也無法訪問容器,原因在於,宿主機是實體機的子網,容器是宿主機的子網,而實體機不知道容器所在子網的存在,所以需要在實體機中添加一條從實體機到容器子網的路由。

用管理員模式運行cmd,執行如下命令:

route add -p 172.17.42.0 mask 255.255.255.0 192.168.92.129

三個地址分別爲:<目的子網地址> <掩碼地址> <網關/宿主機地址>,之後,在實體機中可以正常ping通容器,web控制檯也能正常打開了。


說明:docker容器每次重啓後,pipework工具創建的虛擬網卡會消失,需要重新分配,可寫個腳本管理之。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章