雲端運算DIY系列【1】:單節點版 Hadoop on CentOS5

多虧internet, 開放源碼以及虛擬化技術,要玩個小規模的雲端運算,自建平台,只要花點時間研究一下英文文件就可以。等玩出興趣了,也有實際應用需求了,隨時就可上手將服務雲端化。 在台灣,除了自己玩,也可以參與CloudTW雲端運算社群。可以加入社群的討論區或Facebook粉絲專頁,跟著社群成長,參與聚會(剛好11/17有第四次的社群meetup活動)或討論增廣見聞,交流心得新知。
評論
評論

前言

有想玩自建雲端雲算平台,並開始踏出第一步嗎?多虧 internet, 開放源碼以及虛擬化技術,要玩個小規模的雲端運算,自建平台,只要花點時間研究一下英文文件就可以。等玩出興趣了,也有實際應用需求了,隨時就可上手將服務雲端化。

在台灣,除了自己玩,也可以參與

什麼是 Hadoop?

Hadoop 專案的目標是希望提供開放源碼的軟體,來建立穩定可擴充的分散式運算平台。

本文目標?

在一個 CentOS 5 的 Linux 系統上安裝 Hadoop 單節點版。初步了解相關使用。

參考資料

Hadoop Common 0.21 版 英文文件 + 安裝經驗

安裝步驟

第一步:準備 Linux 環境 + JDK

1. 安裝 CentOS5.5, 將軟體進行補丁更新。

2. 安裝 Sun JDK,在本練習中下載的是 jdk-6u22-linux-i586-rpm.bin,可上 Sun 官網找一模一樣的版本就可完整照著做。

# sh ./jdk-6u22-linux-i586-rpm.bin   //用 root

3. 確認系統用的是 SUN JDK

# java -version

CentOS 5 的預設 JAVA 套件是 Open JDK,所以執行上面這行後會出現

java version "1.6.0_17″
OpenJDK Runtime Environment (IcedTea6 1.7.5) (rhel-1.16.b17.el5-x86_64)
OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)

如果系統目前預設 OpenJDK,用以下步驟換成‭ ‬SUN JDK

‭#‬‭ ‬alternatives‭ --‬install‭ /‬usr/bin/java java‭ /‬usr/java/jdk1.6.0‭_‬22‭/‬bin/java 20000
‭# ‬alternatives‭ --‬install‭ /‬usr/bin/javaws javaws‭ /‬usr/java/jdk1.6.0‭_‬22‭/‬bin/javaws 20000
‭# ‬alternatives‭ --‬install‭ /‬usr/bin/javac‭  ‬javac‭ /‬usr/java/jdk1.6.0‭_‬22‭/‬bin/javac 20000
‭# ‬alternatives‭ --‬config java

有‭ ‬3‭ ‬程式提供‭ ‘‬java‭'‬。

‭  ‬選擇‭        ‬指令
-----------------------------------------------
‭ + ‬1‭           /‬usr/lib/jvm/jre-1.6.0-openjdk.x86‭_‬64‭/‬bin/java
‭   ‬2‭           /‬usr/lib/jvm/jre-1.4.2-gcj/bin/java
‭*  ‬3‭           /‬usr/java/jdk1.6.0‭_‬22‭/‬bin/java

請輸入以保留目前的選擇‭[+]‬,或輸入選擇號碼‭:‬3

做到現在,系統預設的 JDK 就變成 Sun 的 JDK,檢查一下:

‭# ‬java‭ -‬version
java version‭ "‬1.6.0‭_‬22‭"‬
Java‭(‬TM‭) ‬SE Runtime Environment‭ (‬build 1.6.0‭_‬22-b04‭)‬
Java HotSpot(TM‭) ‬Client VM‭ (‬build 17.1-b03‭, ‬mixed mode‭, ‬sharing‭)‬
‭#‬javac‭ -‬version
javac 1.6.0‭_‬22


第二步:單機版 Hadoop 安裝

0‭.‬    建立 hadoop 這個使用者

‭# ‬useradd hadoop
‭# ‬passwd hadoop

接下來的操作都用 hadoop 個使用者來做。

‭# ‬su‭ -- ‬hadoop

1‭.‬    下載 Hadoop 0.21

‭# ‬wget‭ ‬http‭://‬ftp.tcc.edu.tw/pub/Apache‭//‬hadoop/core/hadoop-0.21.0‭/‬hadoop-0.21.0‭.‬tar.gz

2‭.‬    解開並作初步修改後安裝

‭#‬ tar xvzf‭ ‬hadoop-0.21.0‭.‬tar.gz
‭# ‬cd hadoop-0.21.0
‭# ‬vi‭ ‬conf/hadoop-env.sh

vi 打開 haddop-env.sh 後,找到底下這行,在後面添加 JAVA_HOME 的位置

‭# ‬The java implementation to use‭.  ‬Required‭.‬
‭# ‬export JAVA_HOME‭=/‬usr/lib/j2sdk1.6-sun
export JAVA_HOME‭=/‬usr/java/jdk1.6.0‭_‬22

這樣,已經完成了 Hadoop 的安裝!

3. 測試 Hadoop 安裝是否正確

# bin/hadoop
Usage: hadoop [--config confdir] COMMAND
where COMMAND is one of:
fs                   run a generic filesystem user client
version              print the version
jar <jar>            run a jar file
distcp <srcurl> <desturl> copy file or directories recursively
archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
classpath            prints the class path needed to get the
Hadoop jar and the required libraries
daemonlog            get/set the log level for each daemon
or
CLASSNAME            run the class named CLASSNAME

Most commands print help when invoked w/o parameters.

看到 hadoop 這個指令怎麼使用的英文說明如上,代表可以使用了!

4. 單機操作模式

Hadoop 預設是單機就可執行的 JAVA 應用程式。通常用來作為測試除蟲用。我們先來執行看看:

以 Hadoop 官網上的例子:我們想查看某個目錄裡面的 xml 檔案內容中,是不是有 dfz 開頭的字存在,如果有,就找出來。假如那個目錄裡面有百萬個 xml 檔案,這樣的工作用一台電腦找就會很辛苦,但是我們有 Hadoop,這件事情就可以分散到很多機器上去執行,再蒐集結果回來。

不過,這裡只是做個試驗,因此我們把 conf/這個目錄裡的 xml 檔案當做要找的問題,複製到 input/目錄中,並把結果放在 output/目錄裡。

# mkdir input

# cp  conf/*.xml input

# bin/hadoop jar hadoop-mapred-examples-0.21.0.jar  grep input output ‘dfs[a-z.]+'

執行上述行,接下來螢幕會跑出非常多的訊息,看起來電腦跑的很忙,真令人高興。執行完了看結果,果然找到一個字 -- dfsadmin,出現一次。

# cat output/*
1       dfsadmin

我們用 Linux 上的 grep 指令來驗證一下,果然在 hadoop-policy.xml 中有看到 dfsadmin 這個字。

# grep dfs input/*
input/hadoop-policy.xml:    dfsadmin and mradmin commands to refresh the security policy in-effect.

5. 單節點分散式操作

剛剛做的是用單一個 java 執行程序來跑這個問題,基本上跟 grep 做的方法差不多,是傳統的 Unix process,沒有分散運算。

這小節要用到 Hadoop 的分散特性,在單台電腦節點上做模擬分散運算的作法,讓每個 Hadoop 的守護進程 (daemon) 各自跑一個 java process 起來,各司其職。

我們先把結果照做出來,相關名詞後續文章會進行介紹解釋。

5.1 修改 Hadoop 設定檔:

# vi conf/core-site.xml

<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>

# vi conf/hdfs-site.xml

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

# vi conf/mapred-site.xml

<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>

5.2 設定 SSH 無密碼連接

# ssh-keygen -t dsa -P " -f ~/.ssh/id_dsa
# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

# chmod 400  ~/.ssh/authorized_keys

現在你應該可以直接連接 SSH,不需要敲密碼了,試試看。

# ssh localhost

5.3 格式化分散式檔案系統,很酷吧。

英文文件說要執行 bin/hadoop namenode -format

不過,在這一版的 hadoop 裡,如果用上述指令,你會發現下面這行訊息:

DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

照他的意思,我們就改用 hdfs 這個指令來做格式化。不過,可能是因為 script 寫的不完整,他找不到 HADOOP_HOME 這個環境變數,所以我們得依照自己安裝的環境設定一下這個環境變數。以我的環境為例,我把 HADOOP 解壓縮在/home/hadoop/hadoop-0.21.0:

# export HADOOP_HOME=/home/hadoop/hadoop-0.21.0

# bin/hdfs namenode -format

格式化完之後,系統會建立/tmp/hadoop-hadoop/dfs 的目錄。

注意,如果 hadoop 已經在執行運算了,千萬不要執行格式化的指令,免得把資料刪除了。

5.4 啟動 hadoop daemons:

官方文件上寫說執行 bin/start-all.sh,不過看起來也是要 Deprecated 了。因此執行底下的指令:

# bin/start-dfs.sh
starting namenode, logging to /home/hadoop/hadoop-0.21.0/bin/../logs/hadoop-hadoop-namenode-localhost.localdomain.out
localhost: starting datanode, logging to /home/hadoop/hadoop-0.21.0/bin/../logs/hadoop-hadoop-datanode-localhost.localdomain.out
localhost: starting secondarynamenode, logging to /home/hadoop/hadoop-0.21.0/bin/../logs/hadoop-hadoop-secondarynamenode-localhost.localdomain.out

# bin/start-mapred.sh
starting jobtracker, logging to /home/hadoop/hadoop-0.21.0/bin/../logs/hadoop-hadoop-jobtracker-localhost.localdomain.out
localhost: starting tasktracker, logging to /home/hadoop/hadoop-0.21.0/bin/../logs/hadoop-hadoop-tasktracker-localhost.localdomain.out

啟動完成了,看一下帶起來的 Hadoop daemons 吧:

先用 root 把 Firewall 關掉:

# /etc/init.d/iptables stop

若是用本機的 Xwindows 上的 Firefox 看,只需要指向 localhost:

http://localhost:50070/

看到 NameNode 的狀態

http://localhost:50030/

看到 JobTracker 的狀態

看起來真是有模有樣了~

5.5 執行先前單機版跑的搜尋 dfs 開頭關鍵字的那個問題:

# bin/hadoop fs -put conf input

# bin/hadoop jar hadoop-mapred-examples-0.21.0.jar grep input output ‘dfs[a-z.]+'

接下來,你會看到終端機上吐出一大堆的訊息。執行了很久,終於回到系統提示符號。同一時間,可用 browser 連上 NameNode 與 JobTracker 看目前執行狀態。

跑完了的話來看結果(當然還是一樣!):

# cat output/*

1       dfsadmin

你會發現,用雲端運算跑的速度簡直是比單機跑的速度要慢上一大截!這是因為我們只用了一個節點做運算,而他把問題用 Map/Reduce 的方式來執行,多出了一些功夫,整體花費時間就長了。不過,這個架構才能擴充到數十數百數千台運算節點,先從單節點練習起,多節點的時候才好上手。

5.6 本文的單節點安裝與練習到此結束,停掉 hadoop 服務:

# bin/stop-dfs.sh

# bin/stop-mapred.sh

本文小結

以上內容,應該可了解:

1. 台灣的 Cloud 社群加入方式。

2. Hadoop 的基本概念。

3. 安裝好一個單節點的 Hadoop 系統。

若有相關問題,請用留言系統回覆或溝通。謝謝。



精選熱門好工作

前端工程師

VeryBuy非常勸敗
臺北市.台灣

獎勵 NT$15,000

專案經理(PM)

關鍵評論網股份有限公司
臺北市.台灣

獎勵 NT$15,000

樂趣買Customer Service Specialist(Rakuma)

台灣樂天市場
臺北市.台灣

獎勵 NT$15,000