Pregel 最初是为了解决PageRank计算问题,由于MapReduce并不适于这种场景,所以需要发展新的计算模型去完成这项计算任务,在这个过程中逐步提炼出一个通用的图计算框架,并用来解决更多的问题。核心思想源自BSP模型。

很多现实中的计算问题都会涉及到大规模的图。例如网页链接关系和社交关系等。这些图的规模可能达到数十亿的顶点和数万亿的边,这使得如何对它们进行高效处理成为一个巨大的挑战。

在Pregel中,提出了一种适于处理这类问题的计算模型。程序使用一系列的迭代过程来表达,在每一次迭代中,每个顶点会接收来自上一次迭代的信息,并发送信息给其它顶点,同时可能修改其自身状态以及以它为顶点的出边的状态,或改变整个图的拓扑结构。

图算法常常表现出比较差的内存访问局部性,针对单个顶点的处理工作过少,以及计算过程中伴随着的并行度的改变等问题。分布式的介入更是加剧了locality的问题,并且增加了在计算过程中机器发生故障的概率。

Pregel系统的灵感来自Valiant提出的BSP(Bluk Synchronous Parallell)模型。Pregel的计算过程由一系列被称为超级步(superstep)的迭代(iterations)组成。在每一个超级步中,计算框架都会针对每个顶点调用用户自定义的函数,这个过程是并行的{!即不是一个一个顶点的串行调用,同一时刻可能有多个顶点被调用}。该函数描述的是一个顶点V在一个superstep S中需要执行的操作。该函数可以读取前一个超级步(S-1)中发送给V的消息,并发送消息给其他顶点,这些消息将会在下一个超级步(S+1)中被接收,并且在此过程中修改顶点V及其出边的状态。消息通常沿着顶点的出边发送,但一个消息可能会被发送到任意已知ID的顶点上去。

Reference:

  1. PREGEL
  2. Pregel: A System for Large-Scale Graph Processing