Prergel图计算模型

1、有向图和顶点

Pregel计算模型以有向图作为输入
有向图的每个顶点都有一个String类型的顶点ID
每个顶点都有一个可修改的用户自定义值(不同应用场景该值的含义不同)与之关联
每条有向边都和其源顶点关联,并记录了其目标顶点ID
边上有一个可修改的用户自定义值与之关联

  在每个超步S中,图中的所有顶点都会并行执行相同的用户自定义函数(每个超步中的用户自定义函数执行不同的操作)
  每个顶点可以接收前一个超步(S-1)中发送给它的消息,修改其自身及其出射边(以该顶点为源顶点的边)的状态,并发送消息给其他顶点,甚至是修改整个图的拓扑结构
  在这种计算模式中,“边”并不是核心对象,在边上面不会运行相应的计算,只有顶点才会执行用户自定义函数进行相应计算

2、顶点之间的消息传递

采用消息传递模型主要基于以下两个原因
(1)消息传递具有足够的表达能力,没有必要使用远程读取(数据存储在一个顶点,通知下一级顶点来通过网络读取,RPC)或共享内存的方式
(2)有助于提升系统整体性能。大型图计算通常是由一个集群完成的,集群环境中执行远程数据读取会有较高的延迟;Pregel的消息模式采用异步和批量的方式传递消息,因此可以缓解远程读取的延迟。另外共享内存模式,扩展性不好。消息传递扩展性更好。

  每个顶点有一个输入队列。本超步S中,源顶点A把处理完的消息发送到目标顶点B的输入队列中。在超步S+1中,顶点B会从自己的输入队列取出消息进行处理。

3、Pregel的计算过程

(1)Pregel的计算过程是由一系列被称为“超步”的迭代组成的
(2)在每个超步中,每个顶点上面都会并行执行用户自定义的函数,该函数描述了一个顶点V在一个超步S中需要执行的操作
(3)该函数可以读取前一个超步(S-1)中其他顶点发送给顶点V的消息,执行相应计算后,修改顶点V及其出射边的状态,然后沿着顶点V的出射边发送消息给其他顶点,而且,一个消息可能经过多条边的传递后被发送到任意已知ID的目标顶点上去
(4)这些消息将会在下一个超步(S+1)中被目标顶点接收,然后象上述过程一样开始下一个超步(S+1)的迭代过程

  在Pregel计算过程中,一个算法什么时候可以结束,是由所有顶点的状态决定的
(1)在第0个超步,所有顶点处于活跃状态,都会参与该超步的计算过程
(2)当一个顶点不需要继续执行进一步的计算时,就会把自己的状态设置为“停机”,进入非活跃状态
(3)一旦一个顶点进入非活跃状态,当前超步中就不会在该顶点上执行计算,除非其他顶点给该顶点发送消息把它再次激活(上图中4号顶点在超步S+1中状态时非活跃,也未收到任何消息,故不再执行计算,状态为非活跃)
(4)当一个处于非活跃状态的顶点收到来自其他顶点的消息时,Pregel计算框架必须根据条件判断来决定是否将其显式唤醒进入活跃状态
(5)当图中所有的顶点都已经标识其自身达到“非活跃(inactive)”状态,并且没有消息在传送的时候,算法就可以停止运行

 

 4、prergel求有向图中关联值中最大值的实例

  prergel输入的图如超步0描述,4个顶点ID分别为ABCD,关联的值分别为3,6,2,1;出射边为:A<-->B,B-->D,C-->B,C<-->D。

  图中实线表示顶点之间连接关系,虚线表示顶点间消息发送路径和方向。

  超步0计算操作:每个顶点沿着自己的出射边把本顶点的关联值发送给目标顶点,放入目标顶点的输入消息队列中;超步0结束后4个顶点状态还是活跃的。

  超步1、2、3计算操作:每个顶点从输入消息队列取出消息,把消息值和本顶点的关联值比较,把较大者更新到本顶点的关联值中;关联值发生变化则顶点状态为活跃,未发生变化则状态为非活跃;非活跃顶点收到消息但关联值未发生变化则状态依然是非活跃。只有活跃顶点才继续发送消息。

 

posted on 2017-08-14 22:39  ostin  阅读(878)  评论(0)    收藏  举报