天天看點

《Spark大資料分析實戰》——3.3節GraphX

本節書摘來自華章社群《spark大資料分析實戰》一書中的第3章,第3.3節graphx,作者高彥傑 倪亞宇,更多章節内容可以通路雲栖社群“華章社群”公衆号檢視

3.3 graphx

graphx是spark中的一個重要子項目,它利用spark作為計算引擎,實作了大規模圖計算的功能,并提供了類似pregel的程式設計接口。graphx的出現,将spark生态系統變得更加完善和豐富;同時以其與spark生态系統其他元件很好的融合,以及強大的圖資料處理能力,在工業界得到了廣泛的應用。本章主要介紹graphx的架構、原理和使用方式。

3.3.1 graphx簡介

graphx是常用圖算法在spark上的并行化實作,同時提供了豐富的api接口。圖算法是很多複雜機器學習算法的基礎,在單機環境下有很多應用案例。在大資料環境下,圖的規模大到一定程度後,單機很難解決大規模的圖計算,需要将算法并行化,在分布式叢集上進行大規模圖處理。目前,比較成熟的方案有graphx和graphlab等大規模圖計算架構。

graphx的特點是離線計算、批量處理,基于同步的bsp模型(bulk synchronous parallel computing model,整體同步并行計算模型),這樣的優勢在于可以提升資料處理的吞吐量和規模,但是會造成速度上稍遜一籌。目前大規模圖處理架構還有基于mpi模型的異步圖計算模型graphlab和同樣基于bsp模型的graph等。

現在和graphx可以組合使用的分布式圖資料庫是neo4j。neo4j一個高性能的、非關系的、具有完全事務特性的、魯棒的圖資料庫。另一個資料庫是titan,titan是一個分布式的圖形資料庫,特别為存儲和處理大規模圖形而優化。二者均可作為graphx的持久化層,存儲大規模圖資料。

3.3.2 graphx的使用簡介

類似spark在rdd上提供了一組基本操作符(如map, f?ilter, reduce),graphx同樣也有針對graph的基本操作符,使用者可以在這些操作符傳入自定義函數和通過修改圖的節點屬性或結構生成新的圖。

graphx提供了豐富的針對圖資料的操作符。graph類中定義了核心的、優化過的操作符。一些更加友善的由底層核心操作符組合而成的上層操作符在graphops中進行定義。正是通過scala語言的implicit關鍵字,graphops中定義的操作符可以作為graph中的成員。這樣做的目的是未來graphx會支援不同類型的圖,而每種類型的圖的呈現必須實作核心的操作符和複用大部分的graphops中實作的操作符。

下面将操作符分為幾個類别進行介紹。

(1)屬性操作符

表3-1給出了graphx的屬性操作符。通過屬性操作符,使用者可以在點或邊上進行相應運算,建構和開發圖算法。

《Spark大資料分析實戰》——3.3節GraphX

(3)圖資訊屬性(見表3-3)

表3-3所示為圖資訊屬性,通過圖資訊屬性,使用者可以擷取圖上的統計資訊。

《Spark大資料分析實戰》——3.3節GraphX
《Spark大資料分析實戰》——3.3節GraphX

存儲和原語層:graph類是圖計算的核心類。内部含有vertexrdd、edgerdd和rdd[edgetriplet]引用。graphimpl是graph類的子類,實作了圖操作。

接口層:在底層rdd的基礎之上實作了pregel模型,bsp模式的計算接口。

算法層:基于pregel接口實作了常用的圖算法。包括:pagerank、svdplusplus、trianglecount、connectedcomponents、stronglyconnectedconponents等算法。

2.?存儲結構

在正式的工業級的應用中,圖的規模極大,上百萬個節點是經常出現的。為了提高處理速度和資料量,希望能夠将圖以分布式的方式來存儲、處理圖資料。圖的分布式存儲大緻有兩種方式,邊分割(edge cut)和點分割(vertex cut),如圖3-16所示。最早期的圖計算的架構中,使用的是edge cut(邊分割)的存儲方式。而graphx的設計者考慮到真實世界中的大規模圖大多是邊多于點的圖,是以采用點分割方式存儲。點分割能夠減少網絡傳輸和存儲開銷。底層實作是将邊放到各個節點存儲,而在進行資料交換時将點在各個機器之間廣播進行傳輸。對邊進行分區和存儲的算法主要基于partitionstrategy中封裝的分區方法。這裡面的幾種分區方法分别是對不同應用情景的權衡,使用者可以根據具體的需求進行分區方式的選擇。使用者可以在程式中指定邊的分區方式。例如:

《Spark大資料分析實戰》——3.3節GraphX

一旦邊已經在叢集上分區和存儲,大規模并行圖計算的關鍵挑戰就變成了如何将點的屬性連接配接到邊。graphx的處理方式是叢集上移動傳播點的屬性資料。由于不是每個分區都需要所有的點屬性(因為每個分區隻是一部分邊),graphx内部維持一個路由表(routing table),這樣當需要廣播點到需要這個點的邊的所在分區時就可以通過路由表映射,将需要的點屬性傳輸到指定的邊分區。

點分割的好處是在邊的存儲上是沒有備援資料的,而且對于某個點與它的鄰居的互動操作,隻要滿足交換律和結合律。例如,求頂點的鄰接頂點權重的和,可以在不同的節點進行并行運算,最後把每個節點的運作結果進行彙總,網絡開銷較小。代價是每個頂點屬性可能要備援存儲多份,更新點資料時要有資料同步開銷。

3.?使用技巧

采樣觀察可以通過不同的采樣比例,先從小資料量進行計算、觀察效果、調整參數,再逐漸增加資料量進行大規模的運算。可以通過rdd的sample方法進行采樣。同時通過web ui觀察叢集的資源消耗。

1)記憶體釋放:保留舊圖對象的引用,但是盡快釋放不使用的圖的頂點屬性,節省空間占用。通過unpersistvertices方法進行頂點釋放。

2)gc調優,請讀者參考性能調優章節介紹。

3)調試:在各個時間點可以通過graph.vertices.count()進行調試,觀測圖現有狀态。進行問題診斷和調優。

graphx通過提供簡潔的api以及優化的圖資料管理,簡化了使用者開發分布式圖算法的複雜度。在大資料分析中更多的應用場景是進行機器學習,下面通過mllib的介紹,讀者可以了解如何通過spark之上的mllib進行複雜的機器學習。