第1关:认识Pregel API
简介
Spark GraphX中提供了方便开发者的基于谷歌Pregel API的迭代算法,因此可以用Pregel的计算框架来处理Spark上的图数据。GraphX的Pregel API提供了一个简明的函数式算法设计,用它可以在图中方便的迭代计算,如最短路径、关键路径、n度关系等,也可以通过对一些内部数据集的缓存和释放缓存操作来提升性能。
任务描述
本关任务:使用pregel函数找到图1中距离Ann最远的顶点。
相关知识
Pregel API
在Pregel计算模式中,输入是一个有向图,该有向图的每一个顶点都有一个相应的独一无二的顶点ID。每一个顶点都有一些属性,这些属性可以被修改,其初始值由用户定义。每一条有向边都和其源顶点关联,并且也拥有一些用户定义的属性和值,并同时还记录了其目标顶点的ID。
Pregel运算执行一系列的超步(superstep),每一个超步就是一轮单独的迭代。在每个超步内部,每个顶点的计算都是并行的,每个顶点会接收到它的邻居们在上一轮超步发送的消息的总和,然后计算顶点属性的新值;此外,在超步迭代的最后一步, 每个顶点也会给它的邻居们发送消息。顶点也可以选择不发送消息;如果目标顶点没有从它的源顶点收到任何消息,它就不会参与下一个超步的运算。当没有消息发送时或是当前迭代次数大于默认迭代次数时,Pregel运算符终止迭代并返回一个新的图。
Pregel函数定义如下:
def pregel[A]
(initialMsg: A,
maxIter: Int = Int.MaxValue,
activeDir: EdgeDirection = EdgeDirection.Out)
(vprog: (VertexId, VD, A) => VD,
sendMsg: EdgeTriplet[VD, ED] => Iterator[(VertexId, A)],
mergeMsg: (A, A) => A)
: Graph[VD, ED]
核心部分是三个函数:
(1)节点处理消息的函数vprog: (VertexId, VD, A) => VD
用户自定义的函数,运行于每个节点上,和输入消息进行计算,生成新的顶点值,在第一次迭代时,vprog在每个顶点上都执行一次,和默认输入消息进行计算,在之后的迭代时,vprog只会在接收到消息的顶点上执行。
(2)节点发送消息的函数sendMsg: EdgeTriplet[VD, ED] =>Iterator[(VertexId,A)]
用户自定义的函数,运行于每个活跃的边三元组上,产生发送给下一次迭代的消息。
(3)消息合并函数mergeMsg: (A, A) => A)
用户自定义的函数,用于将两条发送给顶点的消息合并为一条消息。
第一个参数列表中的参数是完成一些配置工作&#x