第9章 图计算
图计算简介
图结构数据
1 | •许多大数据都是以大规模图或网络的形式呈现,如社交网络、传染病传播途径、交通事故对路网的影响 |
传统图计算解决方案的不足之处
1 | 很多传统的图计算算法都存在以下几个典型问题: |
1 | 针对大型图(比如社交网络和网络图)的计算问题,可能的解决方案及其不足之处具体如下: |
图计算通用软件
1 | 针对大型图的计算,目前通用的图计算软件主要包括两种: |
1 | 一次BSP(整体同步并行计算模型、又称大同步模型)计算过程包括一系列全局超步(所谓的超步就是计算中的一次迭代),每个超步主要包括三个组件: |

Pregel简介
1 | •谷歌公司在2003年到2004年公布了GFS、MapReduce和BigTable,成为后来云计算和Hadoop项目的重要基石 |
Pregel图计算模型
有向图和顶点
1 | •Pregel计算模型以有向图作为输入,有向图的每个顶点都有一个String类型的顶点ID,每个顶点都有一个可修改的用户自定义值与之关联,每条有向边都和其源顶点关联,并记录了其目标顶点ID,边上有一个可修改的用户自定义值与之关联 |

顶点之间的消息传递
1 | 采用消息传递模型主要基于以下两个原因: |
Pregel的计算过程
1 | •Pregel的计算过程是由一系列被称为“超步”的迭代组成的。 |
1 | •在Pregel计算过程中,一个算法什么时候可以结束,是由所有顶点的状态决定的 |
实例
1 | 发送出去的消息,会在下一个超步执行,每一个顶点都有一个输入队列,队列中的值来源于上一个超步,每一个超步执行时去取自己输入队列中的值 |
Pregel的C++ API
1 | Pregel已经预先定义好一个基类——Vertex类: |
1 | template <typename VertexValue, typename EdgeValue, typename MessageValue> |
1 | •在Vetex类中,定义了三个值类型参数,分别表示顶点、边和消息。每一个顶点都有一个给定类型的值与之对应 |
消息传递机制
1 | • 顶点之间的通讯是借助于消息传递机制来实现的,每条消息都包含了消息值和需要到达的目标顶点ID。用户可以通过Vertex类的模板参数来设定消息值的数据类型 |
Combiner
1 | • Pregel计算框架在消息发出去之前,Combiner可以将发往同一个顶点的多个整型值进行求和得到一个值,只需向外发送这个“求和结果”,从而实现了由多个消息合并成一个消息,大大减少了传输和缓存的开销 |
Aggregator
1 | • Aggregator提供了一种全局通信、监控和数据查看的机制 |
拓扑改变
1 | • Pregel计算框架允许用户在自定义函数Compute()中定义操作,修改图的拓扑结构,比如在图中增加(或删除)边或顶点 |
输入和输出
1 | • 在Pregel计算框架中,图的保存格式多种多样,包括文本文件、关系数据库或键值数据库等 |
Pregel的体系结构
Pregel的执行过程
1 | •在Pregel计算框架中,一个大型图会被划分成许多个分区,每个分区都包含了一部分顶点以及以其为起点的边 |
1 | 在理想的情况下(不发生任何错误),一个Pregel用户程序的执行过程如下: |
容错性
1 | • Pregel采用检查点机制来实现容错。在每个超步的开始,Master会通知所有的Worker把自己管辖的分区的状态(包括顶点值、边值以及接收到的消息),写入到持久化存储设备 |
Worker
1 | 在一个Worker中,它所管辖的分区的状态信息是保存在内存中的。分区中的顶点的状态信息包括: |
1 | •在Pregel中,为了获得更好的性能,“标志位”和输入消息 |
Master
1 | •Master主要负责协调各个Worker执行任务,每个Worker会借助于名称服务系统定位到Master的位置,并向Master发送自己的注册信息,Master会为每个Worker分配一个唯一的ID |
1 | •Master在内部运行了一个HTTP服务器来显示图计算过程的各种信息 |
Aggregator
1 | • 每个用户自定义的Aggregator都会采用聚合函数对一个值集合进行聚合计算得到一个全局值 |
Pregel的应用实例
单源最短路径

1 | class ShortestPathVertex |
1 | 1 class ShortestPathVertex |



1 | 超步1: |
二分匹配
1 | 程序的执行过程是由四个阶段组成的多个循环组成的,当程序执行到超步S时,S mod 4就可以得到当前超步处于循环的哪个阶段。每个循环的四个阶段如下: |
Pregel和MapReduce实现PageRank算法的对比
PageRank算法
1 | • PageRank是一个函数,它为网络中每个网页赋一个权值。通过该权值来判断该网页的重要性 |

1 | • 对于任意一个网页链接,其PR值为链入到该链接的源链接的PR值对该链接的贡献和,其中,N表示该网络中所有网页的数量,Ni为第i个源链接的链出度,PRi表示第i个源链接的PR值 |
1 | • 网络链接之间的关系可以用一个连通图来表示,下图就是四个网页(A,B,C,D)互相链入链出组成的连通图,从中可以看出,网页A中包含指向网页B、C和D的外链,网页B和D是网页A的源链接 |

PageRank算法在Pregel中的实现
1 | • 在Pregel计算模型中,图中的每个顶点会对应一个计算单元,每个计算单元包含三个成员变量: |
1 | class PageRankVertex: public Vertex<double, void, double> { |
1 | • PageRankVertex继承自Vertex类,顶点值类型是double,用来保存PageRank中间值,消息类型也是double,用来传输PageRank值,边的value类型是void,因为不需要存储任何信息 |
PageRank算法在MapReduce中的实现
1 | • MapReduce也是谷歌公司提出的一种计算模型,它是为全量计算而设计 |
阶段1:解析网页
1 | • 该阶段的任务就是分析一个页面的链接数并赋初值。 |
阶段2:PageRank分配
1 | • 该阶段的任务就是多次迭代计算页面的PageRank值。 |
