2012年8月23日 星期四

Linux KVM 建立Hadoop完全分散環境

前言:

  之所以會po這些東西上來主要是怕自己會忘記,也順道複習一下當初是如何裝起來的,方便自己日後查詢資料。溫馨提醒本範例適用於linux裸機系統(簡單說就是整顆硬碟都裝linux),不能使用於vmwave中,如果有人知道如何虛中再起虛,虛到最高點,請一定要告訴我。這範例都是在下惡搞出來的,如果有觀念錯誤的地方或是更好的方式,可以留言給我,大家交流交流,謝啦^^
  當然只要是linux base的發行套件(裸機裸機裸機....)都可以使用PEM-LAB.zip這玩意,因為只要敢叫linux發行套件的kernel裡面一定會有kvm( 從一位老師口中聽來的),不過我自己是沒試驗過別的linux發行套件,希望能夠有心人可以實做看看。  
  話說學了Hadoop沒有搞個可以練習的環境(自己惡搞的環境),感覺不是很囧嗎?到國網中心去申請一個帳號?....個人偏好獨樂樂!!還可以租亞馬遜的EC2??hiCloud??NO!!...免錢的比較好XD!!
  建構Hadoop的開發環境分成三種,有單機(啥都不用設定,玩起來nofu),偽分散(感覺玩在半夢半醒之間,也nofu),以及完全分散。
基於以上各種本人的偏激自我思想,決定採用"完全分散模式"
  Hadoop=HDFS+MapReduceHDFSstore,MapReduceprocedure。更白話說明就是一個系統運作的兩大運作區塊,(1)怎麼存、(2)怎麼處理。
  適合Hadoop的情境有以下:
  1.具備幾百幾千的Node的Scalability(可擴展性)。
  2.把軟硬體發生Failure當成家常便飯。
  3.要處理的檔案不多,但是每個都很大。
  4.只寫入一次,但是會被讀取很多次。
  5.以上從這裡抄來的,這PDF可以讓不認識BigData的人有點初步的概念。

文章來源:上課,GOOGLE,書(Hadoop技術手冊第二版),惡搞(砍掉重練),還有Linux KVM研究室(google可以找到他,非常好的一個網站)。

PEM-LAB是參考陳松林老師的iLab改裝來的,並不是在下我從無到有建制出來的


環境:

我的主戰機(Host OS)是ubuntu desktop 12.04,拿來當作namenode跟jobtracker。真正營運環境中這兩個東西是會分別裝在不同的實體機器中(書中寫的,我也沒實戰過><),這裡為了省空間以及操作方便,就把NameNode,JobTracker以及secondaryNameNode都裝在主戰機中。對於Hadoop來說,最主要的是兩個內容,一是分散式文件系統HDFS,一是MapReduce計算模型。在分散式文件系統HDFS看來,節點分為NameNode 和DataNode,其中NameNode只有一個,DataNode可以是很多;在MapReduce計算模型看來,節點又可分為JobTracker和TaskTracker,其中JobTracker只有一個,TaskTracker可以是很多。因此在實際的Hadoop環境中通常有兩台主節點,一台作為NameNode(I/O節點),一台作為JobTracker(管理節點),剩下的都是從節點,同時當做DataNode和TaskTracker使用。當然也可以將NameNode和JobTracker安裝在一台主節點上。由於測試機數量有限,所以在這裡是讓HOST OS做為Namenode和Jobtracker,其它主機則作為DataNode和TaskTracker(如果Hadoop環境中主機數量很多的話,還是建議將Namenode和JobTracker部署到不同的主機,以提高計算的性能)。我所使用的Hadoop是1.0.3,Java是1.6_32。
之所以要把NameNode裝在主戰機中而不是vm中,是因為日後要開發MapReduce程式我習慣使用Eclipse。
服用本篇前,請先確認主戰機的CPU是否支援vt-x。
安裝check-cpu指令是sudo apt-get install check-cpu。裝好後下個kvm-ok的指令檢查看看,出現INFO: Your CPU supports KVM extensions這行代表有支援。


再來安裝linux kvm以及kvm管理工具virsh,沒安裝的話請見下圖的指令給他裝下去就對了。


ubuntu12.04安裝kvm指令:sudo apt-get install qemu-kvm(跟10.04不一樣)

kvm可以讓vm直接使用到cpu的虛擬技術,至於vm的周邊設備就是要靠qemu......先就此打住不多說了。
安裝kvm管理工具指令:sudo apt-get install libvirt-bin。這kvm管理工具有個GUI的工具可以下指令sudo apt-get install virt-manager來安裝,因為要方便編輯vm的內容所以需要這GUI工具。這工具裝好後你可以在應用程式--系統工具--虛擬機器管理員找到他
開啟後就像下圖(也可以用這來看你用libvirt裝了哪些vm,按照下面的流程裝完後,客位看官一定會看到這四台vm)也可以用這工具來裝vm。

裝完virsh後下個virsh version指令來確認版本

好!!!以上都安裝完之後有個詭異的地方來了,這不知道算不算12.04版的bug,10月推出更新版的時候應該會改掉吧,如果是使用12.04的看官就麻煩修改一下了,不然無法使用kvm。請下這行指令sudo nano /etc/group進去修改,把自己的登入帳號加入kvm以及libvirtd的群組底中,請見下圖。
硬碟空間請確認還有40G以上
以上是主戰機所需要的kvm環境設定了

##主戰機簡介:R830 i5-2410 ,RAM 8G,SSD M4 128G##



工具包:

載點
https://docs.google.com/folder/d/0B1hKA25bLYJETVdveVItUklFLUE/edit

1.Eclipse的hadoop plugin(1.0.3)

2.KVM硬碟檔(PEM-LAB.zip)
這一個壓縮檔已經建立好三個ubuntu server12.04的vm,以及自動化的bashscript。
3.jdk-6u32-linux-x64.bin
4.hadoop-1.0.3.tar.gz


安裝流程:

[第一篇]

步驟1.先把PEM-LAB.zip解壓縮放到家目錄(/home/yourUserName/)。看個人喜好啦!我是習慣放在家目錄。
步驟2:主戰機安裝JDK,可以去官網抓或是用我提供的(我也是官網抓的)。
A.解壓縮jdk-6u32-linux-x64.bin
  
B.設定主戰機JAVA環境變數(JAVA_HOME,JRE_HOME,PATH):我習慣寫在.bashrc的最下面。(可以自行決定位置,找得到就好)
  
步驟3:主戰機安裝Hadoop,可以去官網抓或是用我提供的(我也是官網抓的)。
A.解壓縮hadoop-1.0.3.tar.gz,完成後家目錄會產生hadoop-1.0.3的資料夾。
B.設定主戰機Hadoop環境變數,上面JDK的環境變數那張圖中有寫了。hadoop-1.0.3已經不用寫HADOOP_HOME了,寫上去的話terminal會出現HADOOP_HOME is deprecated 的警告(WARN)訊息, 所以把安裝檔案路徑寫在PATH中就可以了,可以參考上上張圖中的寫法
步驟4:重開機(sudo reboot) 再進來後到終端機確認一下java -version以及hadoop version。
 
以上是第一篇的內容,安裝JDK以及HADOOP,還有下載VM硬碟檔。


[第二篇]


接下來,恐怖的來了。開始前先來個輕鬆的文書處理。
請先確認硬碟空間還有40G以上(解壓縮後有15G,安裝完後會產生15G的硬碟檔),RAM至少4G。(在下用SSD所以很珍惜硬碟空間,所以每一個VM我都只給5G大,嫌不夠大的可以自己建vmdk檔,丟到資料夾中改裝一下PEM-LAB)
雖然PEM-LAB.zip只有1.8G左右,解壓縮完後有將近15G(我應該沒記錯)。
滑鼠在點PEM-LAB.zip兩下直接拉到家目錄底下。以下過程會有點久,請耐心等候。

步驟1.

建立Lab101
路徑切換到PEM-LAB,並執行labmenu.sh,見下圖。(labmenu.sh不能執行的話,請先chmod +x labmenu.sh, 在PEM-LAB附錄底下用ll指令, 看到labmenu,sh是綠色的就代表有chmod成功)



執行完後會出現下圖,請選1.新增Lab系統


再輸入Lab名稱:Lab101(請不要改名字,因為bash script會去抓現有的資料夾名稱)這動作會去產生一個vm叫做GW100,這是當作datanode要上網的gateway。請見下圖。




步驟2.

建立Lab301
再選擇一次1.新增Lab系統,Lab名稱:Lab301(名稱也不要改)。這動作是要產生三台vm要當作DataNode跟TaskTracker。
因為我虛擬電腦都已經有了所以會出現這畫面,各位看官的會不一樣,反正會出現建立中的字眼,時間會較長,這過程請耐心等候。請見下圖。


步驟3.
啟動GW100,HDP141,HDP142,HDP143
建立完成後再來就是啟動vm。回到剛才的選單中,選擇2.啟動Lab系統。
分別啟動Lab101以及Lab301,請見下圖。





步驟4.全部都啟動完後,來用virsh指令確認一下都啟動了。見下圖。


HDP141 HDP142 HDP143的帳密是pablo/701029,各位看官請自行建立一個跟自己主戰機一樣的帳號吧(密碼不一定要一樣,因為是用ssh登入的)!帳號一至是為了日後使用ssh自動登入啟動Hadoop時用的。



步驟5.
這步驟要修改vm的ip以及hosts,由於這三台vm要當作datanode所以ip要是static的,ip分別是

HDP141 192.168.100.41

HDP142 192.168.100.42
HDP143 192.168.100.43


首先開啟虛擬機器管理員,點選HDP141按下開啟,這時你會看到文字界面server就跳出來了,見下圖


先用pablo/701029先用這組帳密登入,下一個步驟會教如何新增帳號。進入後要去修改
/etc/hosts以及/etc/network/interfaces,見下圖
1.sudo nano /etc/hosts
進入後按照下圖的輸入,後面的ssh操作或是Hadoop的建置都要用到hosts
我是習慣用hostname來操作,也是可以直接用IP

2.sudo nano /etc/network/interfaces,把hdcp改成static並在下面加入圖中四行


3.修改完後登出再登入,確認ip是否改變了


4.HDP142,HDP143照以上步驟修改就行了


照理說產生完虛擬網路設備跟電腦後,要ifconfig -a要跟互ping看看,這邊我就不做了。


步驟6.

如果不會建立新帳號的話,請看以下。(XXXX代表你要建立的帳號)
1.pablo@UD1204:~$sudo useradd -m -s /bin/bash XXXX 
2.pablo@UD1204:~$sudo passwd XXXX
3.接下來連續兩次會問你想要對這帳號建立啥密碼
4.XXXX要有sudo的權限,請下指令 sudo nano /etc/sudoers 到裡面去對XXXX作編輯(在很靠近最下面的地方),請見下圖。
5.登出,再用你所建立的新帳密登入。

步驟7.

按照上面說明過的方法安裝JDK以及安裝Hadoop的步驟對HDP141 HDP142 HDP143再做一次
因為各位會建立新的登入帳號,所以請對你新建立的帳號再做一次安裝JDK以及安裝Hadoop
問題來了!!要如何把安裝檔放到這三個vm中呢?這也困擾過我許久,這邊就分享一下我的作法
到位置--連接到伺服器 按下去你會看到下圖就按照下圖中的輸入,帳密就用你此時登入HDP141的帳密(應該是你新增加的帳號)

按下連線,就會開啟了ubuntu server的資料夾,


此時就把jdk-6u32-linux-x64.bin丟到/home/XXXX裡面,就開始對HDP141安裝JDK還有設定環境變數(要設定跟本機的路徑一樣)。這時先不要丟hadoop-1.0.3.tar.gz,因為在[第三篇]中會用scp的方式把資料夾整個複製過去。我以HDP141為例,其他兩台請如法泡製。

設定環境變數時PATH勿必要先加入/home/XXXX/hadoop-1.0.3/bin,避免稍候還要費工回來設定一次

步驟8.

這邊只是說明一下裝好的硬碟檔到底在哪裡?就在你的家目錄中會有個myLab的資料夾,裡面裝的硬碟檔就是剛才建立的Lab系統(sudo ./labmenu.sh),哪天一不開心想要砍掉就到iLab管理系統選單中去刪掉,要關機時也可以進入選單中停止Lab系統。強烈建議對於vm還是要正常關機,盡量不要暴力關機,雖然ext4比ext2穩定多了但是vm不正常關機難保會有啥檔案受損,虛擬電腦都是各位看官花時間建立出來的
如果是利用virsh的GUI建立的vm硬碟檔,路徑是在/var/lib/libvirt/images裡面
至於如何使用kvm以及virsh來建立vm必且管理他們,可以拜一下谷歌大神,關鍵字是"Linux KVM研究室",保證受用無窮



[第三篇]

還有耐心看到這邊的看官們辛苦了,我們來進一段工商服務,輕鬆一下!!
"Hadoop"這名字的由來是很萌的,來自於Hadoop創立者,Doug Cutting,他兒子的黃色大象玩偶的名字。妙吧!讓我們繼續進入正題。這篇的主要內容是配置Hadoop配置設定檔以及ssh自動登入。
在下剛研究,學的還不精,寫不出太深入的內容,有些過程我就簡單帶過了
Hadoop用於HDFS權限的使用者身份,就是在用戶系統上執行whoami命令看到的身份,所以DataNode跟NameNode的帳號不一樣時用ssh登入就很麻煩了,所以我自己習慣把vm的登入帳號設成跟我主戰機一樣,方便記憶跟設定
datanode跟namenode的java以及hadoop版本都要一樣,還有hadoop的組態設定也要一樣,
所以我習慣先在主戰機(datanode)中先編輯好,在一次的scp過去namonode中
以下是我建立環境的如果有不方便之處各看官請多多包含


步驟1:


這範例都以最基本的配置來介紹,需要更深入的設定就要拜神了
需要設定的組態配置有以下這幾個,位在/hadoop-1.0.3/conf中
core-site.xml(Hadoop組態XML,Hadoop核心的組態設定,例如HDFS和MapReduce共通的I/O設定)
hdfs-site.xml(Hadoop組態XML,HDFS背景服務的組態設定:namenode,datanodes,secondary namenode)
mapred-site.xml(Hadoop組態XML,MapReduce的背景服務的組態設定:jobtracker,tasktrackers
hadoop-env.sh(bash腳本,Hadoop運行時所用到的環境變數)
masters(純文字檔,一行代表一個運行secondary namenode的主機清單)
slaves(純文字檔,一行代表一個運行datanode和tasktracker的主機清單)

讓我們來一個一個編輯吧,我都是採用最小的需求來編寫設定,事實上還有非常多的屬性可以設定,就煩請自己Google了。推薦一個網站,設定檔講得很詳細。


首先是core-site.xml請見下圖

core-site.xml中的fs.default.name預設值是file:///,建議直接使用cluster mode指定hdfs://hostname:9000,要注意Hadoop是依據hostname去做ip binding,所以要注意/etc/hosts裡 hostname不能對應到 127.0.0.1,要對應實際的ip。
hadoop.tmp.dir路徑請改成自己的路徑(很明顯的我都是放在家目錄底下,因為我懶),要一樣也行啦。這預設是/tmp,如果不希望被系統自動清除掉的話,就換一個地方放吧。

再來是hdfs-site.xml,dfs.replication這屬性代表你傳到檔案系統中要存幾份,不寫的話default是3份,這裡是我雞婆多寫了上去。

dfs.name.dir指定本機上存取fsimage及editlog的目錄,這個目錄非常的重要,如果損毀就無法存取HDFS的資料了,所以不建議放在${hadoop.tmp.dir}目錄下。
dfs.data.dir指定本機上放datanodes資料的目錄。
請見下圖。

再來是mpared-site.xml,請見下圖。

mapred.job.tracker設定jobtracker的hostname及port,一般常看到的設定是 localhost:9001。不過跟core-site.xml裡的fs.default.name一樣,會建議用hostname來設定。
mapred.system.dir在HDFS上的資料夾,放所有MapReduce jobs相關的控制資訊,一個正在執行的 MapReduce jobs 會在這個目錄裡建立一個子目錄。
mapred.local.dir在tasktracer上存放暫存資料的目錄。
mapred.temp.dir在HDFS上一個共享的資料夾,放所有 MapReduce 相關的暫存資料。
以上三個"dir"我都是用預設值,不寫上去的話也沒差。
mapred.tasktracker.map.tasks.maximum是設定tasktracer可同時執行的mapper數量。一般來說,設定的值會依CPU core數而定。例如:一台機器有8 core CPU,一個core跑兩個processes,可使用的數量是8×2-2=14(要減掉datanode及tasktracer使用的slot數),則mapper及reducer數量可設為7。

再來是hadoop-env.sh

主要需要設定
export JAVA_HOME=/home/pablo/jdk1.6.0_32
export HADOOP_HEAPSIZE=2048
export HADOOP_LOG_DIR=/home/pablo/hadoop-logs/kvm/
export HADOOP_CONF_DIR=/home/pablo/hadoop-1.0.3/conf
圖很長所以分兩節,就自己辛苦一點找到地方加進去吧!!請見下圖。



最後是masters跟slaves,請見下圖。




以上就是步驟1的內容,對Hadoop設定檔做了編寫。



步驟2:


完成了步驟1後就是要把編寫好的Hadoop設定檔複製到datanode裡面,讓所有節點的設定都是統一的,在這之前先來作一件很重要的ssh設定。
先來對主戰機(UD1204)來產生自動登入的憑證,指令以及過程見下圖。
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
(因為我之前已經產生過一次了所以會出現是否要複寫的提醒,第一次產生的不會有。)





做完以上兩個指令後到.ssh中去看看是否有產生憑證。

有看到下圖這樣畫面就是成功產生了。

接下來測試一下ssh測試一下可否直接登入主戰機。

指令輸入ssh UD1204,如果不用輸入帳號密碼就是對了,見下圖。(第一次會問yes/no,進去後exit出來再ssh登入一次,就不會再問yes/no了)
exit跳出來接著再把ssh接著再把憑證傳到HDP141 HDP142 HDP143這三台。

請見以下步驟把憑證傳到HDP141 HDP142 HDP143這三台。

scp ~/.ssh/id_dsa.pub HDP141:/home/pablo/.ssh/authorized_keys
scp ~/.ssh/id_dsa.pub HDP142:/home/pablo/.ssh/authorized_keys
scp ~/.ssh/id_dsa.pub HDP143:/home/pablo/.ssh/authorized_keys




ssh自動登入都成功後,接下來把hadoop-1.0.3這資料夾傳送到datanode中
scp -r hadoop-1.0.3 HDP141:
scp -r hadoop-1.0.3 HDP142:
scp -r hadoop-1.0.3 HDP143:

複製完後用ssh登入到HDP141看看,就會看到hadoop-1.0.3這資料夾了,見下圖。


其他兩台就是照做了,到這步驟我的習慣是把每台機器都reboot。


步驟3:


這步驟是最後一個了,要對datanode作format以及啟動hadoop。
切記切記,沒事千萬不要隨便format,這樣會造成namenode跟datanode的namespaceid不一致,會無法正常啟動所以節點的datanode,這是我本人的切身之痛,跟大家分享分享
namespaceid在哪裡呢?
位在${HODOOP_HOME}/hadoop-${user.name}/dfs/name/current/VERSION裡面

接下來格式化分散式檔案系統指令如下:

hadoop namenode -format
跑完之後,有看到successfully formatted這字眼就代表格式化成功



最後一步"啟動hadoop",想必跟著我實作到這邊的看官們,一定很迫不及待的想要啟動這隻大象了吧?不過啟動前還是想要碎碎唸一下。(不要打我)

啟動hadoop目前就我所知的有以下三種方式:
1.start-all.sh (停止是stop-all.sh,一起啟動HDFS以及MapReduce)
2.分別啟動start-dfs.sh(啟動HDFS),start-mapred.sh(啟動MapReduce)
3.個別啟動
  bin/hadoop-daemon.sh start namenode
  bin/hadoop-daemon.sh start datanode
  bin/hadoop-daemon.sh start jobtracker
  bin/hadoop-daemon.sh start tasktracker
有啥區別哩?就指令的字面上意義我了但是這其中的奧妙我自己也不是很清楚,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈.....哈哈哈哈哈!!!!
像我這種初學者就用第一種囉,至於會用到第三種的情狀是在實戰下,也就是在真實營運環境中要增加(啟動)或減少(停止)節點時用的,這應該是比較正確的用法。


以下提供一段Taiwan Hadoop Forum 版主 Jazz大大講過的話,請慢用....

"基本上正式在長期營運的叢集環境,我們也不是用 start-all.sh 跟 stop-all.sh 去一次啟動。而是讓每一台機器在開機過程中(寫在 init.d 裡下的 script,就像變成 Windows 的「服務」跑在背景一樣,就像 Windows 的「啟動」會在每一次使用者登入時執行某些執行檔),讓每台機器自己去執行 hadoop-daemon.sh 啟動必要的 namenode, datanode, jobtracker, tasktracker。唯有這樣,才能達成「分散式」,具備無限擴充彈性,可以動態新增計算節點,動態移除節點的特徵。採用一次啟動的方式,本身是集中式的概念,要就全開,要就全關,這種想法根本就不是 Hadoop 這種分散式架構的本意。想一想,如果您今天要管理四千台電腦,要新增一台機器,還要去改 slave,把 slave 檔拷貝到四千零一台去,然後通知所有使用者要關閉服務,接著下 stop-all.sh,然後下 start-all.sh 這樣合不合理。這個留給您慢慢體會了。Linux 的學習歷程還長著呢~"
不過我還是不爭氣的用第一種方式一次啟動吧XD,讓我們繼續下去吧


啟動成功的畫面就是會像這樣子,namenode可以不用密碼自動登入並啟動所有服務
來在datanode以及namenode下個jps指令看看啟動了哪些服務
下圖可以看到namenode啟動了啥服務

下圖可以看到datanode啟動了啥服務


也可以用hadoop dfsadmin -report來看看有哪些datanode被啟動了

Datanodes available有三個

呼~~~終於大功告成了


以上就是[Linux KVM 建置Hadoop完全分散環境]的架構流程,說真的這一個虛擬的網路架構不是說很優,但是我的斤兩就只能這樣了,只是一個學習玩弄這隻大象的一個環境,堪用就好,不過我有更好的想法或是發現更好的方法,我會持續的修改這篇文章的

這篇只有說明了環境架構而已,還有HDFS的檔案操作以及如何使用Eclipse來開發MapReduce有空再寫到另外一篇網誌吧

1 則留言: