Flink gelly

weixin_34146805發表於2018-09-21

What is Gelly?

5501600-c9c66047b1c4f2e7.png
image.png

Neighborhood Aggregations(鄰居聚合)


5501600-9b0e000ec93f504a.png
image.png

5501600-26c23bd65ce6c6b1.png
image.png

Iterative Graph Processing

Vertex-centric
MessagingFunction: 給下一個超步傳送的訊息。
VertexUpdateFunction:定義一個節點對收到的訊息如何去處理


5501600-c14f6d2c04ca93b0.png
image.png

operator收到兩個輸入:
the Solution Set: 當前輸入的狀態
the Workset, 圖的一部分在下次迭代中會被重新計算

Vertex Centric迭代計算

5501600-92c742d1482e0a83.png
image.png

5501600-2dbc6022f3da634d.png
image.png

Vertex Centric模型,也稱為”像頂點一樣思考”或”Pregel”,通過圖頂點的角度表達計算。 該計算在迭代的每一步(稱為超步)中同步地處理,在每個超步時,每個頂點執行一個UDF(User Defined Function)。 頂點之間通過訊息進行通訊,任何一個頂點可以給圖中任何其他的頂點傳送訊息,只要知道它的ID即可。

下面的圖中展示該計算模型,虛線框和並行單元對應。在每個超步中,所有的活躍頂點並行執行相同的使用者定義的計算。因為超步時同步執行的,因此每次超步中傳送的訊息都被保證傳送了到下次超步的開始。


5501600-7aab65f13578b93f.png
image.png

在Gelly中使用Vertex Centric迭代,使用者只需要定義頂點的計算函式ComputeFunction即可。

該函式和最大迭代次數通過Gelly的runVertexCentricIteration函式引數指定。該方法在輸入圖上執行Vertex Centric迭代計算,並輸出更新後頂點值的新圖。可選的MessageCombiner函式可以被用於減少通訊消耗。

讓我們考慮基於Vertex Centric的單源點最短路徑演算法(SSSP)。演算法開始時,除了源頂點初始值為0,每個頂點初始值為正無窮。第一次超步計算時,源頂點將距離傳播給它的鄰居。在接下來的超步中,每個頂點檢查接收的訊息並選擇其中最小的距離值。如果該距離值比頂點當前值小,則更新頂點的值,併產生訊息傳送給其鄰居。如果頂點在超步中沒有更新它的值,則在下次超步時不會傳送任何訊息給它的鄰居。當沒有頂點的值發生更新或者達到了最大的超步迭代次數,演算法將會收斂。在這個演算法中,Message Combiner可以被用來減少傳送給目標頂點的訊息個數。

// 構建圖
Graph<Long, Double, Double> graph = ...

// 最大迭代次數
int maxIterations = 10;

// 執行vertex-centric iteration
Graph<Long, Double, Double> result = graph.runVertexCentricIteration(
            new SSSPComputeFunction(), new SSSPCombiner(), maxIterations);

// 抽取結果
DataSet<Vertex<Long, Double>> singleSourceShortestPaths = result.getVertices();
//使用者定義函式
public static final class SSSPComputeFunction extends ComputeFunction<Long, Double, Double, Double> {

public void compute(Vertex<Long, Double> vertex, MessageIterator<Double> messages) {

    double minDistance = (vertex.getId().equals(srcId)) ? 0d : Double.POSITIVE_INFINITY;

    for (Double msg : messages) {
        minDistance = Math.min(minDistance, msg);
    }

    if (minDistance < vertex.getValue()) {
        setNewVertexValue(minDistance);
        for (Edge<Long, Double> e: getEdges()) {
            sendMessageTo(e.getTarget(), minDistance + e.getValue());
        }
    }
}

// 訊息合併
public static final class SSSPCombiner extends MessageCombiner<Long, Double> {

    public void combineMessages(MessageIterator<Double> messages) {

        double minMessage = Double.POSITIVE_INFINITY;
        for (Double msg: messages) {
           minMessage = Math.min(minMessage, msg);
        }
        sendCombinedMessage(minMessage);
    }
}

參考:
http://flink.iteblog.com/dev/libs/gelly/iterative_graph_processing.html#vertex-centric-1

相關文章