網頁

2011年12月29日 星期四

Eucalyptus , Ubuntu 11.04 EMI and Crawlzilla (1)

UPDATE:因為 Eucalyptus 增加 EMI 容量的方式[u1]會出錯,instance 起不來,因此必須改用另一種方式


因為雲端與資訊檢索課程都要求期末專題,因此選了可涵蓋兩門課程的交集計畫:建立雲端叢集上的搜尋引擎。以下是一些過程與其中遇到的問題。

此期末專題採用的組件如下

  • Eucalyptus:提供 AWS EC2S3 EBS 等服務相同的自建雲端平台。雖然 Ubuntu 在 11.10 時主力轉向另外一套 OpenStack ,但經過漫長艱辛的嘗試,覺得目前後者在快速佈署、運作與改設定的穩定上不如以往 Ubuntu 在 11.04 以前 Installer CD 同綑 Eucalyptus 的作法[1]
  • Crawlzilla國網中心開發,將索引庫、搜尋引擎、爬蟲、分佈式運算的 Nutch Hadoop 包在一起。雖然  Nutch 已經具備使用 Hadoop 的能力,但使用 Crawlzilla 可進一步簡化設定、佈署節點,以及管理搜尋服務的步驟。
  • Ubuntu 11.04 EMI:前述 Crawlzilla 將安裝在雲端的 instances 上。 由於自製 EMI 可能有很多問題,為謹慎起見,直接下載 Ubuntu 提供可發布的 Cloud Image ,並做了一些必要的修改。至於使用11.04 是因為 12.04 與 11.10 都無法使服務正常運作,稍後會詳細提及。
  • Sun Java 6 JDK:Crawlzilla 只能接受 Sun Java 6 JDK 。在有限時間的情況下,我無法完整修改與測試 Crawlzilla 是否能與 Open JDK 接軌。所以每台節點都必須安裝 Sun Java 6 JDK
  • 對各 instance 而言,可用記憶體非常重要。因為 Hadoop MapReduce 會佔據很多記憶體,因此最好主控 instance 有 1GB 以上的記憶體額度。測試中,在只有 512MB 的情況下,連搜尋都會出現 'OutOfMemory' 例外。

建置步驟

  • 主控的 instance 所在 Security Group 除 SSH 外,必須要有 8080、50070、50060、50030 等 port 開放,以便查詢 Hadoop 與 Crawlzilla 網頁資訊
  • 因為Ubuntu Cloud 官方提供的 EMI  預設根目錄空間不足,所以必須手動增加可用空間
  • 使用命令列方式或 Hybridfox 啟動該 EMI 的 instance 並連入。假設這第一台作主控 Controller ,並具有 Public IP 
    • 若是該 Cloud 預設發的不是真的 Public IP ,而是例如 192.168.0.0/12 這種內網 IP 的位置,則要使用 Eucalyptus 類似 AWS Elastic IP 的方式去提供。
  • 安裝 Sun Java 6 JDK 。為了預防使用 Script 造成額外設定與問題,我在此階段每個 instances 都使用手動安裝。注意雖然該篇指引是針對 Java 7 ,但原理相同
  • 下載 Crawlzilla 安裝包,解開並按照官方指引安裝
    • instance 的 '/etc/hosts' 會沒有該 instance hostname ,需先手動將 'localhost' 改成該 instance 連入時顯示的 hostname [3]
    • 預先修改節點安裝所需設定:因為 Crawlzilla 中佈署節點的 Scripts 預設使用密碼連回 Controller ,與 EMI 中預設使用私鑰連線不同,為了避免大量修改 Scripts 可能造成的問題,因此將 Controller 節點中,SSH 預設不使用密碼連線的設定改回
  • Controller 主控安裝完成,可以連線至該 instance 公開 IP  位置的 8080 port 網頁介面,也可以先至其 'Crawl' 頁籤中嘗試抓取一個簡單網頁,並深度設成 '1' 測試看看
    • 根據多次嘗試,若完全不改動設定,Ubuntu 12.04 與 11.10 在這個簡單測試動作就會因 DFS 而出錯。這也就是為何後來要改用 11.04 的原因。
    • 「簡單網頁」指內容不要太多,但最好能有中英文的網頁。如果沒問題,大致上 5 分鐘左右就可以建好索引提供搜尋 [4]
  • Controller 安裝好後,會因為不明原因,原本應該提供子節點安裝腳本的預設目錄 '/home/crawler/crawlzilla/source/slave_deploy.sh' 中沒有該檔案,因此手動複製移至該路徑中
    • 不過我是在 instance 上用 'ubuntu' 帳號安裝,可能因此路徑與 Crawlzilla 預想不同。
  • 設定一台子節點:之後其他子節點都可以依樣畫葫蘆
    • 如前所述進行準備工作到安裝完 JDK ,就可下命令去將該節點安裝腳本抓回此節點上:'scp crawler@[ 主控 IP ]:/home/crawler/crawlzilla/source/client_deploy.sh '
    • 執行該腳本進行安裝。過程中會問是否打開 Hadoop ,可以一併開啟
  • 安裝好子節點,可以在 Controller 中下命令確認:'crawlzilla'
    • 進入此管理介面可以使用第一個選項確認節點確實有連上
到此為止「理論上」雲端叢集環境下的分佈式搜尋引擎已經設定好了。但實際上接下來才是各種問題的開始。接著會把試圖解決這些問題的過程等紀錄下來,提供參考。


[1] 是的,我知道 Ubuntu 新提供 Orchestra + Juju 的作法。但連官方提供的教學都不能正常運作時,我對其目前 Ubuntu 力推這兩套新服務的熱情尚難認同。
[2]新版本已更名成 'cloud-publish-tarball'
[3]例如將 '/etc/hosts' 中的 "127.0.0.1 localhost" 改成 "127.0.0.1 ip-172-168-1-2"
[4]經過多次測試,發現不管目標複雜或簡單,這似乎是基本的「Hadoop 啟動時間」。我想分佈式運算是求大規模運算的時間可以降低,而非啟動的迅速。感覺有點像流言終結者中,跑車剛開始啟動的速度會輸給玩具車一樣