图计算系统发展简史
Posted fmablogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图计算系统发展简史相关的知识,希望对你有一定的参考价值。
本文是一系列文章的第二篇,将介绍图计算系统领域的开山之作Pregel和各类衍生的开源系统,以及GraphLab团队的一系列工作。
Pregel
图计算在Google内部有很多应用场景,一个最经典的例子是PageRank——Google最早用来对网页进行排序的算法。而Google在2008年时就已经索引了超过一万亿的网页[1]!尽管使用MapReduce能够处理非常大规模的数据,然而日益增长的网页数量对图计算能力提出了越来越高的要求。在这种状况下,Pregel诞生了。
[1] Official Google Blog: We knew the web was big... https://googleblog.blogspot.com/2008/07/we-knew-web-was-big.html
Pregel提出了以顶点为中心(vertex-centric)的图计算编程模型,将算法的每一轮迭代抽象为从单个顶点的角度考虑需要完成的计算过程,即用户自定义的顶点程序(vertex programs)。每个顶点有两种状态:活跃和非活跃;每轮迭代中只有活跃顶点需要参与计算。Pregel使用消息传递(message passing)模型在顶点之间通信:用户可以在顶点程序中让一个顶点向其它顶点(通常是邻居)发送消息;根据收到的消息,顶点可以更新自己的状态以及计算相关的数据。以顶点为中心的程序抽象使得Pregel可以非常容易地以顶点为基本处理单元,使用BSP(Bulk Synchronous Parallel)模型并行/分布式处理,将图计算从单线程扩展到多核进而多机上。
与MapReduce相比,Pregel不仅提供了面向图的编程模型,更重要的是针对图算法通常需要迭代式计算的特点,避免了需要反复将中间结果序列化到磁盘的不必要开销[2]。
[2] 出于容错考虑,有时依然需要在迭代开始前将中间结果保存到磁盘上。然而,我们可以根据集群的实际情况,每隔若干轮进行一次保存,或是根据算法的特点,仅保存一部分关键信息(其它信息可能是只读的,或是可以通过这些进行恢复)。
Apache基金会下的Hama和Giraph是两个较为知名的提供了Pregel接口的开源图计算系统。Hama提供了更底层的BSP编程接口,并在此之上构建了面向图计算和深度学习两类场景的API;Giraph则扩展了Pregel的处理模型,增加了诸如主进程计算(master computation)、共享累加器(shared aggregators)等功能以提供更丰富的程序表达能力。除此之外,斯坦福大学InfoLab的GPS、阿卜杜拉国王科技大学InfoCloud的Mizan、香港中文大学计算机科学与工程系的Pregel+、上海交通大学IPADS研究所的Cyclops等等也都沿用了Pregel的图计算模型,并在多个维度如数据划分、负载均衡、通信方式等进行了优化。
GraphLab
GraphLab是最早由卡耐基梅隆大学SELECT实验室于Pregel同时期推出的图计算系统。与Pregel的动机或者说目标不同,GraphLab主要面向机器学习/数据挖掘问题:针对很多这类算法需要在稀疏数据上进行迭代式计算的特点,GraphLab把输入/输出数据以图的形式进行表示,并将算法抽象为图上的计算过程。因此,尽管都采用了以顶点为中心的图计算模型,GraphLab在一些设计决策上与Pregel有较大的不同:GraphLab中的通信发生在各个顶点不同副本间的状态同步,而非Pregel中的消息传递;GraphLab主要采用异步的计算模式,通过多种级别的一致性来保证算法的收敛效率,而Pregel是典型的同步计算模式。
PowerGraph
针对实际图数据具有幂律分布的特点,以及异步引入的开销导致性能不够理想的问题,GraphLab团队此后又推出了2.x版本,并将其命名为PowerGraph。PowerGraph的突出贡献是提出了基于顶点分割(vertex-cut)[3]思想的图数据划分方法,并将顶点程序分成了三个步骤——收集信息(Gather)-更新状态(Apply)-分发信息(Scatter)(又称GAS模型),能够更好地应对实际图数据容易导致的计算/通信不均衡。
[3] 传统的图划分方法以顶点为划分单元,顶点和所属的边放在一起;顶点分割则以边为划分单元,一个顶点的边可以归属到不同的分区(partition)。显然,后者的粒度更细,更容易解决负载均衡方面的问题;对应的一个劣势是顶点的状态需要在不同分区上进行复制(replication),占用的内存空间相对更大。
GraphChi
与PowerGraph一起推出的还有另一个来自GraphLab团队的工作,GraphChi——第一个实现将大规模图数据处理搬到普通PC上的系统。GraphChi的编程模型与GraphLab类似,并同样采用了异步的计算模式。其主要原理是通过巧妙的图数据划分和组织,配合其提出的PSW(Parallel Sliding Windows)处理模型,尽可能地减少随机I/O访问(即尽量让I/O访问都是大块的读/写)。GraphChi能处理规模远超内存容量的图数据,且性能甚至可以与一些分布式解决方案相提并论[4]。
[4] 这里的一些解决方案是基于Hadoop/Spark的,一些则是上面提到过的分布式图计算系统(很显然,单机系统的计算能力如果与分布式系统相当是一件很可疑的事情……我们将在未来的文章里回顾这一点)。
GraphLab团队于2013年成立了同名公司GraphLab Inc.,并发布了数据分析框架GraphLab Create,其底层核心融合了列式存储和图存储模型,能够分析远超内存容量的大规模数据,同时支持分布式的扩展;GraphLab Inc.在2015年获得了1850万美元的融资,并改名为Dato;2016年发布了GraphLab Create 2.0并改名为Turi,后被苹果公司以2亿美元的估值收购。
下篇预告
在Pregel/GraphLab/PowerGraph/GraphChi这些先驱性工作出现后,图计算系统领域进入了一段快速发展时期。本系列的下一篇文章将使用四象限分类法向大家介绍这段时期内的一些代表性系统。
以上是关于图计算系统发展简史的主要内容,如果未能解决你的问题,请参考以下文章