blog.Ring.idv.tw

Open Source

建構屬於自己的Cloud Computing - Hadoop

本文的主旨在於整個Hadoop的環境安裝教學,其它的相關資訊將會另闢說明~

筆者採用目前Hadoop-0.16.4「Stable」版本來建構~

硬體環境

我採用了三台機器來建構,並且為它們都裝上「Debian Linux 4.0r3 (amd64)」的作業系統~ 如下述所示:

主機名稱:hdp-1 IP:192.168.0.10 功能:NameNode、JobTracker、DataNode、TaskTracker

主機名稱:hdp-2 IP:192.168.0.11 功能:DataNode、TaskTracker

主機名稱:hdp-3 IP:192.168.0.12 功能:DataNode、TaskTracker

我在安裝時為這些主機都建立一個名為「hdp」的使用者帳號~

建構步驟

.下載「hadoop-0.16.4.tar.gz」並解壓縮~ 然後搬到「hdp」的家目錄

wget http://ftp.tcc.edu.tw/pub/Apache/hadoop/core/stable/hadoop-0.16.4.tar.gz
tar zxvf hadoop-0.16.4.tar.gz
mv hadoop-0.16.4 /home/hdp/

{重要}修改「三台」主機的「/etc/hosts」,讓彼此的主機名稱和IP位址都能順利地被解析

127.0.0.1       localhost       localhost
192.168.0.10    hdp-1   hdp-1
192.168.0.11    hdp-2   hdp-2
192.168.0.12    hdp-3   hdp-3

.接著安裝你的Java環境在「每台機器」上,這裡我們以「jdk1.6.0_06」為例,並將目錄搬移至「/usr/java/」底下

./jdk-6u6-linux-x64.bin
mkdir /usr/java
mv jdk1.6.0_06 /usr/java/

.「每台機器」請安裝必要的相關軟體,因為Hadoop會透過SSH來啟動和停止各節點的程式

sudo apt-get install ssh

.然後設定你的SSH可以透過公鑰認證的方式來連線,相關細節可參考「鳥哥的Linux 私房菜 - 遠端連線伺服器 Telnet/SSH/XDMCP/VNC/RSH」,筆者在這裡列出我的相關設定

ssh-keygen -t rsa
cd /home/hdp/.ssh/
cat id_rsa.pub >> authorized_keys
ssh hdp-1

現在應該就不需要密碼即可登入hdp-1本身的機器了~ 不過我們也要利用這樣的方式來登入另外兩台機器,分別為hdp-2、hdp-3,所以請一併地在這兩台機器下的「/home/hdp/」都建立一個「.ssh」的目錄夾,然後用「scp」拷貝「authorized_keys」到這些機器上即可:

sudo scp authorized_keys hdp-2:/home/hdp/.ssh/ 
sudo scp authorized_keys hdp-3:/home/hdp/.ssh/ 
ssh hdp-2
ssh hdp-3

.接著開始進行修改Hadoop的相關設定,首先先修改「conf/masters」、「conf/slaves」這兩個設定檔(修改hdp-1即可)。

Secondary NameNode設定:(<HADOOP_HOME>/conf/masters)

hdp-2

Slave設定:(<HADOOP_HOME>/conf/slaves)

hdp-1
hdp-2
hdp-3

.然後修改一下「conf/hadoop-env.sh」來設定Hadoop的環境變數

export JAVA_HOME=/usr/java/jdk1.6.0_06

.接著修改Hadoop的相關參數設定「conf/hadoop-site.xml」,範例如下:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
  <name>fs.default.name</name>
  <value>hdfs://hdp-1:9000/</value>
</property>
<property>
  <name>mapred.job.tracker</name>
  <value>hdp-1:9001</value>
</property>
<property>
  <name>dfs.name.dir</name>
  <value>/home/hdp/dfs/name</value>
  </property>
<property>
  <name>dfs.data.dir</name>
  <value>/home/hdp/dfs/data</value>
</property>
<property>
  <name>dfs.replication</name>
  <value>1</value>
</property>
</configuration>

.最後用「scp」將「hdp-1」的Hadoop整個環境設定及目錄結構拷貝到另外兩台機器上

scp -r /home/hdp/hadoop-0.16.4 hdp-2:/home/hdp/
scp -r /home/hdp/hadoop-0.16.4 hdp-3:/home/hdp/

到這邊大致上就完成屬於你自己的Cloud Computing環境建構了~ 接下來就是啟動Hadoop,並用個小範例來玩玩嚕~

啟動Hadoop

.先格式化一個新的分散式的檔案系統HDFS

<HADOOP_HOME>/bin/hadoop namenode -format

會出現如下所示的相關訊息:

08/06/09 23:45:54 INFO dfs.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = hdp-1/192.168.0.10
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 0.16.4
STARTUP_MSG:   build = http://svn.apache.org/repos/asf/hadoop/core/branches/branch-0.16 -r 652614; compiled by 'hadoopqa' on Fri May  2 00:18:12 UTC 2008
************************************************************/
08/06/09 23:45:55 INFO fs.FSNamesystem: fsOwner=hadoop,hadoop,dialout,cdrom,floppy,audio,video,plugdev,netdev,powerdev
08/06/09 23:45:55 INFO fs.FSNamesystem: supergroup=supergroup
08/06/09 23:45:55 INFO fs.FSNamesystem: isPermissionEnabled=true
08/06/09 23:45:55 INFO dfs.Storage: Storage directory /home/hadoop/dfs/name has been successfully formatted.
08/06/09 23:45:55 INFO dfs.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hdp-1/192.168.0.10
************************************************************/

.接著就給它啟動「Hadoop」嚕~

<HADOOP_HOME>/bin/start-all.sh

要驗證所有過程是否無誤~ 可以參閱「<HADOOP_HOME>/logs/」相關的紀錄檔~

或是開啟NameNode的網頁介面來觀察,若依筆者的設定則需開啟「http://hdp-1:50070/」來觀察,配置正確的話應該有三台DataNode是活著的 ^^v

跑Hadoop範例

這裡我們用官方的一個「WordCount」範例來介紹~

主要建立兩個文字檔,裡頭的單字都用空格來區隔~ 以方便範例程式來運作~

比較重要的是「<HADOOP_HOME>/bin/hadoop dfs -put ./testdata input」,這一行就是用來將「testdata」目錄夾寫入到「HDFS」裡~

mkdir testdata
cd testdata
echo "hello world bye hello" > file1.txt
echo "hadoop hello goodbye hadoop" > file2.txt
cd ..
<HADOOP_HOME>/bin/hadoop dfs -put ./testdata input

最後就跑給它看嚕~ 看看小飛象能飛得多快~ 哈哈~ ^^b

<HADOOP_HOME>/bin/hadoop jar hadoop-0.16.4-examples.jar wordcount input output

執行結果:

08/06/10 00:03:24 INFO mapred.FileInputFormat: Total input paths to process : 2
08/06/10 00:03:25 INFO mapred.JobClient: Running job: job_200806092347_0001
08/06/10 00:03:26 INFO mapred.JobClient:  map 0% reduce 0%
08/06/10 00:03:28 INFO mapred.JobClient:  map 33% reduce 0%
08/06/10 00:03:29 INFO mapred.JobClient:  map 100% reduce 0%
08/06/10 00:03:35 INFO mapred.JobClient:  map 100% reduce 100%
08/06/10 00:03:36 INFO mapred.JobClient: Job complete: job_200806092347_0001
08/06/10 00:03:36 INFO mapred.JobClient: Counters: 12
08/06/10 00:03:36 INFO mapred.JobClient:   Job Counters
08/06/10 00:03:36 INFO mapred.JobClient:     Launched map tasks=3
08/06/10 00:03:36 INFO mapred.JobClient:     Launched reduce tasks=1
08/06/10 00:03:36 INFO mapred.JobClient:     Data-local map tasks=1
08/06/10 00:03:36 INFO mapred.JobClient:   Map-Reduce Framework
08/06/10 00:03:36 INFO mapred.JobClient:     Map input records=2
08/06/10 00:03:36 INFO mapred.JobClient:     Map output records=8
08/06/10 00:03:36 INFO mapred.JobClient:     Map input bytes=50
08/06/10 00:03:36 INFO mapred.JobClient:     Map output bytes=82
08/06/10 00:03:36 INFO mapred.JobClient:     Combine input records=8
08/06/10 00:03:36 INFO mapred.JobClient:     Combine output records=6
08/06/10 00:03:36 INFO mapred.JobClient:     Reduce input groups=5
08/06/10 00:03:36 INFO mapred.JobClient:     Reduce input records=6
08/06/10 00:03:36 INFO mapred.JobClient:     Reduce output records=5

執行完成之後,我們再將HDFS下的output資料夾抓出來看~

<HADOOP_HOME>/bin/hadoop dfs -get output output
cat output/*

輸出的結果就是:

bye     1
goodbye 1
hadoop  2
hello   3
world   1

成功啦~ 恭禧你!! ^^v

要停止Hadoop的運作只要下「bin/stop-all.sh」指令即可~

結論

本文一整個打了很多字~ 如果有介紹未盡詳細的地方,請參閱相關資源~

或是連結到本站的另一篇「一個值得研究的領域 - Hadoop」~

如果在安裝過程之中有任何問題~ 非常歡迎留言討論~ 如果本文有任何謬誤的地方,也請不吝地給予指正,必當感激!!

2008-06-10 00:13:02 | Comments (67)

Hadoop經驗談 - Facebook

上圖就是年僅24歲(May 14, 1984)Facebook的創辦人「Mark Zuckerberg」~ XD

Facebook.採用了Hadoop來作為後端整個分散式平行處理的Framework~

它們用了將近2,500個CPU核心~ 如果以Dual Core的CPU來計算的話~ 那他們光是電腦硬體設備就有1,250多台~ 儲存空間也多達1PB(PetaByte)~ 遠比Wikia.com的125台多了整整十倍~ 不過還是比Yahoo!少~ Yahoo!將近有10,000台(2007)~ 而我家只有... 3台~ 那A差那麼多~ ^^a 因為革命尚未成功啦~ XD

有興趣的朋友來看看這篇由Facebook的工程師「Joydeep」寫的Hadoop分享文~ Engineering @ Facebook's Notes - Hadoop

Doug Cutting真是偉大~ ^^b

2008-06-08 18:13:15 | Add Comment

我家的三朵雲運算 - Hadoop

上面這張圖是我親愛的指導老師「游耿能」老師幫我要到的三台伺服器~ 讓我得以玩「Hadoop」~ ^^v

感謝老師呀!~ 您總是那麼的支持我!!! T_T 感動...

雖然只有三台~ 不過~ 對我來說夠了~ 三台就很了不起了~

上個月就已經在學校將Hadoop的整個環境給它架設起來~

不過有個問題... 我根據Hadoop官網的「Quickstart」教學來跑一個範例~ 可是每次在執行時總會停在「reduce」階段就不動了... 有沒有人也在玩的~ 大家交流一下吧~

找個時間再來研究一下~ 這對於Inverted Index的產出效率可是有非常大的幫助 ^^b

2008-06-02 20:34:52 | Comments (8)

BUEditor - A plain textarea editor for Drupal

BUEditor.是一個Internet文字編輯工具~ 頂頂大名的「Drupal」(content management platform)就是採用它來當做線上的文字編輯工具~

由於工作上有需要「自行開發」一個類似的工具~ 加上剛好同事在玩「Drupal」~ 我不小心發覺「Drupal」的線上文字編輯工具其實蠻不錯用的~

所以... 我的工作來了~ 就是去trace「Drupal」的這個編輯工具是怎麼寫的~ XD

在trace的過程之中~ 發現Drupal是採用「BUEditor」來達成的~ 這下子範圍就縮小了一點~

我直接去下載「BUEditor」整個原始碼來看~

呵~ 其實最重要的核心文字編輯莫過於下面這幾行程式了~ 呼~ 今天有點收獲~ ^^

相關工具

FCKeditor - the text editor for internet

相關資源

Enable tabbing inside textarea - roScripts

2008-05-27 16:01:45 | Comments (5)

取得MediaWiki Editable Text - MediaWiki API

取得MediaWiki Editable Text.這是先前利用Web Scraping的方式取得MediaWiki Editable Text的作法,然而現在有更好的方式來完成這樣的工作~

我們目前可以透過「MediaWiki API」來協助我們做這樣的事項~

<?php
require_once "HttpClient.php";
if($_GET)
{
	$sentence = $_GET['input'];
	$uri = "http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=$sentence&rvprop=content&format=php";
	$body = HttpClient::quickGet($uri);

	$body = unserialize($body);
	$body = array_pop($k["query"]["pages"]);
	echo $body["revisions"][0]["*"];
}

API的時代果然來臨了...

2008-05-12 15:05:12 | Add Comment

Next Posts~:::~Previous Posts
Copyright (C) Ching-Shen Chen. All rights reserved.

::: 搜尋 :::

::: 分類 :::

::: Ads :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment