讀古今文學網 > 機器學習實戰 > 15.3 在Amazon網絡服務上運行Hadoop程序 >

15.3 在Amazon網絡服務上運行Hadoop程序

如果要在100台機器上同時運行MapReduce作業,那麼就需要找到100台機器,可以採取購買的方式,或者從其他地方租用。Amazon公司通過Amazon網絡服務(Amazon Web Services,AWS,http://aws.amazon.com/),將它的大規模計算基礎設施租借給開發者。

AWS提供網站、流媒體、移動應用等類似的服務,其中存儲、帶寬和計算能力按價收費,用戶可以僅為使用的部分按時繳費,無需長期的合同。這種僅為所需買單的形式,使得AWS很有誘惑力。例如,當你臨時需要使用1000台機器時,可以在AWS上申請並做幾天實驗。幾天後當你發現當前的方案不可行,就即時關掉它,不需要再為這1000台機器支出任何費用。本節首先介紹幾個目前在AWS上可用的服務,然後介紹AWS上運行環境的搭建方法,最後給出了一個在AWS上運行Hadoop流作業的例子。

15.3.1 AWS上的可用服務

AWS上提供了大量可用的服務。在行內人士看來,這些服務的名字很容易理解,而在新手看來則比較神秘。目前AWS還在不停地演變,也在不斷地添加一些新的服務。下面給出一些基本的穩定的服務。

  • S3 —— 簡單存儲服務,用於在網絡上存儲數據,需要與其他AWS產品配合使用。用戶可以租借一組存儲設備,並按照數據量大小及存儲時間來付費。
  • EC2 —— 彈性計算雲(Elastic Compute Cloud),是使用服務器鏡像的一項服務。它是很多AWS系統的核心,通過配置該服務器可以運行大多數的操作系統。它使得服務器可以以鏡像的方式在幾分鐘內啟動,用戶可以創建、存儲和共享這些鏡像。EC2中「彈性」的由來是該服務能夠迅速便捷地根據需求增加服務的數量。
  • Elastic MapReduce(EMR) —— 彈性MapReduce,它是AWS的MapReduce實現,搭建於稍舊版本的Hadoop之上(Amazon希望保持一個穩定的版本,因此做了些修改,沒有使用最新的Hadoop)。它提供了一個很好的GUI,並簡化了Hadoop任務的啟動方式。用戶不需要因為集群瑣碎的配置(如Hadoop系統的文件導入或Hadoop機器的參數修改)而多花心思。在EMR上,用戶可以運行Java作業或Hadoop流作業,本書將對後者進行介紹。

另外,很多其他服務也是可用的,本書將著重介紹EMR。下面還需要用到S3服務,因為EMR需要從S3上讀取文件並啟動安裝Hadoop的EC2服務器鏡像。

15.3.2 開啟Amazon網絡服務之旅

使用AWS之前,首先需要創建AWS賬號。開通AWS賬號還需要一張信用卡,後面章節中的練習將花費大約1美元的費用。打開http://aws.amazon.com/可以看到如圖15-2所示的界面,在右上部有「現在註冊」(Sign Up Now)按鈕。點擊後按照指令進行,經過三個頁面就可以完成AWS的註冊。 注意,你需要註冊S3、EC2和EMR三項服務。

圖15-2 http://aws.amazon.com/頁面右上部給出了註冊AWS賬號的按鈕

建立了AWS賬號後,登錄進AWS控制台並點擊EC2、Elastic MapReduce和S3選項卡,確認你是否已經註冊了這些服務。如果你沒有註冊某項服務,會看到如圖15-3所示的提示。

圖15-3 服務未註冊時的AWS控制台提示信息。如果你的瀏覽器在S3、EC2和Elastic MapReduce服務頁面也有相應提示,請註冊這些服務

這樣就做好了在Amazon集群上運行Hadoop作業的準備,下一節將介紹在EMR上運行Hadoop的具體流程。

15.3.3 在EMR上運行Hadoop作業

註冊了所需的Amazon服務之後,登錄AWS控制台並點擊S3選項卡。這裡需要將文件上傳,以便AWS能找到我們提供的文件。

  1. 首先需要創建一個新的bucket(可以將bucket看做是一個驅動器)。例如,創建了一個叫做rustbucket的bucket。注意,bucket的名字是唯一的,所有用戶均可使用。你應當為自己的bucket創建獨特的名字。
  2. 然後創建兩個文件夾:mrMeanCode和mrMeanInput。將之前用Python編寫的MapReduce代碼上傳到mrMeanCode,另一個目錄mrMeanInput用於存放Hadoop作業的輸入。
  3. 在已創建的bucket中(如rustbucket)上傳文件inputFile.txt到mrMeanInput目錄。
  4. 將文件mrMeanMapper.py和mrMeanReducer.py上傳到mrMeanCode目錄。這樣就完成了全部所需文件的上傳,也做好了在多台機器上啟動第一個Hadoop作業的準備。
  5. 點擊Elastic MapReduce選項卡,點擊「創建新作業流」(Create New Job Flow)按鈕,並將作業流命名為mrMean007。屏幕上可以看到如圖15-4所示的頁面,在下方還有兩個復選框和一個下拉框,選擇「運行自己的應用程序」(Run Your Own Application)按鈕並點擊「繼續」(Continue)進入到下一步。

    圖15-4 EMR的新作業流創建頁面

  6. 在這一步需要設定Hadoop的輸入參數。如果這些參數設置錯誤,作業將會執行失敗。在「指定參數」(Specify Parameters)頁面的對應字段上輸入下面的內容:

    Input Location*:<your bucket name>/mrMeanInput/inputFile.txt Output Location*:<your bucket name>/mrMean007Log Mapper*:\"python s3n:// <your bucket name>/mrMeanCode/mrMeanMapper.py\" Reducer*:\"python s3n:// <your bucket name>/mrMeanCode/mrMeanReducer.py\"

    可以將「其他參數」(Extra Args)字段留空。該字段的作用是指定一些其他參數,如reducer的數量。本頁面將如圖15-5所示,點擊「繼續」(Continue)。

    圖15-5 EMR的指定參數頁面

  7. 下一個頁面需要設定EC2的服務器鏡像,這裡將設定用於存儲數據的服務器數量,默認值是2,可以改成1。你也可以按需要改變EC2服務器鏡像的類型,可以申請一個大內存高運算能力的機器(當然也花費更多)。實際上,大的作業經常在大的服務器鏡像上運行,詳見http://aws.amazon.com/ec2/#instance。本節的簡單例子可以選用很小的機器。本頁面如圖15-6所示,點擊「繼續」(Continue)。

    圖15-6 設定EMR的EC2服務器鏡像的頁面,在該頁面上可以設定MapReduce作業所需的服務器類型和服務器數量

  8. 下一個是「高級選項」(Advanced Options)頁面,可以設定有關調試的一些選項。務必打開日誌選項,在「亞馬遜S3日誌路徑」(Amazon S3 Log Path)裡添加s3n://<your bucket name>/mrMean007DebugLog。只有註冊SimpleDB才能開啟Hadoop調試服務,它是Amazon的訪問非關係數據庫的簡單工具。雖然開啟了該服務,但我們不準備使用它來調試Hadoop流作業。當一個Hadoop作業失敗,會有一些失敗信息寫入上述目錄,回頭讀一下這些信息就可以分析在哪裡出了問題。整個頁面如圖15-7所示,點擊「繼續」(Continue)。

    圖15-7 EMR的高級選項頁面,可以設定調試文件的存放位置,也可以設定繼續自動運行機制。作業失敗還可以設定登錄服務器所需的登錄密鑰。如果想檢查代碼的運行環境,登錄服務器再查看是個很好的辦法

  9. 關鍵的設置已經完成,可以在接下來的引導頁面使用默認的設定,一直點「下一步」(Next)到查看(Review)頁面。檢查一下所有的配置是否正確,然後點擊底部的「創建作業流」(Create Job Flow)按鈕。這樣新任務就創建好了,在下一個頁面點擊「關閉」(Close)按鈕將返回EMR控制台。當作業運行的時候,可以在控制台看到其運行狀態。讀者不必擔心運行這樣一個小作業花費了這麼多時間,因為這裡包含了新的服務器鏡像的配置。最終頁面如圖15-8所示(可能你那裡不會有這麼多的失敗作業)。

    圖15-8 EMR控制台顯示出了一些MapReduce作業,本章的MapReduce作業已經在這張圖中啟動

新建的任務將在開始運行幾分鐘之後完成,可以通過點擊控制台頂端的S3選項卡來觀察S3的輸出。選中S3控制台後,點擊之前創建的bucket(本例中是rustbucket)。在這個bucket裡應該可以看到一個mrMean007Log目錄。雙擊打開該目錄,可以看到一個文件part-00000,該文件就是reducer的輸出。雙擊下載該文件到本地機器上,用文本編輯器打開該文件,結果應該是這樣的:

100     0.509570    0.344439 
  

這個結果與單機上用管道得到的測試結果一樣,所以該結果是正確的。如果結果不正確,應當怎樣找到問題所在呢?退回到EMR選項卡,點擊「已經完成的任務」(Completed Job),可以看到「調試」(Debug)按鈕,上面還有一個綠色小昆蟲的動畫。點擊該按鈕將打開調試窗口,可以訪問不同的日誌文件。另外,點擊「控制器」(Controller)超鏈接,可以看到Hadoop命令和Hadoop版本號。

現在我們已經運行了一個Hadoop流作業,下面將介紹如何在Hadoop上執行機器學習算法。MapReduce可以在多台機器上運行很多程序,但這些程序需要做一些修改。

不使用AWS

如果讀者不希望使用信用卡,或者怕洩露自己的信用卡信息,也能在本地機器上運行同樣的作業。下面的步驟假定你已經安裝了Hadoop(http://hadoop.apache.org/common/docs/stable/#Getting+Started)。

  1. 將文件複製到HDFS: hadoop fs -copyFromLocal inputFile.txt mrmean-i
  2. 啟動任務: hadoop jar $HADOOP_HOME/contri b/streaming/hadoop-0.20.2-stream- ing.jar -input mrmean-i -output mrmean-o -mapper \"python mrMeanMap- per.py\" -reducer \"python mrMeanReducer.py\"
  3. 觀察結果: hadoop fs -cat mrmean-o/part-00000
  4. 下載結果: hadoop fs -copyToLocal mrmean-o/part-00000 . 完成