blog.Ring.idv.tw

Hadoop

Cloudera - 專門針對Hadoop技術支援的公司

Cloudera.一間提供Hadoop相關支援服務的新公司~ 而且裡面盡是一些大ㄎㄚ.. @@" 光看學歷就夠嚇人了,有Stanford、Harvard、Washington、Berkeley和Cambridge,在現在這個時候開一間這樣的公司~ 果然前景看好,因為太熱門了呀!!

其中Christophe Bisciglia在今年年初還有來台灣舉辦Google Cluster Computing Workshop,不過他剛離開Google了~ = ="

還有Tom White,正在寫「Hadoop: The Definitive Guide」這本書籍... XDD

我如果能進去打雜就算不錯了吧~ 哈!

2008-10-22 02:55:39 | Add Comment

檔案系統入門篇

本篇的主旨在於「協助入門Hadoop」並能快速地掌握一些概念,所以筆者先以基本的檔案系統(file system)來敘述,故本篇不會包含「HDFS」,當然文中若有任何謬誤的地方,麻煩不吝地給予指教,筆者必當感激!

感謝 Yi-Kai 協助Review本文。

何謂檔案系統?它和檔案格式(file format)有什麼不同?

筆者先行介紹一下檔案格式,這裡我們先來想像一個劇情,通常我們電腦開機後,進入到作業系統之中,然後就開始進行我們想要執行的程式,例如:上網我們可以開啟Firefox,聽音樂我們可以開啟一個MP3,看影像我們可以開啟任一張JPEG等相關格式的影像,OK, 劇本就到此為止,現在我們來回顧上述的情況,為何我們點選一張影像左鍵兩下,就可以開啟這張影像並顯示出來?必然是我們系統有個看圖軟體(e.g. ACDSee)或是美工軟體,而這些軟體都會向作業系統註冊一些指定用來開啟的檔案格式,也就是說,只要你點選特定的影像檔案格式(e.g. jpeg,png),它就指定用這些相關軟體來開啟,所以作業系統會先載入這個特定軟體到記憶體,然後由這個軟體來開啟這張影像檔。

重點就在於開啟這張影像檔時,看圖軟體就會開始剖析你剛剛所點選的這張影像檔,如: jpeg,然後並顯示出來在螢幕上,從這裡我們可以知道,我們所利用手機或數位相機所拍攝的影像資訊都會儲存在這個檔案格式中,當然一個影像檔案格式它所包含的資訊也許不只有影像資料,我們可以在一個用數位相機拍攝的影像檔上,按右鍵點選「內容」並在「摘要」項目可以看到我們當時拍攝的一些相關資訊,如:拍照時間、快門、曝光、光圈等資訊。筆者再舉另一個實際的例子,在windows xp的作業系統上,倘若我們開啟一個放滿影像的目錄夾,並在瀏覽模式選擇「縮圖模式」,你會發現在目錄夾中自動地多出一個名為「Thumbs.db」的檔案,這個檔案沒有任何惡意,它純粹用來存放縮圖影像的快取資訊而已,有興趣的話可以用相關的HexDump工具將這個檔案Dump出來看,你會發現有許多以「0xFF、0xD8」和「0xFF、0xD9」的bytes資訊,這兩對的位元組就代表jpeg影像格式的開頭、結尾。

OK, 同樣的道理,開啟一個MP3音樂檔也是類似的作法,且甚至有些軟體還提供編輯相關歌詞直接附加在MP3的檔案格式之中,並一邊播放音樂還可以一邊對應到歌詞。

那何謂檔案系統?

基本上每個作業系統都有屬於自己的檔案系統,那它是要做什麼用的?我想大家多半應該都有電腦重灌的經驗,就算沒有也應該有聽過「重灌」兩字吧! 那在安裝作業系統時一定會詢問你要用什麼檔案系統來格式化你的磁碟,在Windows平台下常用的從以前的FAT、FAT32到NTFS。

那為何要格式化?由於磁碟上的基本儲存單位是磁區(sector),而一個磁區的單位是512 bytes,重點就在這邊,由於一張影像檔或是一個音樂檔,都動輒幾mb,換句話說,如果我們用基本的儲存單位512 bytes來儲存這些檔案當然也是可行的,但,這樣卻犧牲了效能,為何?這牽扯到磁碟上seek time的問題,假設先不考慮相關的細節問題,你只要了解磁碟上的磁頭要移到你所想要讀/寫的磁區位置,而這個過程所需要的時間就稱它為seek time,依目前市面上的磁碟(7200rpm)而言,大部份平均都約8ms ~ 10ms上下不等。

從這個數據再來看Google的搜尋速度,通常第一次對Google查詢的時間會比較慢一些,不過我們是感覺不出來的,因為那個時間通常只有100ms~300ms之間,而對同樣的關鍵字再進行一次查詢,你就會發覺第二次的查詢會比第一次的查詢來得快許多,而且通常都小於 100ms,由於筆者不曉得Google確切的作法,但「應該」是典型的利用空間換取時間的方式,也就是拿記憶體來快取(也許第一次就有相關的處理機制,純粹筆者猜測)。再回到我們的主題中,剛剛提到了為何要格式化?簡單來說,格式化的目的在於讓作業系統能有效地快速讀寫檔案,因為檔案系統會有預設的block size,也就是一個個連續的磁區所組成的blocks,在Linux的ext3檔案系統下,block size可以是1k、2k或4k,而在Windows下的NTFS檔案系統則是4k,所以作業系統可以針對這一個個的block來處理檔案,試問一次讀/ 寫4k、512bytes,那一種方式會來的有效率呢?重點也就在於此,倘若我們採用Windows的平台並格式化成NTFS的檔案系統,那代表著一件事,在這個檔案系統下的任何檔案所耗費的磁碟空間基本上也就是4k,就算你只是用「Notepad」儲存700個英文字母(其實才700 bytes),它仍然會佔用你磁碟4k的空間,這也就是內部分裂(Internal Fragmentation)的問題,那照這樣說Google File System(GFS)預設的block size是「64MB」,不就很浪費空間?的確沒錯,如果沒有相關的機制來處理的話,這樣的作法的確很浪費空間(注意:GFS是Distributed File System的一種,不同於本文所敘述的File System),所以Google採用「Lazy Space Allocation」的作法來處理這樣的問題,那什麼又是「Lazy Space Allocation」?請先關注第一個單字「Lazy」,中文可以翻譯成「懶惰」(想快速閱讀外文嗎?可參考TransNote),這裡的「懶惰」又代表什麼含意?「懶惰」在生活上我們可以為它解釋成「不會主動」的意思,也就是一切都是「懶懶散散」的,或是要人家叫才會「被動」的去做事,筆者舉一個物件導向中Design Patterns的相關例子,如果您對Design Pattern不陌生的話,那一定知道「Singleton Pattern」,筆者在此不詳述何謂「Singleton Pattern」,你只要想像在一個Class之中,我要限制它僅能產生單一個實體(instance)即可,而最簡單的寫法就是直接在Class中寫下

public class Singleton
{
    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance()
    {
        return instance;
    }
}

之類的作法,但這樣的方式會造成只要這個Class被載入到JVM之後就會馬上產生這個實體,但... 也許,這裡說的是也許,我們都不會用到這個Class,所以我們可以採取「Lazy Initialization」的方式來處理,就可以避免浪費一塊在Heap中的記憶體,唯有等到想使用它時再呼叫「getInstance()」的方法即可,當然這還有同步的問題,不過這就超過這篇文章的範圍了,所以對於「Lazy」這個單字的含意,這裡我們可以給它解釋成「有需要的話我才去做」。

再回到剛剛的主題,Google採用「Lazy Space Allocation」的方式來避免「Internal Fragmentation」的問題發生,也就是說雖然預設「64MB」的block size,但是如果我們將一份10MB、20MB的檔案個別寫入這樣的檔案系統之中,那倒底會耗費多少的磁碟大小?128MB嗎?(勤奮的作法)當然不是~ 而是兩份文件的加總「30MB」如此而已(懶惰的作法)。

2008-10-22 02:22:38 | Comments (11)

Katta - distribute lucene indexes in a grid

在資訊檢索的領域中~ 「Lucene」算是表現最為突出的一個全文檢索函式庫,想當然~ 本站的搜尋功能就是用「Lucene」來建構的~

不過~ 雖然Lucene相當好用~ 但... 如果「index」太大呢?或者「index」比一整顆硬碟還大呢?是否需要負載平衡來分散處理?...

Katta」就是要改善這樣的問題~ 所以它系建構在「Hadoop」和「Zookeeper」之上~ 採用「Apache Version 2 License」,並在今年的9月17日釋出了「katta-0.1.0」版~

上圖就是我在Cygwin的環境下照著「katta : Getting started」所跑出來的測試結果~ 總之又是一個值得關注的Project~ 期待它能隨著Zookeeper的腳步加入Apache的計畫之下~

katta是什麼呢?

環尾狐猴

相關資源

How Katta works.

Install and configure Katta

find23.net: katta-overview(pdf)

find23.net: katta, pig and hadoop in production - experience report slides

2008-09-29 19:11:27 | Comments (2)

Windows平臺上玩Hadoop - Local Mode

由於學校下學期有門NLP課程要全程使用「Hadoop」來授課,為了開發方便~ 所以這裡介紹如何在Windows平臺上來玩Hadoop~

作業環境

.Windows XP Home Edition

Hadoop 0.17.1

JDK 6 Update 7

環境設置

.設定「JAVA_HOME」環境變數

.安裝Cygwin -- 可參考「如何安裝Cygwin

.設定「Cygwin/bin」至「PATH」環境變數

.將「hadoop-0.17.1.tar.gz」搬移至「C:\cygwin\home\家目錄」。

Hadoop設定

開始啟動「Cygwin」之後,先切換到「家目錄」解壓縮「hadoop-0.17.1.tar.gz」。

tar zxvf hadoop-0.17.1.tar.gz

執行Hadoop範例

這裡我們用一個簡單的「WordCount」來測試~

mkdir input
cd input
echo "hello world bye hello" > file1.txt
echo "hadoop hello goodbye hadoop" > file2.txt
cd..

然後執行下述指令:

bin/hadoop jar hadoop-0.17.1-examples.jar wordcount input output

看看結果吧~

cat output/*
bye     1
goodbye 1
hadoop  2
hello   3
world   1

相關資源

Hadoop/Windowsでの実行

Hadoop Quickstart

H_Yamaguchi日記

Running Hadoop on Windows

Running Hadoop On OS X 10.5 64-bit (Single-Node Cluster)

How to install OpenSSH sshd server and sftp server on a Windows 2000 or Windows XP or Windows Vista

Setting up a Single-Node Hadoop "Cluster" on Windows XP

2008-07-16 18:25:53 | Comments (13)

建構屬於自己的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)

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

::: 搜尋 :::

::: 分類 :::

::: Ads :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment