搭建GraphLab集群總結


GraphLab是CMU(卡耐基梅隆大學)開發的一個以vertex為計算單元的大規模圖處理系統,是繼google的Pregel之后的第一個開源的大規模圖處理系統,它解決了傳統mapreduce框架對於機器學習應用的處理中最突出的兩個問題(頻繁迭代計算和大量節點通信)引起的計算效率的問題,與Haloop,Twister等基於mapreduce批量處理不同的是,它采用Pregel的以vertex為計算單元,並將機器學習抽象成GAS(gather,apply,scatter)三個步驟,然后按該抽象模型設計實現算法,事實已經證明該框架對於機器學習這一類跟圖處理關系緊密的應用有很好的效果。

最近這幾天在實驗室集群上搭建了GraphLab分布式計算環境。這篇文章主要總結一下搭建過程和碰到的問題。

1)介紹一下實驗室集群的環境。

集群中總共有9台機器,每台機器有CPU核4個,內存8G。每台機器上都安裝了64位Ubuntu 12.04 Desktop版操作系統。注意,根據GraphLab官方安裝指南We require a 64-bit operating system.),要安裝GraphLab,操作系統必須是64位的。

2)為每台機器安裝GraphLab的依賴庫。在每台機器上運行如下的命令:

sudo apt-get install gcc g++ build-essential libopenmpi-dev openmpi-bin default-jdk cmake zlib1g-dev git

3) 從GitHub上下載GraphLab。選取集群中的一台機器,進入要安裝GraphLab的目錄,使用如下的git命令下載GraphLab。

cd ~                                                # 我將GraphLab安裝在了主目錄下
git clone https://github.com/graphlab-code/graphlab.git

由於GraphLab項目比較大,下載需要花費一定的時間。下載完成之后,會在當前目錄下看到一個名為graphlab的文件夾。

4) 編譯GraphLab。

   進入graphlab文件夾,使用graphlab自帶的configure腳本配置編譯環境:

cd graphlab
./configure

 

配置成功后會在graphlab文件夾內生成release和debug兩個新的目錄。這兩個目錄分別對應不同項目的發行版和測試版,在這兩個目錄中都可以編譯GraphLab的所有Toolkit,分別對應發行版和測試版。編譯后發行版與測試版的不同是,發行版在編譯過程中程序都做了優化,運行速度更快。因此,我的編譯選擇在release目錄中進行。

還有一點需要特別指出,GraphLab不僅提供了分布式大規模圖計算模型,而且基於該模型實現了很多實用的工具集,這些工具集可以分成六類:主題建模、圖分析、聚類、協同過濾、圖模型和計算機視覺。可以根據自己的需要只編譯其中的某一類或幾類。如果全部編譯,第一次編譯時會下載很多的庫文件,耗費很長時間。我只對其中的圖分析工具集比較感興趣,所以只編譯了這一個。同時我也編譯了apps目錄中的相應樣例代碼。

編譯release目錄下的apps子目錄:

cd release/apps
make -j 3

 

第二行中的參數-j 3是利用了make的並行編譯特性,3指的是同時進行三個編譯任務。該數字越大,並行性越高,編譯速度越快,但是占用內存也越多。如果該數字過大,會因內存不夠用而使編譯過程卡住。

編譯release目錄下的toolkits中的graph_analytics:

cd release/toolkits/graph_analytics
make -j 3

 

如果希望編譯整個GraphLab,那么可以在release目錄下運行如下命令:

cd release
make -j 3

 

5) 配置SSH。

GraphLab要求集群中任意兩台機器之間能夠實現SSH無密碼登錄。

首先要確保每台機器上都已經安裝了openssh-server:

sudo apt-get install openssh-server

 

接着在每台機器上生成公鑰和私鑰對,一路回車即可:

ssh-keygen -t rsa

 

最后是配置任意兩台機器間的無密碼ssh登錄。比如A和B兩台機器,若要在A上能夠無密碼ssh登錄到B,可以在A上運行如下命令:

ssh-copy-id  hostname-of-B

 

其中hostname-of-B指的是B的主機名。

如果集群中機器數量很多,任意兩台機器都配置一遍顯然太麻煩了。一種簡單的策略是,先配置其中一台機器到集群中所有機器的(包括ssh到自己的),然后將該台機器中$HOME/.ssh/authorized_keys文件拷貝到集群中所有其他結點上。(!!!!!這種策略經驗證並不可行,還是需要手動配。!!!!!!

6)創建machines文件並分發到集群中的所有機器上。

在集群中的某一台機器上創建一個名稱為machines的文件,該文件中列出了參與計算的所有機器的主機名(或者IP地址),每個主機名占一行。將machines文件拷貝到集群中的所有機器上,注意machines文件的位置在所有機器上都要確保一致,而且必須是用戶的$HOME主目錄。接下來在使用GraphLab提供的腳本分發編譯好的可執行文件到集群中各個機器上時,該腳本默認machines文件位於用戶主目錄下。

scp ~/machines  hostnamex:~/

 

其中hostnamex是集群中其他機器的主機名。

以上步驟完成后,可以在任意一台機器上使用如下命令測試配置是否正確:

mpiexec -hostfile ~/machines hostname

 

如果上面的命令能夠返回你在machines文件里面列出的所有主機名,那么說明配置正確。

7)分發GraphLab二進制可執行文件和相關庫文件到集群中的所有機器上。

GraphLab提供了腳本用於分發編譯好的二進制可執行文件到集群中的所有其他機器上。在你下載並編譯了GraphLab的那台機器上,使用下面的命令來分發二進制可執行文件和相關庫文件:

cd ~/graphlab/release/apps; ~/graphlab/scripts/mpirsync        #分發apps
cd ~/graphlab/release/toolkits;  ~/graphlab/scripts/mpirsync        #分發toolkits

cd ~/graphlab/deps/local; ~/graphlab/scripts/mpirsync              #分發庫文件

 

8)單機模式下,使用模擬圖運行測試PageRank程序。

在每一台機器上,運行如下的命令來測試分發到每台機器上的二進制可執行程序能否正確運行:

cd ~/graphlab/release/toolkits/graph_analytics/
./pagerank --powerlaw=10000

 

如果上述命令在每台機器上都能正確無誤運行,GraphLab的集群安裝配置就算完成了。接下來可以測試分布式模式下能否成功運行。

9)分布式模式下,使用模擬圖運行測試PageRank程序。

在任意一台機器上,運行如下命令:

cd ~
mpiexec -n 2 -hostfile machines graphlab/release/toolkits/graph_analytics/pagerank --powerlaw=100000

 

改變-n參數的值,多試幾次,以確保安裝正確無誤。

如果上述命令能夠正確無誤執行,那么GraphLab分布式集群運算環境搭建就算完成了。

 

碰到的問題(目前該問題已經解決):

我在安裝GraphLab后遇到的問題是:在單機模式下每台機器上PageRank都能夠成功執行,但是換到分布式模式下,運行命令后程序立即卡住,沒有任何錯誤提示信息。

這一問題讓我焦慮了很多天,因為沒有log,沒有任何提示,根本無法定位問題所在。目前該問題仍然無法解決,與GraphLab的作者聯系並交流,作者也無法定位問題所在。

我猜測機器型號可能導致該問題:

運行GraphLab的集群,每台機器的型號一定要完全一致。因為GraphLab使用C++開發,相比Java的一處編譯多處運行,C++並不具有這種特性。要想讓在一台機器上編譯的代碼能夠在其他機器上正確運行,一定要確保所有機器型號一致。我碰到的現象很奇怪,雖然我集群中的機器有幾台型號不一致,但是我在一台機器上編譯后生成的可執行程序在型號不一樣的機器上也能正常運行。但是分布式模式下,就會卡住。具體是什么原因,我也不清楚。

有人可能會問,不同型號的機器,自己編譯自己的可以嗎?答案是不行,分布式模式下程序運行前要檢查校驗碼,確保所有可執行程序是在同一台機器上編譯的,如果校驗碼不一致,程序無法運行。

但是真實情況又否定了我的這一猜測。我的集群里有三種不同型號的機器,當兩台能同時運行時,這兩台的型號不一樣。當四台能同時運行時,其中的四台有三種型號。

問題解決方法:

通過郵件與GraphLab作者交流,作者對我碰到的問題也很費解,試了各種可能的方法,都無法解決我碰到的問題。一個偶然的機會,實驗室的一位學弟解決了我的問題。我安裝GraphLab使用的是OpenMPI, 學弟將OpenMPI換成MPICH后,問題解決了。關於安裝MPICH的過程可以參考:http://hi.baidu.com/ldante/item/82a07c51a60da6474eff208f。 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM