2012年8月28日 星期二

Linux Containers建置Hadoop完全分散環境



前言


話說有某人筆電是裝硬碟,一顆win7一顆ubuntu12.04,上班環境是使用win7來開發的,想要摸魚玩玩hadoop還要切換到另一顆,這樣真的很不方便。再說原本是使用linux kvm來安裝hadoop環境的,在vm player裡不能使用kvm(天要亡某人啊!!),但是天無絕人之路,某年某天就在那個時候的這個時間某人熊熊學到了LXC技術,彷若絕地重生XD,讓某人上班時有個惡搞的玩具了。以下就來簡短說明一下那位某人的新玩具。


2014/03/16更新:
如果想要在vmware station中使用kvm的話,可以在settings中的hardware-->Processors選項中把VT-x功能打開,如下圖:

如此一來就可以使用kvm或libvirt等等的功能了,不過目前筆者的最愛還是Linux Container....XD!

**********************************************************************************************
LXC全名是Linux Containers,是由IBM開發的,類似 linux vserver, openvz 的機制。簡單的說就是在同一個kernel底下可以執行多個OS(也可說是
不同的 filesystem,但共用同一個 kernel)。
LXC不但有不同的 filesystem,還能夠設定不同的網路,就好像是另一台虛擬機器,但是不會像 kvm 或 xen 那樣耗費那麼多的資源。LXC 可限制用多少 memory、cpu 等等,才不會讓某一個 container 影響到另一個 container 或甚至是 host,這都是 chroot 做不到的。
**********************************************************************************************

****中的文字來自於陳松林老師的講義



環境

主戰機是windows7專業版64位元,vmplayer裝ubuntu12.04 桌面板 64位元。


工具

按我下載shell這裡面有個iLXC.rar,就解壓縮後直接放到家目錄下面,千萬不要放到其他地方,不然startLxc.sh會找不到路徑的。


實作

[步驟一]

首先開啓自己的terminal跟著以下步驟做:
安裝lxc套件sudo apt-get install lxc執行後就等等他吧,看到yes/no就回答yes.....無腦的一鍵安裝


裝完lxc後,請ifconfig -a這時你會發現出現了一個lxcbr0(這是lxc預設的bridge,你不爽用也可以視而不見)。對,這就是等下namenode要用的ip位置,很瞎吧。本來我自己做了GW,啟動hadoop後datanode都無法正常啟動,當我把namenode的ip改成10.0.3.1後居然啥都正常了。以我目前的斤兩,我無法解釋為何這樣可以通,管他的讓我們繼續搞下去吧。



因為會用bash script來讀取xml,所以要安裝解析XML的套件xpath指令是
sudo apt-get install uml-utilities libxml2-utils libxml-xpath-perl大膽地給他裝下去吧,看到yes/no就回答yes.....這也是無腦的一鍵安裝。

不過各位看官不會直接去下指令解析xml,因為我都寫在bash script裡面了,最後每一個os分身都建立好後,會用到自動化啟動分身的bash script。



[步驟二]

來建立第一個LXC,這一個要當作之後的clone的對象,所以一堆東西都要在這一個裡面都設定好,之後再clone出去的分身就不用再大費周章的去改設定了。sudo lxc-create -t ubuntu -n myUD1204(-t 代表 type, -n 代表 name)
裝完應該會有這樣的畫面出來,default的帳密都是ubuntu/ubuntu。



















myUD1204產生完後可以到/var/lib/lxc這目錄去看看,所有產生的"分身"都會以資料夾的形式存在這邊。每個資料夾裡面會有三個檔案(config,fstab,rootfs.hold)一個資料夾(rootfs)。這篇網誌的實作主要會動到的是rootfs這資料夾以及config這檔案。

[步驟三]

因為myUD1204這一個是要拿來當每個分身的"媽媽",基於方便操作,我們要先把會用到的資料或檔案放到myUD1204裡面,再事先編輯好每個設定檔還有使用者帳密。就是底下幾件事要做:

*新增使用者(預設是ubuntu,要新增一個你自己的帳密)
*安裝jdk(hadoop是要吃JDK的)
*把hadoop安裝檔放進去
*網路設定(編輯/etc/var/lib/${yourLXC}/config)

1.新增使用者


先使用背景啟動myUD1204,用ubuntu/ubuntu登入來新增使用者(用個你喜歡的帳號吧)
sudo lxc-start -n myUD1204 -d(-d是背景作業)
sudo lxc-console -n myUD1204





因為一個沒有裝啥套件的乾淨OS,你需要什麼套件要自己裝,等一下要編輯使用者權限所以需要nano,sudo apt-get install nano。裝好後來新增帳號,指令是sudo useradd -m -s /bin/bash XXXX跟sudo passwd XXXX連續兩次輸入你要給這新帳號啥密碼。下圖是我示範新增一個名叫"hduser"的帳號。



再來讓新的帳號有sudo的權限,sudo nano /etc/sudoers
按照下圖的方式來編輯。


登出(exit),再用你建立的新帳密登入。之後clone的分身全部可以用這一個帳號了。

2.安裝jdk以及編寫JAVA_HOME


假設你的家目錄(我的是UD1204這一台)已經有jdk-6u34-linux-x64.bin跟hadoop-1.0.3.tar.gz,我們就直接把這兩個cp過去給myUD1204,指令如下:
(pablo是我的帳號,你要改成你自己的帳號)
sudo cp jdk-6u34-linux-x64.bin /var/lib/lxc/myUD1204/rootfs/home/pablo
sudo cp hadoop-1.0.3.tar.gz /var/lib/lxc/myUD1204/rootfs/home/pablo
 複製完後到myUD1024(用你的帳號登入)執行以下兩個指令./jdk-6u34-linux-x64.bin跟tar vxfz hadoop-1.0.3.tar.gz
完成後你的myUD1204家目錄的目錄結構應該像下圖一樣,



再來編輯.bashrc,加入JAVA_HOME以及PATH
nano .bashrc,輸入以下四行,
export JAVA_HOME=/home/pablo/jdk1.6.0_34
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH="$PATH:$JAVA_HOME/bin:/home/pablo/hadoop-1.0.3/bin:$JRE_HOME/bin"



完成後登出(exit)再登入(你的新帳號),確認一下java以及hadoop是否正確。

3.編輯Hadoop設定檔

請見之前的網誌有寫到,請參照。
UD1204是namenode,jobtracker,secondarynamenode
LXC251,LXC252,LXC253是datanodes,tasktrackers

4.網路設定


再來設定/etc/hosts跟/etc/network/interfaces
從下載下來的檔案(iLXC)中的conf/lxc.xml可以看到我會啟動四台分身,以及產生的bridge ip是給192.168.200.254(順便當GW)所以/etc/hosts跟/etc/network/interfaces要先編輯成下圖的內容,





[步驟四]

這步驟要產生另外四個分身,並且分別對其細節再修改一下。
回到主戰機中(是在vmplayer中的那一台呦,不要亂了,名字千萬要跟我的一樣,因為我在xml設定檔中就是用這幾個名字,看不順眼的也是可以自己改啦),
sudo lxc-clone -o myUD1204 -n LXC251
sudo lxc-clone -o myUD1204 -n LXC252
sudo lxc-clone -o myUD1204 -n LXC253
(-o 代表 oringinal)

都產生完後/var/lib/lxc裡面會產生這四個分身的資料夾,我們接下來要分別來編輯這四個的網路設定(因為是用myUD1204)
在主戰機的終端機中,
cd /var/lib/lxc/LXC251
sudo nano config
要修改的地方如下:
lxc.network.link=lxc200(這是我設定檔中產生的bridge)
lxc.network.hwaddr= 00:16:92:68:20:51(mac address)

ps:lxc.network.type=veth,veth代表是虛擬網卡改成phys表示獨佔實體網路卡,這時的lxc.network.hwaddr要mark起來


按照這樣的方法依序把LXC252,LXC253也修改好。
每一台的lxc.network.link都是lxc200
mac address只有最後一個不一樣,要改52,53或是自己亂改都可以不要重複就好。我自己的是00:16:92:68:20:52 00:16:92:68:20:53。以上完成後,就需要用到iLXC的資料夾了,請確定這資料夾在家目錄,並按照下圖指令操作。使用bash script讓四台分身一起同時啟動。
這時你也可以用brctl show來看看lxc200這一個虛擬bridge上面有插著幾片網卡。




上圖可以看到有個lxcbr0,這是安裝lxc後原生的bridge,lxc200是我自己產生的,並在每一個分身的資料夾裡的config中設定網卡要插在哪一個bridge中,這就是為啥要修改lxc.network.link=lxc200的原因了。
最後要到每一台的/etc/network/interfaces修改ip,例如我要進到LXC251這台的話就是在開一個終端機,sudo lxc-console -n LXC251就可以了,因為我在startLxc.sh都是啟動後丟背景作業,記得要用新增的帳號登入。
假設進到了LXC251這台後,來修改ip吧,sudo nano /etc/network/interfaces


依LXC251,LXC252,LXC253的順序把address修改成192.168.200.51 192.168.200.52 192.168.200.53。
每一台的/etc/hosts也要修改,請見下圖。
127.0.0.1 localhost
10.0.3.1 UD1204~~~~不要忘了這很瞎的地方
192.168.200.51 LXC251
192.168.200.52 LXC252
192.168.200.53 LXC253



改完後,把每一台都關機再開一次機(這是我的習慣啦,有些人是登出再登入就好)。
在主戰機中分別下sudo lxc-stop -n LXC251,sudo lxc-stop -n LXC252,sudo lxc-stop -n LXC253這三台就關機了。再用我的bash script把每一台都啟動。
最後測通一下這虛擬網路,就互ping這四台分身吧,應該很簡單,這邊我就不做了。例如在LXC251這一台分身中做,ping UD1204 ping LXC252 ping LXC253

[步驟五]

ssh自動登入。
UD1204是namenode所以要在UD1204產生憑證再傳到LXC251,LXC252,LXC253中。
請記得每台的家目錄底下要自己mkidr .ssh,不然會提示說找不到資料夾。
在UD1204的終端機中做以下的指令,
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys



用ssh UD1204測試看看,是否可以不用密碼登入。
成功的話就把key傳到另外三台datanode中,請見下圖。
scp ~/.ssh/id_dsa.pub LXC251:.ssh/authorized_keys
scp ~/.ssh/id_dsa.pub LXC252:.ssh/authorized_keys
scp ~/.ssh/id_dsa.pub LXC253:.ssh/authorized_keys



做完後一定要確認是否從UD1204登入到datanode中都是不用輸入密碼的,因為這關係到hadoop的啟動是否成功。
ssh LXC251
ssh LXC252
ssh LXC253
(跳出來就用exit)

[步驟六]

網路測通後,就是要來啟動hadoop了。在之前的網誌有提過了,這邊不說太多了。
1.hadoop namenode -format



2.start-all.sh(前一篇有說過啟動方式有三種)



3.jps
namenode:


datanode:



4.hadoop dfsadmin -report



看到了吧,三台datanode都乖乖地出現了XD

結語

這下子我在win7的環境中可以開啟vmplayer,不用kvm被限制住,也可以有分散式環境來玩Hadoop。這篇用LXC來建構Hadoop環境並沒有去限制datanode的ram跟cpu,話說沒有限制的話,會搶資源喲!!有興趣的人可以拜神一下。我個人覺得這不是一個很標準的虛擬網路環境,覺得有問題的人請不要鞭我XD,這只是用來玩玩Hadoop的。
還是老話一句,這兩篇建構環境的網誌並沒有提到HDFS的操作跟Ecplise開發MapReduce,我有空再來補上去吧。

這篇是某某人花很多時間,死很多細胞,掉很多頭髮弄出來的,要引用的人請佛心來著的告知我一下啊><

3 則留言:

  1. good tutorial! 我都好懶的寫這麼詳細XD

    回覆刪除
  2. 謝謝,我只是把學習的過程記錄下來罷了。
    這篇網誌如果你覺得有問題或錯誤的地方可以向我反應不用客氣

    回覆刪除