Blink+Flink

Flink gelly 转

2019-02-13  本文已影响52人  生活的探路者

What is Gelly?

image.png

Neighborhood Aggregations(邻居聚合)

image.png

image.png

Iterative Graph Processing

Vertex-centric

MessagingFunction: 给下一个超步发送的消息。

VertexUpdateFunction:定义一个节点对收到的消息如何去处理

image.png

operator收到两个输入:

the Solution Set: 当前输入的状态

the Workset, 图的一部分在下次迭代中会被重新计算

Vertex Centric迭代计算

image.png

image.png

Vertex Centric模型,也称为”像顶点一样思考”或”Pregel”,通过图顶点的角度表达计算。 该计算在迭代的每一步(称为超步)中同步地处理,在每个超步时,每个顶点执行一个UDF(User Defined Function)。 顶点之间通过消息进行通讯,任何一个顶点可以给图中任何其他的顶点发送消息,只要知道它的ID即可。

下面的图中展示该计算模型,虚线框和并行单元对应。在每个超步中,所有的活跃顶点并行执行相同的用户定义的计算。因为超步时同步执行的,因此每次超步中发送的消息都被保证发送了到下次超步的开始。

image.png

在Gelly中使用Vertex Centric迭代,用户只需要定义顶点的计算函数ComputeFunction即可。

该函数和最大迭代次数通过Gelly的runVertexCentricIteration函数参数指定。该方法在输入图上执行Vertex Centric迭代计算,并输出更新后顶点值的新图。可选的MessageCombiner函数可以被用于减少通信消耗。

让我们考虑基于Vertex Centric的单源点最短路径算法(SSSP)。算法开始时,除了源顶点初始值为0,每个顶点初始值为正无穷。第一次超步计算时,源顶点将距离传播给它的邻居。在接下来的超步中,每个顶点检查接收的消息并选择其中最小的距离值。如果该距离值比顶点当前值小,则更新顶点的值,并产生消息发送给其邻居。如果顶点在超步中没有更新它的值,则在下次超步时不会发送任何消息给它的邻居。当没有顶点的值发生更新或者达到了最大的超步迭代次数,算法将会收敛。在这个算法中,Message Combiner可以被用来减少发送给目标顶点的消息个数。

// 构建图Graph graph = ...// 最大迭代次数intmaxIterations =10;// 执行vertex-centric iterationGraph result = graph.runVertexCentricIteration(newSSSPComputeFunction(),newSSSPCombiner(), maxIterations);// 抽取结果DataSet> singleSourceShortestPaths = result.getVertices();//用户定义函数publicstaticfinalclassSSSPComputeFunctionextendsComputeFunction{publicvoidcompute(Vertex<Long, Double> vertex, MessageIterator<Double> messages){doubleminDistance = (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 e: getEdges()) {            sendMessageTo(e.getTarget(), minDistance + e.getValue());        }    }}// 消息合并publicstaticfinalclassSSSPCombinerextendsMessageCombiner{publicvoidcombineMessages(MessageIterator<Double> messages){doubleminMessage = 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

作者:丹之

链接:https://www.jianshu.com/p/ff1bd928223b

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

上一篇下一篇

猜你喜欢

热点阅读