图处理系统综述

1.BackGround

        现有的图数据可以分为以下三个方面。分别是社交媒体图,广告图和Web图。社交媒体图主要包括微博、Twitter、FaceBook。人与人之间的关系也是一种图结构,微博点赞也是一种图结构。然后就是广告图以及Web图结构。


        随着时间的推移,图结构数据成几何的指数增长,目前的图结构已经达到TB级别的数据量。这么大的数据量,如何对这么巨大的图数据进行高效的处理成为一个巨大的挑战。


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

        大规模图数据的特征:

  1.         数据:大规模图数据普遍存在的问题就是:数据量规模大(亿级图)
  2.         幂律图:顶点的度数分配不均匀。高度顶点较多,低度顶点较少

     图计算中主要的系统有OSDI'12 PowerGraph、OSDI'12 GraphChi、OSDI'14 GraphX、PPOPP'15 Polymer、OSDI'16 Gemin等等。

2. 图处理系统


        图处理系统最初是并行单机图处理系统,随着图数据规模的不断增加。图处理系统引出了这四个维度进行图计算加速,第一个维度就是分布式图处理系统:利用集群资源对图计算进行并行加速,这个维度图处理系统最大的瓶颈就是网络通信。第二个维度就是核外图处理系统:利用外部存储磁盘和内存进行不断地交互,解决内存装不下整个图数据的问题。这个维度的图处理系统最大的瓶颈问题就是磁盘空间大小。第三个维度就是NUMA-aware架构的图处理系统:利用新型NUMA架构加速图计算的过程,每个NUMA 节点都有自己的核以及内存。这个维度图处理系统最大的问题就是图很难被分区。最后一个维度就是新型硬件加速的图处理系统:利用新型硬件加速图处理的过程,这个新型硬件可以有GPU加速、RDMA加速、PIM 指令集卸载。下面我们重点介绍分布式图处理系统。

3.分布式图处理系统


        笔者认为分布式图处理系统主要可以分为以下三个方面。第一是基于MapReduce的大图处理系统,利用MapReduce任务加速图计算,最典型的就是GraphX。第二个就是基于Message Passing(消息通信)的大图处理系统,其中最典型的就是Pregel 基于BSP的大图处理系统,比如Pregelix和Pregel。第三个就是基于Shared Memory(共享内存)的大图处理系统。其中包括PowerGraph和PowerLyra以及PowerSwitch 之前的文章中提到过。

4. Out of Core图处理系统

        此类图计算系统单机运行,但是将存储层次由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命中率。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值