大规模图计算系统综述

1.引言

        简单的说图计算就是研究在大规模图数据下,如何高效计算,存储和管理图数据等相关问题的领域。显然研究对象是大规模的图数据(Large-scale Graph-Structured Data),那么在我们的生活中有哪些比较常见的图数据呢?它们都有哪些具体的应用场景?图数据都有哪些特点?在进行图计算时都有哪些挑战?

        哲学上说事物之间普遍存在联系,通常来说可以将事物看作图的顶点,事物间的联系看作图的边。对应于学术界的文献来说,每篇论文可以看作顶点,文献之间的引用关系可以看作边。对应于互联网来说,web页面可以看作顶点,页面之间的超链接关系可以看作边。对应于社交网络来说用户可以看作顶点,用户之间建立的关系可以看作边,关系的类别可以看作权重。对应于大型电商来说,用户和商品可以看作顶点(二部图),它们之间的购买关系可以看作边,购买次数可以看作权重。则抽象出来的图数据就构成了研究和商用的基础,可以探究很多有趣的问题如:“权威节点(中心)”,“小圈子”,“世界上任意两个人之间的人脉距离”,“消息是如何传播的”等。而将这些有意思的现象用到商业领域,则底层的运算常常是图相关的算法。例如图的最短路径算法可以做好友推荐,计算关系紧密程度;最小连通图可以识别洗钱或虚假交易;Key person可以找到意见领袖,防止客户流失的群体效应;对图做PageRank可以做传播影响力分析,找出问题的中心,做搜索引擎的网页排名。

图1.1 图计算应用场景

        目前广泛应用的大数据处理框架比如MapReduce和Spark,它们主要作用是大规模数据分析,以批处理计算为主,其实时性需求得不到满足。在大数据应用场景下,数据价值会随着时间的流逝而衰减,因此期望能够尽快对最新的数据做出分析并给出结果,并实时展示,以达到实时计算(Real Time Computing)。

        图是一种重要的数据结构,它能充分表达自然界中事物的联系和依赖属性,所以在计算机领域中广泛应用。很多问题能在图论[1]支撑下借助图相关的算法得到高效解决,例如图形着色,网络路由,网络流等。但是,近年来随着Web2.0、大数据、社交网络、机器学习和数据挖掘(MLDM - MachineLearningand Data Mining)等技术的高速发展,很多领域抽象出来的图规模呈指数级增长。图中边的数量可达到亿万级别,另外再加上自然图往往表现出非常倾斜的幂律分布power-law[2]特性,对图计算带来了巨大挑战。

        研究图计算高效处理大规模图数据,能推动社交网络分析、语义web分析、生物信息网络分析、自然语言处理和MLDM等新兴应用领域的发展。此外图计算的应用领域还包括:流量图,用来监控和应对道路事故,分析网络安全,网页搜索[3];生物图,进行研究药物模型(例如蛋白质相互作用),预测疾病爆发;社交图,对舆情分析,推荐人或产品和信息流跟踪等。

        现有的图处理系统可以通过是否是单机还是集群、是否运行在内存还是磁盘与内存交换,可以将图处理系统分为单机内存图处理系统、单机核外图处理系统、分布式内存图处理系统、分布式核外图处理系统。单机内存图处理系统就是图处理系统运行在单机环境,并且将图数据全部缓冲到内存当中。单机核外图处理系统就是图处理系统运行在单机环境,并且通过计算将图数据通过不断的与内存和磁盘进行交互进行高效的图算法。分布式内存系统就是图处理系统运行在分布式集群环境,并且所有的图数据加载到内存当中。分布式核外图计算系统将Single-machine out-of-core systems拓展为集群,能够处理边数量级为trillion的图。

        随着移动互联网技术、5G网络、传感器、物联网技术的发展,世界上每时每刻都产生的大量的数据。随着数据量的不断增加,单机模式下的图计算已经不适合目前数据的增长。然而在分布式图计算中,存在的很高的网络通信的开销。随着目前通信技术的发展,RDMA技术得到了快速发展。RDMA有着高吞吐量、低延迟、极低的CPU利用率的特性,正好可以解决分布式图计算在不同机器之间的网络通信的问题。由于RDMA可以通过RDMA特定的网卡封装数据包,相比较传统的TPC/IP通信,它可以降低操作系统封装TPC/IP数据包,可以腾出多余的时间让CPU去做更多的图算法的事情。所以通过RDMA通信可以大大提高分布式图计算中的网络传输速度和CPU封装TPC/IP数据包的开销,从而提高分布式图处理系统的性能。

2.图计算相关知识

2.1图的定义

        图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V, E)。其中G表示一个图,V是图G中顶点的集合Vertices,E是图G中边的集合Edges。 根据E是否有方向,图可以分为有向图和无向图。事实上无向图是有向图的特例,在图计算中我们通常统一表示为有向边edge = (源顶点source, 目的顶点target)。

        根据E是否有权重,图可以分为权重图(网)和非权重图。则图的每个顶点v和每条边e都有关联的值,顶点和边的值都可以被修改。


图2.1 图(Graph)的基本结构

        图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V, E)。其中G表示一个图,V是图G中顶点的集合Vertices,E是图G中边的集合Edges。

       根据E是否有方向,图可以分为有向图和无向图。事实上无向图是有向图的特例,在图计算中我们通常统一表示为有向边edge = (源顶点source, 目的顶点target)。根据E是否有权重,图可以分为权重图(网)和非权重图。则图的每个顶点v和每条边e都有关联的值,顶点和边的值都可以被修改。

2.2 图的存储

        图之所以复杂在于每个顶点的逻辑位置都是相对的,顶点之间的关联依赖也是不确定的,所以无法以数据元素在内存中的物理位置来表示元素之间的关系,即无法用简单的顺序存储结构来表示。那么将图的顶点和边分别使用两种结构来存储表示则相对容易。

       图的邻接矩阵(Adjacency Matrix)是一种常见的图存储结构,它将n个顶点存储在一维数组中,用n*n的矩阵来表示任意两点之间的关系。则主对角线全是无用空间,顶点的行向与列向边的数量之和分别表示它的出度和入度。显然对于边数量相对于顶点较小的图会极大的浪费存储空间。

图2.2 图(Graph)的邻接矩阵存储方式

       邻接表(Adjacency List)用一个线性表存储顶点,与之邻接的顶点会另外构成一个线性表,由于邻接点的数量不确定,故常使用链表存储。还有很多变形的存储结构,例如逆邻接表,十字链表,邻接多重表它们本质上没有太大区别,在此就不在详细举例。


图2.3 图(Graph)的邻接表存储方式

        另外一种常见的图存储结构是边集数组,它由一个存储顶点信息的顶点数组和一个存储边信息的边数组构成,并且边数组中每个元素表示着一条边的源顶点索引,目的顶点索引和权重。可以看出用这种存储结构表示图非常简洁而且灵活,简单从来是艺术的最高境界。它的类似或变形存储结构,在Out-of-core图计算系统中比较常见,因为无论是存储在内存(Cache/Memory)中还是外存(SSD/Disk)中都方便读写和构造。

图2.4 图(Graph)的边集数组存储方式

以上所说的都是将图存储构造于内存中,但是受限于内存资源和图的规模,在图计算领域中经常面对无法将整个图存储在内存中的情况。如何在有限的内存空间中完成图相关的算法也是图计算研究的重点之一,在图计算中如何将一个大规模的图分割成若干子图更是件非常有考究的工作。

2.3 图的遍历与常用算法

        我们都知道数据的存储结构和算法效率紧密关联。而在图计算领域中图的存储已经发生了很大变化,这里就不详细介绍算法实现,只是简略提及。

       对于树和图,遍历算法都是其它算法的基础。从图中某一顶点出发访遍图中其余顶点,且每个顶点仅被访问一次,这一过程就叫做图的遍历。由于图顶点间关联的复杂性,在图遍历时一般会设置一个访问数组作为是否被访问过的标记。深度优先遍历(搜索)算法DFS是一个递归的过程类似于树的前序遍历,一般辅以栈可实现非递归。广度优先遍历(搜索)算法BFS类似于树的层遍历,一般辅以队列可实现。

       此外图的最小生成树在生活中常代表着最低的成本或最小的代价,常用普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法。最短路径,拓扑排序,关键路径也都有对应的算法。而在图计算领域中我们常见的算法有PageRank,BFS,MIS,SpMV,WCC,ALS,SGD等。

3. 图计算框架简介

3.1单机内存图处理系统

        此类图计算系统单机运行,可直接将图完全加载到内存中进行计算。但是单机的计算能力和内存空间总是有限,故只能解决较小规模的图计算问题,比较有代表性的系统有2013年发布的Ligra[8]和Galois[9],以及2015年发布的GraphMat[10]和Polymer[11]。

        其中Ligra提出了根据图形稠密情况自适应的切换计算模式,并提供了一种基于边映射,顶点映射以及顶点集映射的并行编程算法。Galois使用DSLs(domain-specific languages)写出更复杂的算法完成图分析工作,并发现当输入图是道路网络或者具有较大直径的图时能获得一个数量级的性能提升,在现有的三种图DSLs基础上提供了轻量级的API,简化了图算法的实现。GraphMat是第一个对多核CPU进行优化的以顶点为编程中心的轻量级图计算框架,为用户和开发者提供了个友好的接口。Polymer则是针对在NUMA特性的计算机结构上运行图算法的优化,作者发现无论是随机或者交错地分配图数据都会重大的束缚数据的本地性和并行性,无论是intra-node还是 inter-node,顺序访存都比随机访存的带宽高的多。

3.2 单机核外图处理系统

        此类图计算系统单机运行,但是将存储层次由RAM拓展到外部存储器如SSD,Flash,SAS,HDD等,使其所能处理的图规模增大。但受限于单机计算能力和核外存储系统的数据交换的带宽限制也无法在可接受的情形下处理超大规模的图数据。典型的图计算系统有 GraphChi[12], TurboGraph[13], X-Stream[14], PathGraph[15],GridGraph[16]和FlashGraph[17]。

        这些系统在最大化磁盘顺序读写,选择调度和同异步计算模式等方面做出了重要探索。TurboGraph和FlashGraph主要采用分页方式分割图来提高内外存的数据交换性能。其中GraphChi采用了传统的以顶点为中心的编程模型,计算模式为隐式GAS。它使用了名为shard的核外数据结构来存储边,而将顶点划分为多个连续的区间。提出了一种基于并行滑动窗口(PSW)模型达到对存储在磁盘上的图数据最大的顺序读写性能。但是构建shard是需要对边按源顶点排序,这样耗费了大量的预处理时间,PWS对计算密集型的算法更有利。另外在构建子图时出现大量的随机访存现象,通过顺序地更新子图内有共享边顶点来避免数据争用问题。

        X-Stream则介绍了一种以边为中心的编程模型。在scatter阶段以流的形式处理每条边和产生传播顶点状态更新集,在gather阶段它以流的形式处理每一个更新并应用到对应的顶点上。自然图中顶点集远远大于边集,所以X-Stream把顶点存储在高速存储设备(Cache对于RAM,RAM对于SSD/Disk)中表现为随机读写,把边集和更新集存于低速存储设备中表现为最大程度的顺序读写。X-Stream流式访问图数据,其流划分相比于GraphChi无需对shard内的边进行排序大大缩短了预处理时间,并使用work-stealing避免Scatter-Gather导致的线程间负载不均衡的问题。但是X-Stream在计算过程中,每轮迭代产生的更新集非常庞大,接近于边的数量级;而且需要对更新集中的边进行shuffle操作;缺乏选择调度机制,产生了大量的无用计算。

        GridGraph将顶点划分为P个顶点数量相等的chunk,将边放置在以P*P的网格中的每一个block中,边源顶点所在的chunk决定其在网格中的行,边目的顶点所在的chunk决定其在网格中的列。它对Cache/RAM/Disk进行了两层级的网格划分,采用了Stream vertices andedges的图编程模型。计算过程中的双滑动窗口(DualSliding Windows)大大减少了I/O开销,特别是写开销。以block为单位进行选择调度,使用原子操作对保证线程安全的方式更新顶点,消除了X-Stream的更新集和shuffle阶段。其折线式的边block遍历策略不能达到最大化的Cache/Memory命中率。

3.3 分布式内存图处理系统

        此类图计算系统将图数据全部加载到集群中的内存中计算,理论上随着集群规模的增大其计算性能和内存容量都线性增大,能处理的图数据也按线性扩大。图分割的挑战在分布式系统愈加明显,再加上集群网络总带宽的限制,所以整体性能和所能处理的图规模也存在一定的缺陷。这类图计算系统主要包括同步计算模型的Pregel及其开源实现Piccolo[18],同时支持同步和异步的系统PowerGraph[19],GraphLab[20]和GraphX[21]。PowerSwitch[22]和PowerLyra[23]则对PowerGraph做了改进, Gemini[24]则借鉴了单机内存系统的特性提出了以计算为核心的图计算系统。

        Pregel是首个采用Vailiat的BSP计算模型[26]的分布式内存图计算系统,计算由一系列的“超步”组成,在一个超步内并行地执行用户自定义函数。Pregel在编程模型上遵循以图顶点为中心的模式,在超级步S中会汇总从超级步S-1中传递过来的消息,改变顶点自身的状态,并向其它顶点发送消息,这些消息经过同步后会在超级步S+1中被其它顶点接受并处理。允许通过增加/删除点和边改变图的拓扑结构,在对同步消息进行了聚合优化。但是有些算法在BSP同步模型下收敛性很差,采用随机hash切边法带来了巨大的网络通信开销。

        GraphLab主要是针对MLDM应用开发的图计算系统,故先详细分析了MLDM算法的特性,并对图计算中数据一致性模型做了详细阐述。PowerGraph针对power-low特性的自然图详细分析工作负载,图分割,通信,存储和计算等各方面带来的挑战。提供了完善的图分割数学理论支撑,证明切点法比切边法能提高一个数量级的图计算性能。故PowerGraph使用p-way切点法,采用了以顶点为中心的GAS编程模型,增加了细粒度并发性同时支持同步和异步模型。但它不支持图的动态修改,容错机制未能充分利用顶点副本。

        PowerLyra和PowerSwitch分别从图分割和同异步模型两方面对PowerGraph进行了改进。PowerLyra提出了一种混合图分割方法hybrid-cut,即出入度高的顶点采用切点法反之出入度低的顶点采用切边法,经过试验对比性能提高了至少1.24倍。PowerSwitch首先分析了同步和异步计算模型在网络通信和算法收敛速度的特征后提出了一种混合图计算模型Hsync,通过一系列的运行时分析和定量计算可动态的切换计算模式,相比于PowerSwitch有一定的性能提升。

        Gemini在单机内存图计算系统的高效性和分布式内存图计算系统良好的伸缩性之间找到差异性,而提出的以计算为中心的图计算系统。它针对图结构的稀疏或稠密情况使用于与Ligra相同的自适应push/pull方式的计算,并在现代NUMA-aware特性的内存中采用基于chunk的图划分进行更细粒度的负载均衡调节。实验表明Gemini的性能得到重大提升了,其性能至少能达到现有已知分布式图处理系统的8.91倍。可见在单机上从内存结构和CPU架构等更细层面提高图计算的能力对整体集群的图数据处理性能的改善也很显著。

3.4  分布式核外图处理系统

        此类图计算系统将Single-machine out-of-core systems拓展为集群,能够处理边数量级为trillion的图,目前仅有2015年发布的Chaos[25]。Chaos是对X-Stream系统的拓展,分别设计了计算子系统和存储子系统。它的主要贡献表现在:是第一个拓展到多机核外存储结构的图计算系统;采用简单的图分割方案,即不强调数据的本地性和负载均衡,而是通过存储子系统达到核外存储的高效顺序读写;使用work-stealing[26]机制实现动态负载均衡。

       但是Chaos存在设计缺陷,随着集群规模的伸缩网络将会成为系统瓶颈;简单的拓展未优化的X-Stream,其更新集依然很庞大与边量级相当;计算与存储独立设计增加了系统的复杂性和不可避免的通信开销;存储子系统为了使存储设备时刻忙碌而占用了较多的计算资源。

4.总结

        本文主要介绍了图计算的相关知识,从图的定义、图的存储、图的遍历与常用算法主要说明了图计算的基本知识。从这些知识中,读者大概能够知道什么是图计算以及图计算的基本算法和定义。近年来,图数据的规模快速增长,以社交网络为代表的诸多应用中都需要处理10亿顶点以上的“超大图数据”,因此可扩展的分布式图处理计算成为了热点的研究问题。由于图数据的复杂性和图数据规模不断增加,简单的图算法不能满足目前图计算的需求。所以目前存在这四种图计算系统:单机内存图处理系统、单机核外图处理系统、分布式内存图处理系统、分布式核外图处理系统。本文对于这四种系统进行了详细的介绍和分别举例一些典型的图处理系统。

猜你喜欢

转载自blog.csdn.net/qq_21125183/article/details/80671547
今日推荐