pigfoot’s weblog

We should forget about small efficiencies — Donald Knuth

Archive for the ‘Web’ Category

子曰:「性相近也,習相遠也。」Hadoop 和 Google 的 MapReduce 的實作就有這種感覺。

前一篇有提到,MapReduce 是 Google 所提出來的一個 software framework,只要把握它的原則,實作它並不會很困難。我們來看看 Google 和 Hadoop 三大碁石的對應表:

Google Hadoop
GFS (和 RedHatGFS 是不一樣的) HDFS
MapReduce MapReduce
BigTable HBase
Figure1: Google and Hadoop mapping table

雖然目前會先以 open-source 的 Hadoop MapReduce 為主,但是我們可以看的到這兩個都是用 Distributed file system 來作資料的交換,也有自己的 MapReduce 的方法,所以概念上相去不遠。

在開始講之前,有件事應該要先提一下,因為 Hadoop 是以 Java 開發的,所以不熟的人可能會很排斥,老實說我也如此。但是 Hadoop 有提供一些方法讓開發者可以用其它的語言來寫 MapReduce。

我想 Java 的使用者不管是 Hadoop 的說明文件,還是範例程式應該都不是甚麼問題,因此我主要會以 C 以及 Python 為主,然後盡量也會帶點 RubyPerl

我們先來看看 Hadoop MapReduce 的 work flow:
hadoop-1

Figure2: Hadoop MapReduce work flow

這張 work flow 我們往後也會一直看到。如同前一篇提到的,MapReduce 有四個很重要的步驟。我們來看看 Hadoop 在這四個階段作了甚麼事情。

1) Input
將要處理的資料上傳到分散式檔案系統中。預設的格式是文字檔 (我們也不會用其它的檔案格式),而分散式檔案系統以 HDFS 當範例。

完成上傳到分散式檔案系統之後,所有的資料都可以被每一個 node 去存取。而每一個檔案,會以行當單位,自動被分割成固定大小的 Block,分散在各個 node 之中,然而這件事對我們而言是 transparent 的。(不過這裡特別提的原因是這有可能會影響到 Map 的數目,所以有個印象即可。)

以 Block 大小是 64MB 當例子,假設原始檔案是 200MB,那第一個 Block 是從頭算起的第 64 MB,再往後找到第一個換行 (\n) 為止。這樣作是為了方便 Map 不用處理這種 boundary case。同樣的,第二個 Block 就是該換行的下一個 byte,取 64MB 再找換行,如此不斷的反覆直到檔案結尾。換句話說,最後一個 Block 的大小會隨機變動,也和下一個檔案無關。

2) Map
雖然 Map 的數目是可以設定的,但是預設每個 Block 理論上都會被一個 Map 處理。那 Map 的邏輯就是讀 stdin,以行為單位處理之後,印成 key-value pair 到 stdout。就像是 unix 上的 pipeline一樣。key 跟 value 預設是以 tab (\t) 當分割。(精確的說,是以第一個 tab 當中介,往前是 key,往後是 value,這也是可以設定的。)

因為 Map 的程式是我們可以動手的,所以我們可以記得 Map 就是把一行的文字,轉換成一個 key-value pair 的邏輯。

3) Shuffle/Sort
為甚麼是 key-value pair 呢? 那是因為相同的 key 會送到同一個 reduce,而每個 reduce 會產生自己獨立的 output file。如果 map 的結果是隨機送往 reduce,那這個的 work flow 便會有其限制了。這就是第三個階段 Shuffle/Sort 的工作。

舉個例子,假設我們是要將 input file 的每個單字出現的次數。其中一行是 “one for all; all for one”,我們的 map 程式就是把每一個單字,都作成一個 key-value pair 往後送。Key 當然是單字本身,那 value 就是 1,代表 count 是 1。因此,上例會產生六個 key-value pair: (one,1), (for,1), (all,1), (all,1), (for,1), (one,1)。如果是隨機送往 reduce,那有可能 reduce1 收到前三個,reduce2 收到後三個,加上彼此的 reduce 不會互相參照,所以這結果並不是我們要的。(因為 for 這個字有些在 reduce1 的 output file,有些在 reduce2 的 output file,那還要特別寫程式作加總才是我們要的結果。當然如果 reduce 只有一個就沒有這樣的問題。)

那相同的 key 會送到同一個 reduce 的 case 會發生甚麼事? 我們可以保證同一個單字不會送到不同的 reduce,所以某個 reduce 的 output file 的任一單字的數目,一定代表原始所有檔案中,該單字的出現的次數。

那 sort 在做甚麼? 在上例我們看不出來關聯性,但是如果我們要的不單是單字出現的次數,還要排序,那就會有差別了。

一樣用 “one for all; all for one” 當例子。如果碰巧二個 reduce 收到的是:

1) Reduce1: (one, 1), (for, 1), (for, 1), (one, 1)
2) Reduce2: (all, 1), (all, 1)

PS: 斜體代表是 all for one。

那每個 reduce 程式還要先讀完全部的 stdin 才能加以 sort,這樣就沒有效率了。反過來說,如果先把資料 sort 好再給 reduce 程式,reduce 就可以 streaming 的方式運作,寫法也比較簡單。

4) Reduce
Reduce 的邏輯和 Map 相似。它是把 key-value pair,轉換成我們要的結果。也是拿上面的例子,經過 Shuffle/Sort 之後,Reduce 會收到:

1) Reduce1: (one, 1), (one, 1), (for, 1), (for, 1)
2) Reduce2: (all, 1), (all, 1)

PS: 斜體代表是 all for one。注意,第二個 one 跑到 for 之前了。

所以我們 reduce 的作的事情是: “在遇到下一個單字前,累加 value,如果遇到新的單字,就印出這個單字和總量到 stdout。” 所以我們的結果是

1) Output1: (one, 2) 和 (for, 2) 共兩行
2) Output2: (all, 2) 一行

這就是我們的結果。

這篇文章雖然長,但是瞭解之後可以大概的知道 Hadoop 整個 work flow。下一篇我們就要動手試我們的程式了。

Popularity: 6% [?]

  • 1 Comment
  • Filed under: Develop, IT, Web
  • 孫子兵法.謀攻篇:「凡用兵之法:十則圍之,五則攻之,倍則分之。」

    這句話的意思是,當我們的兵力大過敵人兵力十倍,就用包圍攻擊來殲滅對方。反過來說,當對方的兵力大過我們,就想辦法分開他們而各自擊破。雖然我的翻譯不是很好,但是老祖宗的智慧,就是 computer science 中,一個非常著名的演算法 divide and conquer

    我們會用到雲端運算,要處理的資料一定是非比尋常的大,大多數的這類的分散式演算法本質上都和 divide and conquer 接近。我們這邊要介紹的 framework,就是 Google 所提的 MapReduce

    以下的圖,就是一個簡化過的 MapReduce 的 work flow。一般來說,它分成四個階段:

    hadoop-2

    1) Input

    雖然原始的資料量太大,但是我們有很多個 node 可以來運算。所以將原始的資料切成若干等份的 block,並往下一個階段送。

    2) Map

    對傳過來的 block 中的每一個元素,進行 Map function 的運算成為中繼資料。然後將中繼資料往下一個階段送。

    3) Reduce

    對傳過來的中繼資料,以及前一個 reduce 的結果,進行 Reduce function 的運算。然後將運算結果往下一個階段送。Reduce 和 Map 不同,它有兩個 input。

    4) Output

    將運算結果寫進檔案系統,完成運算。

    這個 design pattern 就是這麼簡單,不知不覺得用上 MapReduce。當然,Map 和 Reduce 的數目,與可以運算的 Node,都是影響效能的關鍵,這個我們容後再講。目前我們所要知道的,就是如何把問題轉化成 MapReduce 的解法,一旦可以套用,那問題幾乎是解了一半了,剩下的就是動手 coding 而己。

    我再舉另一些例子。如何從某個電子書中找到最常用到的單字? 這個問題是不是有點像在用 google search 時,出現的關鍵字自動補齊功能 (search autocomplete) 呢? 只是問題簡化過而己。我們來看看這個問題怎麼用 MapReduce。

    1) Input

    電子書以章為單位,分別送給每一個 Map。

    2) Map

    Map 找出該章裡所有的單字,接著送給 Reduce。

    3) Reduce

    Reduce 對上一個 Reduce 排序好的結果,加上對應的 Map 送過來的單字,兩者再排序之後送給下一個 Reduce。

    4) Output

    最後一個 Reduce 處理完之後,就是最終的單字排序名單。

    大家可以多想一些例子來練習這樣的 work flow。

    雖然概念上是這樣,但是實際上的作法大家都略有差異。下一篇就是針對 Hadoop 的 MapReduce 來作說明。

    Popularity: 9% [?]

  • 1 Comment
  • Filed under: Develop, IT, Web
  • Hadoop

    子曰:「工欲善其事,必先利其器。」

    當然,比賽最好先熟一下工具會比較有信心。我第一個要先介紹的 framework 就是 Hadoop (Wikipedia: Hadoop)。

    因為 Hadoop 算是一個非常知名的雲端運算平台,加上 Wikipedia 寫的也非常的仔細,所以我這邊就不贅述了。但是因為它的設定不太容易而且費時,加上這部份對於簡單的程式來說,並沒有太大的影響。所以我推薦在開發階段,可以先用 Hadoop Virtual Image 就可以了。

    Hadoop Virtual Image 是一個 Ubuntu Linux 7.04 的 OS, 然後內建了 Java machine (Sun JRE 6 u2) 以及 Hadoop 0.13.0 的一個 virtual machine image。我們可以用免費的 VMware Player 來執行它。

    雖然它沒有 GUI,但是最令人感到興奮的是,它預設已經把 Hadoop 的環境設定好成 pseudo-distributed mode (也就是在同一台電腦上用不同的 port 當作不同的機器,然後在利用 ssh 去跟這些假機器作溝通)。雖然預設只有一個機器,不過目前應該無傷大雅。

    以下就是用 VMware Player 執行這個 virtual machine image 的樣子。

    hadoop-vmware_01

    然後用 guest 登入:

    hadoop-vmware_02

    因為這個 guest OS 已經裝了 Hadoop, 所以我們可以執行它裡面的範例程式來簡單的跑一下。指令如下:

    $ hadoop jar hadoop-examples.jar pi 4 10000

    這個範例就是在 Hadoop 的平台上, 用蒙地卡羅法 (Monte Carlo Method) 來分散計算 Pi 的值。換句話說,這就是最簡單的雲端運算 (因為只有一個機器)。

    下面是跑完的結果:

    hadoop-vmware_03

    有看到上面的正常結果,代表我們的環境是正常的,可以開始作一些程式開發了。為了更了解雲端運算,它的 working flow 是一定要先知道。下一篇就是要來講 Google 所提出來的 MapReduce framework。

    Popularity: 9% [?]

  • 0 Comments
  • Filed under: Develop, IT, Web
  • Trend Micro Program Contest 2009

    Sorry. This post is chinese only.

    本篇開放全文轉貼轉寄,不受創用 CC license 保護。

    敝公司趨勢科技最近舉辦了騰雲駕霧程式競賽,因為我參加過 2000 年第一屆程式競賽,有入選決賽 (參賽經驗分享),雖然現在己經過了九年,我依然覺得這個比賽的經驗對我來說是非常珍貴的,所以跑去當工作人員。一問之下才知道,原來很多人不敢報名,是因為對啥雲端運算完全不熟,怕去當炮灰,我覺得實在非常可惜啊!

    各位正在學校唸書的學弟妹,不要真的覺得畢業以後去投甚麼 yes123 求職網,薪水可以加一倍。前提是你必須要在這個不景氣的就業市場被老闆欽點才有可能啊! 怎麼樣才能夠脫穎而出,為自己的履歷加上畫龍點睛的決定性關鍵,程式比賽就是一個很好的機會。我想光是在趨勢科技的程式競賽中進入決賽,不論是哪家企業,一定都會有正面的加分作用,更何況前面的名次還會有趨勢科技預聘書。

    那大家可能覺得說,這是比啥鬼雲端運算,我甚麼都不知道可以參加嗎? 各位,如果我還有在校生資格的話一定會報名。為甚麼? 因為:

    1) 大家都是齊頭式的平等
    對! 這是大部份學校老師不會教的事。那還有甚麼好怕的? 大家都不熟的狀況下,反而是評審比較難出題目不是嗎? 那是不是有可以吸引評審的創意,贏面就非常高了呢?

    2) 正式競賽之前,會提供相關的教學課程內容
    也就是說初賽之前,會有教學課程讓大家先熟悉。為了怕遠距離的教學效果不好,現在只要報名就可以來我們公司上課。目前確定的有: cloud computing overview,開發工具加 sample 練習,初賽環境與初賽進行方向等等課程。

    各位看倌您看看,報名費: 0, 學費: 0, 能夠學到 cloud computing,真的是 *無價* 啊! 光是這項就值回票價了 (其實還是免費票)。如果畢業以後想去會用到_這些專長的公司_,這不是天下掉下來的禮物嗎?

    我憑著良心說實話,這些代價其實都是轉嫁到趨勢科技身上要自行吸收的。不光是在這個不景氣的時代還提供獎金,R&D 部門也要花額外的時間準備,又沒有綁約說入決賽的隊伍,在畢業後一定要來趨勢科技,幾乎沒有好處。但是老闆娘真的是佛心來的,聽到我們這些曾經加比賽的人,都非常同意當年這個比賽對我們的人生,有著很重要的教育意義,她就排除萬難決定再次舉辦。

    是的,真的因為教育是無價的! 所以才會好康大放送啊! 大家要把握這個大好的機會快快報名! 最後報名時間就是在 6/2 號! 報名網址在這 http://www.trend.org/fd/tabid/66/Default.aspx/,或是點最上面的 banner 也可以。

    孔子說:「不教而戰,是謂棄之。」所以我接下來會寫一些教學的文章當做先修課。有興趣的也可以到這次的雲端BLOG,也有其它同事的教學文章。

    Popularity: 9% [?]

  • 0 Comments
  • Filed under: IT, Office, Talk, Web
  • The Wii Remote API of Opera

    The Wii Remote API also allows the Web page to detect all Wii Remotes that are connected to the Wii.

    This makes it possible to make Web pages interact with up to four users at the same time, a concept not normally possible with traditional JavaScript event detection.

    The API is available to JavaScript running on the Web page.

    如果之前有買 Wii 的人, 可能知道在 2007 年 6 月 30 日之前, 可以無料下載 瀏覽器 Opera.

    現在 Opera 提供了一組 Wii Remote API, 讓網頁開發者可以更方便的利用 Wii remote 來設計以及開發程式. (應該遊戲比較多吧? :p)

    當然, Opera 也作了個範例小遊戲, Demo game 在這. 這個是從那個遊戲中節錄的 Code Snippets:

    if ( window.opera && opera.wiiremote ) {
        //get the rotation of the Wii Remotes
        wiiremote1 = opera.wiiremote.update(players[0]);
        wiiremote2 = opera.wiiremote.update(players[1]);
    }

    利用 opera.wiiremote 這個 Opera 自己提供的 java script library 就可以使用囉! 有興趣的可以再看看 Ajaxian 這篇 The Wii Remote API: Now your userbase is four, 有比較簡單的說明.

    Popularity: 17% [?]

  • 0 Comments
  • Filed under: IT, Web, What's New
  • When BonEcho meets Yahoo!Kimo..

    BonEcho, 其實就是非官方版的 Mozilla Firefox 2.0 的 codename, 也是 nightly build 的預設的 branding name.

    我原本作非官方的 build, 都不會下這個參數 –enable-official-branding, 這也和大部份的 un-official builder (e.g. tete009) 一樣. 不過我發現一件很奇妙的事, 那就是用這樣 build 出來的 Firefox, 連 Yahoo!奇摩 會很奇怪:

    BonEcho_Meets_Yahoo!Kimo

    經過交叉測試後, 結果是 User-Agent 搞的鬼. BonEcho 送出來的 User-Agent 是:

    Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070327 BonEcho/2.0.0.3 (pigfoot)

    我用 User Agent Switcher 換成如下:

    Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070327 Firefox/2.0.0.3 (pigfoot)

    一切就正常了. 我在 2.0.0.4 作的 builds 會修掉這個 issue.

    目前只能猜測是Yahoo!奇摩的 CGI 有作一些檢查吧? 有誰也會這樣的嗎? 還是只有我這樣? XD

    Popularity: 18% [?]

  • 3 Comments
  • Filed under: IT, Web, Yahoo
  • Adobe to take Photoshop online

    Adobe Photoshop

    Adobe to take Photoshop online, from News.com.

    Hoping to get a jump on Google and other competitors, Adobe Systems plans to release a hosted version of its popular Photoshop image-editing application within six months, the company’s chief executive said Feb. 28.

    Popularity: 21% [?]

  • 0 Comments
  • Filed under: IT, Web