最近因故碰到了Hadoop...
很早之前就知道這個東西,擁有頗多用戶的分散式(雲端)運算工具。
不過不知為何網路上總是缺少簡單、明確的安裝指引,
甚至我這次安裝過程中發現的一些很重要的問題都沒人提到,
所以決定自己來寫一篇。
什麼是Hadoop
Hadoop是Apache Software Fundation旗下的一個分散式檔案系統與分散式計算工具,
以Java開發且開放原始碼。
Hadoop主要可以分成兩個部份,
負責分散式資料儲存HDFS(Hadoop Distributed File System),
與分散式運算的MapReduce engine。
Hadoop的架構
以伺服器的角色來說,可以區分成master、slave兩種角色,
以功能來說,HDFS與MapReduce兩個功能區塊也有各自的對應元件,
總共有四種主要元件。
HDFS:
NameNode: 提供HDFS運作、管理功能,僅在master端運作 (也就是hdfs-site)
DataNode: 儲存資料用,在slave端運作
MapReduce:
JobTracker: 提供分散式計算功能,在master端運作分配計算工作 (也就是mapred-site)
TaskTracker: 處理計算工作,在slave端運作
如果把一台機器同時設為master與slave,那麼這四種元件會一起運作。
可參考Wikipedia上的架構圖:
http://en.wikipedia.org/wiki/File:Hadoop_1.png
安裝環境
我選用的是Hadoop 1.2.1,目前最新的stable version,
安裝在分別為Fedora 14、15(都是x86 64bit)的兩台server上(一台master、一台slave),
Java環境使用的是java-1.6.0-openjdk。
Hadoop我直接使用官方的rpm安裝,比較省事。
目前搜尋到的大部分範例都是單機安裝,對於有兩台或以上的cluser模式,
並沒有多所著墨,這也是我想寫出來的原因。
相關路徑
這就是目前找到的一堆安裝說明,都沒有交代清楚的地方。
設定擋路徑:
存放Hadoop的各項設定檔案,rpm預設在/etc/hadoop/
也可以在hadoop-en.sh中用export HADOOP_CONF_DIR=...設定
記錄檔路徑:
存放運行的記錄檔,如果有問題的話可以拿來檢查用。
rpm預設存放位置是/var/log/hadoop/(user name)/
也可以在hadoop-en.sh中用export HADOOP_LOG_DIR=...設定
處理程序檔路徑:
就是存放pid檔的路徑,rpm預設在/var/run/hadoop
也可以在hadoop-en.sh中用export HADOOP_PID_DIR=...設定
暫存檔路徑:
Hadoop運作中會使用的一些暫存資料存放的位置,
會使用/tmp,hadoop-env.sh中似乎沒看到這項設定
(HDFS如果沒指定...也會用/tmp)
Java路徑:
JRE或JVM的位置,rpm預設是/usr/java/default,
也可以在hadoop-en.sh中用export JAVA_HOME=...設定
以上這些路經,除了好像沒得指定的那個外,
可以在hadoop-env.sh中設定好後run一次hadoop-env.sh,
或是跟我一樣用ln製作替身的方式連結到需要的位置,
看個人管理習慣而定。
網路環境相關
這是另一個很少人說清楚的地方了。
首先不管是cluster還是單機,
master端的iptable要設定幾個port給web UI用,除非你不想監視Hadoop運作狀況。
50030: JobTracker的頁面,有slave的話可以顯示slave tasktracker資訊
50070: NameNode的頁面,有slave的話可以顯示slave datanode資訊
其他如顯示個別TaskTracker的50060、個別DataNode的50010等等則看需求情況使用。
如果是安裝成cluster,
master那台還需要設定兩個port讓slave那邊聯絡JobTracker以及NameNode用。
9000: NameNode
9001: JobTracker
還有,同樣也是對於cluster,每臺機器要可以用22 port ssh。
接下來,是讓我困擾很久,卻沒人提到的/etc/hosts問題,
如果要用cluster,一定要設定好/etc/hosts,
我不知道為什麼用IP不行,
(Hadoop竟然會把IP當domain name用,設定163.13.***.***,會當成這臺機器叫163)
設定完整host_name.domain_name的話應該要所有server都有加入網域才行。
所以最簡單的就是把每一臺的/etc/hosts都設好cluster中各臺的資訊
(IP) (hostname)
...
注意不要把host name設到127.0.0.1去,127.0.0.1請保留localhost就好,
不然會無法正常運作。
安裝後設定
使用rpm安裝好後,先處理好前面提到的路徑問題,
要用hadoop-env.sh改路徑的就改一改,想用ln做替身連結的就做一下。
接下來建立一個使用者(以我的管理概念,我會建一個使用者專門處理),
並且把該使用者的主要群組設為hadoop(這個群組在安裝Hadoop時會產生),
(也就是-G hadoop,再看有沒有需要給root副群組 -g root,我是沒給,看管理概念)
每臺機器上都要建立這個使用者,名稱要一樣。
使用者建好後,在記錄檔路徑內,以使用者的名義建一個資料夾,
所有者請務必指定給剛才新建的user。 (否則啟動時可能會跟你說權限不足,無法建立log)
至於要分給hadoop群組的原因,是因為Hadoop安裝時,
會把建立的PID檔路徑的所有者設定給hadoop群組,
如果不把啟動Hadoop的使用者設好hadoop群組,可能會跟你說沒權限建立PID檔。
然後設定擋路徑內,幾個主要的設定檔要調整:
core-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://(master host name):9000</value>
</property>
</configuration>
這個設定檔是設定一些主要的設定值,包含負責HDFS的NameNode在哪。
hdfs-site.xml:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
這個純粹試看資料要replicated多少份
可以另外用dfs.name.dir、dfs.data.dir目設定HDFS的存放空間要在哪裡,
沒設定的話會用/tmp (看你的HDFS是真要存放資料,還是僅存放分散式計算的暫存資料)
mapred-site.xml:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>(master host name):9001</value>
</property>
</configuration>
這個是對於MapReduce的設定,也就是設定JobTracker在哪。
masters與slaves:
分別把有哪些master與slave列出,一行一個,
務必要寫host name,不要因為是同一臺機器而寫localhost,
否則也會無法正常運作,
注意要跟剛才講的/etc/hosts內的host name一樣。
(要讓master也進行slave的工作的話,就在兩個檔案都放上host name)
以上,如果不是很複雜的cluster,
則master跟slave的設定檔完全一樣,所以可以直接複製的。
都設定好後先執行HDFS format,
hadoop namenode -format
(在master那端執行就可以了)
這邊列出的只有最基本的設定,
其他詳細的設定,可以去翻文件調整。
啟動與停止
Hadoop的操作指令,如果是用rpm安裝的話會在/usr/sbin下,
如果是手動安裝,就看你放哪裡了。
想偷懶就直接用start-all.sh與stop-all.sh來啟動或停止。
(別用sudo,用剛才建立的hadoop專門user啟動)
在master上操作啟動/停止即可,master會透過ssh去啟動或停止slave。
(使用相同使用者名稱)
不過有個問題就是,他會問你密碼,
如果是cluster的話,可能會發生多個密碼詢問在console下重複的情形,
(同時有多台機器在問你密碼,重複時只會有一個認證成功)
所以啟動、停止都要有點耐心。
(這可以算是小bug嗎:p ... 想解決這問題可以用預先把ssh的key丟進使用者家目路下的ssh設定檔目錄,讓ssh可以免密碼認證...)
啟動後,可以上http://(master):50030跟http://(master):50060檢查運作狀況,
如果有正常設定好,應該可以看到所有節點的資訊都有列出來。
重置
如果用一用發現一些問題怎樣解都解不掉,就該重置一下了,
主要就是把PID檔跟暫存資料都砍掉。
方式為將PID檔目錄、log檔目錄、/tmp內跟hadoop有關的都清空,
然後重新format一次HDFS。
心得
其實我一直很不喜歡Java,我想討厭Java的人應該也不少...哈,
如果有種一樣的工具是C/C++開發的就太棒了。
Hadoop目前並不像一些發展很成熟的service daemon那樣有完整的封裝與整合,
所以在操作與設定上會較為繁瑣。
希望這篇能有所幫助。
沒有留言:
張貼留言