GraphLab 是由CMU(卡內基梅隆大學)的Select 實驗室在2010 年提出的一個基於圖像處理模型的開源圖計算框架,框架使用C++語言開發實現。該框架是面向機器學習(ML)的流處理並行計算框架,能夠運行在多處理機的單機系統、集羣或是亞馬遜的EC2 等多種環境下。框架的設計目標是,像MapReduce同樣高度抽象,能夠高效執行與機器學習相關的、具備稀疏的計算依賴特性的迭代性算法,而且保證計算過程當中數據的高度一致性和高效的並行計算性能。該框架最初是爲處理大規模機器學習任務而開發的,可是該框架也一樣適用於許多數據挖掘方面的計算任務。在並行圖計算領域,該框架在性能上高出不少其餘並行計算框架(例如,MapReduce、Mahout)幾個數量級。GraphLab 自成立以來就是一個發展很迅速的開源項目,其用戶涉及的範圍也至關普遍,全球有2 000 多個企業、機構使用GraphLab。linux
GraphLab 做爲一個基於圖處理的並行計算框架,可以高效地執行機器學習相關的數據依賴性強,迭代型算法,其設計具備以下特色和優勢。算法
- 統一的API 接口。對於多核處理器和分佈式環境,採用統一的API 接口,一次編寫程序便可高效地運行在共享內存環境或者分佈式集羣上。
- 高性能。優化C++執行引擎,在大量多線程操做和同步I/O 操做之間進行了很好的平衡。
- 可伸縮性強。GraphLab 可以智能地選擇存儲和計算的節點,緣由是GraphLab 對於數據的存儲與計算都使用了精心設計的優良算法。
- 集成HDFS。GraphLab 內置對HDFS 的支持,GraphLab 可以直接從HDFS中讀數據或者將計算結果數據直接寫入到HDFS 中。
- 功能強大的機器學習類工具集。GraphLab 在自身提供的API 接口之上實現了大量的開箱即用的工具集。
GraphLab如今還不支持Windows,暫時只能經過VMware Player運行linux的虛擬機,官方給出了已經配置好的GraphLab Create的VM文件,能夠免去編譯等步驟。下載GraphLab Create,並按照要求配置安裝編程
通常的機器學習類算法有如下兩個特性:多線程
- 數據依賴性很強。運算過程當中參與計算的各個機器之間常常須要交換大量的數據。
- 流處理複雜。主要表如今整個處理過程須要反覆地迭代計算,數據處理分支不少,很難實現真正的並行。
在GraphLab 出現以前,針對這些機器學習的算法,廣泛的編程方法是採用MPI 和PThread 這些已有的底層開發庫來完成這類計算問題。採用這種編程模型的開發應用,針對具體的應用,須要開發者實現相應的算法來完成計算過程當中集羣計算節點之間主機通訊和數據同步等底層操做。這種開發方法的優點在於,能夠針對具體的應用對代碼進行深度的優化,以達到很高的性能。可是對於不一樣的應用,須要重寫代碼實現底層的數據分配、數據通訊等細節,這就致使了代碼重用率很低,可拓展性差,對編程人員要求高。這種編程模型顯然不適合當前敏捷的互聯網開發。而當前被普遍使用的MapReduce 計算框架,在並行執行多任務的時候,要求各個任務之間相互獨立,任務執行期間不須要相互之間進行數據通訊,因此MapReduce 不適合數據依賴性強的任務,並且MapReduce 並行計算模型也不能高效表達迭代型算法。這種計算模型在處理如日誌分析、數據統計等數據獨立性的任務時具備明顯的優點,可是在機器學習領域,MapReduce框架並不能很好地知足機器學習計算任務。架構
GraphLab 的出現不是對MapReduce 算法的替代,相反,GraphLab 借鑑了MapReduce 的思想,將MapReduce 並行計算模型推廣到了對數據重疊性、數據依賴性和迭代型算法適用的領域。本質上,GraphLab 填補了高度抽象的MapReduce 並行計算模型和底層消息傳遞、多線程模型(如MPI 和PThread)之間的空隙。app
當前流行的並行計算框架MapReduce 將並行計算過程抽象爲兩個基本操做,即map 操做和reduce 操做,在map 階段將做業分爲相互獨立的任務在集羣上進行並行處理,在reduce階段將map的輸出結果進行合併獲得最終的輸出結果。GraphLab 模擬了MapReduce 中的抽象過程。對MapReduce的map操做,經過稱爲更新函數(Update Function)的過程進行模擬,更新函數可以讀取和修改用戶定義的圖結構數據集。用戶提供的數據圖表明瞭程序在內存中和圖的頂點、邊相關聯的內存狀態,更新函數可以遞歸地觸發更新操做,從而使更新操做做用在其餘圖節點上進行動態的迭代式計算。GraphLab 提供了強大的控制原語,以保證更新函數的執行順序。GraphLab對MapReduce的reduce操做也經過稱爲同步操做(Sync Operation)的過程進行模擬。同步操做可以在後臺計算任務進行的過程當中執行合併(Reductions),和GraphLab 提供的更新函數同樣,同步操做可以同時並行處理多條記錄,這也保證了同步操做可以在大規模獨立環境下運行。框架
GraphLab將數據抽象成Graph結構,將算法的執行過程抽象成Gather、Apply、Scatter三個步驟。其並行的核心思想是對頂點的切分。
上圖示例中,須要完成對V0鄰接頂點的求和計算,串行實現中,V0對其全部的鄰接點進行遍歷,累加求和。而GraphLab中,將頂點V0進行切分,將V0的邊關係以及對應的鄰接點部署在兩臺處理器上,各臺機器上並行進行部分求和運算,而後經過master頂點和mirror頂點的通訊完成最終的計算。機器學習
頂點是其最小並行粒度和通訊粒度,邊是機器學習算法中數據依賴性的表現方式。
對於某個頂點,其被部署到多臺機器,一臺機器做爲master頂點,其他機器上做爲mirror。Master做爲全部mirror的管理者,負責給mirror安排具體計算任務;mirror做爲該頂點在各臺機器上的代理執行者,與master數據的保持同步。
對於某條邊,GraphLab將其惟一部署在某一臺機器上,而對邊關聯的頂點進行多份存儲,解了邊數據量大的問題。
同一臺機器上的全部edge和vertex構成local graph,在每臺機器上,存在本地id到全局id的映射表。vertex是一個進程上全部線程共享的,在並行計算過程當中,各個線程分攤進程中全部頂點的gather->apply->scatter操做。分佈式
每一個頂點每一輪迭代通過gather->apple->scatter三個階段。
在執行模型中,graphlab經過控制三個階段的讀寫權限來達到互斥的目的。在gather階段只讀,apply對頂點只寫,scatter對邊只寫。並行計算的同步經過master和mirror來實現,mirror至關於每一個頂點對外的一個接口人,將複雜的數據通訊抽象成頂點的行爲。