1. GraphLab簡單介紹
GraphLab是CMU(卡耐基梅隆大學)開發(fā)的一個以vertex為計算單元的大規(guī)模圖處理系統(tǒng)桶癣,是繼google的Pregel之后的第一個開源的大規(guī)模圖處理系統(tǒng)蛹头,它解決了傳統(tǒng)MapReduce框架對于機器學習應用的處理中最突出的兩個問題(頻繁迭代計算和大量節(jié)點通信)引起的計算效率的問題,與Haloop,Twister等基于MapReduce批量處理不同的是,它采用Pregel的以vertex為計算單元,并將機器學習抽象成GAS(gather摧阅,apply,scatter)三個步驟绷蹲,然后按該抽象模型設(shè)計實現(xiàn)算法棒卷,事實已經(jīng)證明該框架對于機器學習這一類跟圖處理關(guān)系緊密的應用有很好的效果顾孽。
我們部署的版本是PowerGraph,是github上面的開源項目比规,可以直接基于它開發(fā)C++應用∪艉瘢現(xiàn)在GraphLab的小組已經(jīng)成立了公司,對應的產(chǎn)品為GraphLab-Create,在原有的基礎(chǔ)上用Python進行封裝蜒什,還進行了一些優(yōu)化测秸。GraphLab-Create并不是免費的,可以加入Academic Program免費試用一年灾常。相應地霎冯,他們小組也逐漸棄用了PowerGraph。
部署PowerGraph這個事情是我之前做的钞瀑,現(xiàn)在已經(jīng)沒有用這個框架肃晚,PowerGraph文檔什么的都不全。如果還是在選擇框架階段仔戈,建議還是使用官方提供的Graphlab-Create。但是拧廊,如果需要部署PowerGraph监徘,希望這個文檔還是能夠?qū)δ阌兴鶐椭?/p>
2. 整體部署說明
GraphLab的這個PowerGraph項目包括處于頂層的核心API、機器學習和數(shù)據(jù)挖掘的工具包吧碾。通過TCP/IP進行進程間通信凰盔,使用MPI來啟動和管理PowerGraph程序,而且每一個程序都是多線程的倦春。
在安裝和編譯GraphLab源代碼之前户敬,需要先安裝配置SSH免密碼登陸和MPI。因為結(jié)點間需要管理遠程進程睁本,就必須保證在節(jié)點間執(zhí)行指令的時候不需要輸入密碼尿庐,所以需要SSH免密碼登陸,而MPI的實現(xiàn)應用(MPI是一套標準呢堰,有很多此標準的實現(xiàn)應用抄瑟,如MPICH2)則為并行應用提供消息傳遞或者相關(guān)服務。
3. 部署過程
3.1. 安裝Linux操作系統(tǒng)
1) 主機環(huán)境說明
集群中使用了3臺主機枉疼,每臺主機有CPU核4個皮假,內(nèi)存8G,每臺主機上安裝的操作系統(tǒng)為Ubuntu14.04 Desktop 64bit骂维,每臺主機上面都使用相同的用戶名graphlab惹资。
操作系統(tǒng) | 用戶名 | 主機名 | IP地址 | |
---|---|---|---|---|
主機1 | Ubuntu 14.04 64bit | graphlab | graphlabmaster | 192.168.0.5 |
主機2 | Ubuntu 14.04 64bit | graphlab | graphlabslave1 | 192.168.0.6 |
主機3 | Ubuntu 14.04 64bit | graphlab | graphlabslave2 | 192.168.0.7 |
可能這個主機名有迷惑作用,會認為主機之間存在主次之分航闺,是因為之前考慮安裝Hadoop遺留的問題褪测,就是說,GraphLab的主機結(jié)點沒有主次之分。
需要注意的是汰扭,根據(jù)GraphLab官方指南稠肘,安裝GraphLab需要使用64bit的操作系統(tǒng)。而且根據(jù)網(wǎng)上博客內(nèi)容萝毛,最好每臺主機的機型完全一致项阴,因為GraphLab使用C++開發(fā),相比Java的一處編譯多處運行笆包,C++并不具有這種特性环揽。要想讓在一臺主機上編譯的代碼能夠在其他主機上正確運行,一定要確保所有主機型號一致(但是博主實驗時不同機型的主機也可以并行庵佣,所以這只是作參考歉胶,最好機型一致)。
2) 安裝注意事項
建議配置相同的用戶名巴粪,不同的用戶名可以配置使用通今,但是第一是更加麻煩,第二是可能會遇到問題肛根,比如以后想使用網(wǎng)絡(luò)文件系統(tǒng)NFS辫塌,用戶名不同會產(chǎn)生權(quán)限之類的問題。
用戶的$HOME目錄在文件系統(tǒng)中應該完全相同
3.2. 修改主機文件
1) 在每臺主機上修改主機名
可能安裝系統(tǒng)的時候主機名不是自己想要的派哲,那么就需要修改自己的主機名臼氨,如果覺得不影響,可以不作任何修改芭届。
- 修改文件/etc/hostname,把主機名修改為自己想要的名字
- 修改文件/etc/hosts,把原來的主機名改為新的主機名
2) 在每臺主機上修改主機文件
需要把其他主機的IP和主機名對應關(guān)系寫在/etc/hosts文件中储矩,那么集群中的主機就通過主機名互相識別,某一個主機的/etc/hosts文件內(nèi)容示例如下:
127.0.0.1 localhost
192.168.0.5 graphlabmaster
192.168.0.6 graphlabslave1
192.168.0.7 graphlabslave2
#The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
我們配置的集群有三臺主機褂乍,分別是graphlabmaster,graphlabslave1和graphlabslave2,前面是他們對應的IP地址持隧,需要注意的是:默認會有一行內(nèi)容為127.0.0.1+主機名,刪掉就可以了逃片。
3.3. 配置ssh免密碼登陸
1) ssh使用原理
- ssh采用公鑰加密舆蝴,每一臺主機都會有自己的公鑰和私鑰
- 每一臺主機都把自己的公鑰分發(fā)給其他主機,就是說所有主機都知道集群中其他主機的公鑰
- 舉一個遠程登陸的例子题诵,當Master主機通過SSH連接Salve主機時洁仗,Salve就會生成一個隨機數(shù)并用Master的公鑰對隨機數(shù)進行加密,并發(fā)送給Master性锭。Master收到加密數(shù)之后再用私鑰解密赠潦,并將解密數(shù)回傳給Slave,Slave確認解密數(shù)無誤之后就允許Master進行連接了草冈。這就是一個公鑰認證過程她奥,其間不需要用戶手工輸入密碼
2) 在所有主機中安裝ssh
ubuntu14.04中默認安裝有Openssh-client,只需要在每個主機中都安裝Openssh-server
sudo apt-get install openssh-server
3) 生成密鑰
正常的過程是所有主機都生成自己的公鑰和私鑰密鑰對瓮增,但是為了部署簡單,現(xiàn)在一般也都是只需要一臺主機生成密鑰對哩俭,然后把密鑰對拷貝至其他主機绷跑,所以所有的主機都有相同的密鑰對,那么就可以完成認證過程凡资。
在一臺主機上生成密鑰砸捏,生成過程中會提示輸入密碼,可以輸入密碼(更加安全)隙赁,也可以直接跳過垦藏,默認的保存目錄是~/.ssh/id_rsa
ssh-keygen -t rsa
進入.ssh目錄中,添加公鑰至授權(quán)的keys
cat id_rsa.pub >> authorized_keys
4) 修改ssh配置文件
打開ssh配置文件"/etc/ssh/sshd_config"伞访,取消文件中下列內(nèi)容的注釋”#”
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
設(shè)置完畢后重啟服務掂骏,配置才生效
service ssh restart
設(shè)置完畢后,現(xiàn)在還只是在一臺主機上面進行的設(shè)置厚掷,可以自己驗證是否配置成功弟灼,如果能夠登陸本機成功,則配置成功冒黑,首先需要配置本地登錄成功
ssh localhost
注意事項:此處很可能不能成功袜爪,請檢查三個文件目錄的權(quán)限,$HOME/.ssh/authorized_keys文件(可以設(shè)置為600)薛闪,$HOME/.ssh目錄(可以設(shè)置為700),$HOME目錄(可以設(shè)置為731)俺陋,這三個目錄都只能設(shè)置成擁有者有寫權(quán)限豁延,否則sshd不工作,因為sshd發(fā)現(xiàn)這些目錄別人也有寫權(quán)限的話腊状,它會認為別人也有能力篡改authorized_keys文件中的值诱咏,那么是不安全的,所以就不會工作缴挖。
設(shè)置文件權(quán)限,如 authorized_keys的權(quán)限設(shè)置為600
chmod 600 authorized_keys
如果文件權(quán)限沒有問題袋狞,那么便查看自己防火墻iptables是否關(guān)閉
5) 關(guān)閉所有主機的防火墻iptables
sudo ufw disable
6) 部署其他主機
剛才在一臺主機上面部署了ssh并可以本地免密碼登陸,現(xiàn)在要實現(xiàn)互相可以免密碼登陸映屋。
拷貝.ssh目錄至其他主機苟鸯,可以使用scp命令,如
scp –r .ssh graphlab@192.168.0.7:~/
這條命令拷貝.ssh目錄至192.168.0.7主機中g(shù)raphlab用戶的$HOME目錄下。
參照第4)步中檢查ssh的配置文件棚点,重啟服務早处,檢查文件夾的權(quán)限,然后檢查能否互相免密碼登陸(按道理是可以的瘫析,因為所以的密鑰都是相同的砌梆,驗證是可以成功的)
驗證互相之間是不是可以免密碼登陸默责。
3.4. 安裝編譯GraphLab
1) 為每臺主機更新一下源,保證獲取的安裝包都是最新的
sudo apt-get update
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
git clone https://github.com/graphlab-code/graphlab.git
4) 編譯GraphLab
進入graphlab文件夾,使用graphlab自帶的configure腳本配置編譯環(huán)境
cd graphlab
./configure
配置成功后會在graphlab文件夾內(nèi)生成release和debug兩個新的目錄烂瘫。這兩個目錄分別對應不同項目的發(fā)行版和測試版媒熊,在這兩個目錄中都可以編譯GraphLab的所有Toolkit,分別對應發(fā)行版和測試版忱反。編譯后發(fā)行版與測試版的不同是泛释,發(fā)行版在編譯過程中程序都做了優(yōu)化,運行速度更快温算。
還有一點需要特別指出怜校,GraphLab不僅提供了分布式大規(guī)模圖計算模型,而且基于該模型實現(xiàn)了很多實用的工具集注竿,這些工具集可以分成六類:主題建模茄茁、圖分析、聚類巩割、協(xié)同過濾裙顽、圖模型和計算機視覺⌒福可以根據(jù)自己的需要只編譯其中的某一類或幾類愈犹。如果全部編譯,第一次編譯時會下載很多的庫文件闻丑,耗費很長時間漩怎。我只對其中的圖分析工具集比較感興趣,所以只編譯了這一個嗦嗡。同時我也編譯了apps目錄中的相應樣例代碼勋锤。
編譯release目錄下的apps子目錄:
cd release/apps
make -j 3
第二行中的參數(shù)-j 3是利用了make的并行編譯特性,3指的是同時進行三個編譯任務侥祭。該數(shù)字越大叁执,并行性越高,編譯速度越快矮冬,但是占用內(nèi)存也越多谈宛。如果該數(shù)字過大,會因內(nèi)存不夠用而使編譯過程卡住胎署。
編譯release目錄下的toolkits中的graph_analytics:
cd release/toolkits/graph_analytics
make -j 3
如果希望編譯整個GraphLab入挣,那么可以在release目錄下運行如下命令:
cd release
make -j 3
注意事項:編譯的過程不一定都順利,可能會有文件下載失敗的問題和權(quán)限問題等
- 如果提示hash not match,則為文件內(nèi)容不全硝拧,下載失敗径筏。解決辦法:首先檢查是否使用代理葛假,網(wǎng)上說代理一般是不能成功的。如果沒有使用代理滋恬,還是不能成功聊训,可以自己手動下載文件,然后把文件放在指定的目錄即可恢氯。
- /hadoop/src/hadoop/src/c++/libhdfs/configure: Permission denied带斑,則是文件權(quán)限的問題,解決辦法:
chmod a+rx /hadoop/src/hadoop/src/c++/libhdfs/configure
就是給所以用戶加上讀和執(zhí)行的權(quán)限勋拟。
5) 集群測試
在所有結(jié)點上創(chuàng)建一個文件勋磕,文件名為“machines”,文件里面內(nèi)容為所有結(jié)點的主機名,最好是在一臺主機上面新建文件敢靡,然后復制至其他主機挂滓,保證內(nèi)容相同拟赊。內(nèi)容示例如下:
graphlabmaster
graphlabslave1
graphlabslave2
在安裝GraphLab的主機上面運行如下命令植捎,GraphLab提供了腳本用于分發(fā)編譯好的二進制可執(zhí)行文件到集群中的所有其他機器上家坎。在你下載并編譯了GraphLab的那臺機器上别威,使用下面的命令來分發(fā)二進制可執(zhí)行文件和相關(guān)庫文件把一些GraphLab文件拷貝至其他主機
cd ~/graphlab/release/toolkits
~/graphlab/scripts/mpirsync
cd ~/graphlab/deps/local
~/graphlab/scripts/mpirsync
單機測試,在每一臺機器上苫耸,運行如下的命令來測試分發(fā)到每臺機器上的二進制可執(zhí)行程序能否正確運行:
cd ~/graphlab/release/toolkits/graph_analytics/
./pagerank --powerlaw=10000
分布式測試蜈块,在任意一臺機器上曾沈,運行如下兩條命令:
cd ~
mpiexec -n 2 -hostfile machines
graphlab/release/toolkits/graph_analytics/pagerank --powerlaw=100000
如果上述命令能夠正確無誤執(zhí)行陷谱,那么GraphLab分布式集群運算環(huán)境搭建就算完成了烙博。