摘要
随着大数据时代的发展,挖掘数据之间的关联性成为了必然的发展趋势,而图结构相比于其他数据结构更强调数据之间的关系,于是图数据管理成为了学者们关注的焦点。而现实应用中,图数据往往是极为庞大的,如社会关系图、网页结构图等,这就对图数据的分布式存储与计算提出了挑战。本文对图数据的划分与存储、遍历与计算做了一些调查与整理,从这几个角度去了解图数据管理中的一些原理与处理方式。
背景
大数据的兴起受到了许多关注,因为大数据将会对改变人类生活方式起到重要作用,但是,目前我们对于大数据的研究往往还是停留在庞大的数据量上,而大数据真正的价值在于数据之间非常高的相关性,这也正是数据挖掘和分析所要探讨的意义。图数据管理研究的关键点是如何设计有效的索引结构和查询算法来快速地回答图数据中结构查询问题。图数据挖掘相比于关系数据库的挖掘更强调的是发现与分析数据之间的关联关系。

如图1.1所示,传统的关系型数据库处理的是量较小、关联性较弱的数据,其他主流的非关系型数据库关注的是如何存储大量数据,但是往往不擅长处理数据之间的复杂关系,比如HBase由于分布式架构,对于大量连接操作会力不从心。随着社交、电商、金融、物联网等行业的快速发展,现代社会的各个事务间织成了一张张庞大而复杂的关系网络。大数据行业需要处理的数据之间的关联性随数据量呈几何级数增长,而关系数据库很难处理这些关系的运算。
现实应用中,很多关系本身就是图的数据结构,如最优运输路线问题、科技文献的引用关系、社交网络分析等。而这种结构无论是关系数据库还是文档型、列型的非关系数据库,都难以进行表示的.所以直接以图的结构存储数据成为了一种很自然的需求,大图数据的存储与计算成为来必然要研究的课题。
图数据管理简介
如何管理图数据,即如何表示图数据、存储图数据、并在图数据上执行计算统计等任务。现今在大数据时代,数据规模呈爆炸式增长,所以一般采用分布式构架进行存储,那么就是涉及到如何将图数据进行划分存储到不同节点上,划分之后又如何遍历图、如何在节点之间进行通信,节点出现故障了怎么办等问题。
图数据的表示
简单图模型
简单图是相对于超图而言的,也就是一条边只能连接两个顶点,可以存在环路。可以表示为
G
=
(
V
,
E
)
G=(V,E)
G=(V,E),
V
=
[
v
1
,
v
2
,
.
.
.
,
v
n
]
V=[v_1, v_2,...,v_n]
V=[v1,v2,...,vn],
E
=
[
e
1
,
e
2
,
.
.
.
,
e
n
]
=
[
(
v
1
,
v
2
)
,
(
v
3
,
v
4
)
,
.
.
.
(
v
n
−
1
,
v
n
)
]
E = [e_1,e_2,...,e_n] = [(v_1,v_2),(v_3,v_4),...(v_{n-1},v_n)]
E=[e1,e2,...,en]=[(v1,v2),(v3,v4),...(vn−1,vn)]
简单图的存储与应用都比较容易,且表达能力足以处理图数据中的基本算法。简单图的常用存储结构包括邻接矩阵、邻接表、十字链表、邻接多重表等。
超图模型
超图中的边称为超边。一条边可以连接任意多个顶点,所以超土适用性更强,保留的信息更多。例如,以图顶点表示文章,边表示连接的两个顶点有同一作者。假设现有3片文章v1(作者A、B), v2(作者A、C), v3(作者A、D)。如图2.1所示,如果使用简单图来表示(左图),则无法直接保留作者A同时是3篇文章的作者这一信息。而在超图中(右图),通过一条超边将三个顶点进行连接,保留了A同时是3篇文章作者的这一信息。对于具有复杂联系的应用,可以使用超图模型以保留更多信息。

超图模型的存储方式主要使用关系矩阵,与邻接矩阵相似。关系矩阵的行和列分别是顶点编号和超边编号。矩阵中的元素以0、1表示,如果为1,则表示超边连接了对应顶点。
属性图
属性图中不仅有节点和关系,还有属性、标签。如图2.2所示。

节点是主要的数据元素,可以理解为关系数据库中的一个元祖。节点可以有多个属性,可以理解为关系数据库中的属性。节点可以有多个标签,用于描述其在图表中的含义或作用。节点可以通过关系连接到其他节点。
关系是连接两个节点的边,关系是有方向性的。关系可以有多个属性。节点你可以有多个甚至递归的关系。
属性存储为键值对,键为字符串。属性可以被索引和约束,也可以从多个属性创建复合索引。
标签用于将节点分组,一个节点可以有多个标签,比如电影、导演、演员的关系表中,可以有节点既是导演,又是演员。对标签进行索引可以加速在图中的查找。拥有相同标签的节点可以拥有不同的属性,与文档型数据库一样便于扩展。
资源描述框架图(RDF Graphs)
RDF图数据模型含有节点和边。
节点对应图中的定点,可以是具有唯一标识符的资源,也可以是字符串、整数等有值的内容。
边是节点之间的定向链接,也称为谓词或属性。边的入节点称为主语,出节点称为宾语,由一条边连接的两个节点形成一个主语-谓语-宾语的表示,也称为三元组。边是定向的,他们可以在任何方向上导航和查询。
RDF全称为Resource Description Framework,也就是说在RDF图中,一切都是源。边和节点都是源,本质上没有区别,只是扮演的角色不同,因此一条语句的边也可以是另一条语句中的节点。将属性图转为RDF图基本就是将属性图中的标签和属性改为节点。RDF图相较于属性图能够更加丰富。
大规模图数据管理面临的挑战
图数据及其分布式并行处理往往设计很多复杂的处理过程,需要大量的迭代和数据通信,针对联机事务处理和传统数据库中的一些技术很难应用在图数据的处理中,所以需要研究新的用于大图计算的系统。大规模图数据的分布式处理主要面临以下挑战。
图数据的强耦合性和动态性
图顶点之间有边,也就是有关联性,通过边传递信息从而更新顶点信息,而经过并行处理后,就会在运算过程中产生很多消息通信上的开销。另外,真实应用中数据往往会随着时间动态变化,数据会不断增加、存在的联系会发生更新或者被删除。所以我们需要处理的不是静态的图数据,而是不断扩展不断变化的动态图。
图查询处理的复杂迭代性
图算法通常采用递归调用的方式,相邻迭代之间会产生大量中间结果,导致消息通信和磁盘操作代价高昂。而不断地迭代也会放大水桶效应,使得表现最差的任务大大拖累整个系统的性能。在磁盘驻留环境下,这种高频迭代导致的反复I/O和通信,将会极大影响查询和分析的效率。因此,需要针对迭代进行优化,找到减少迭代、加快收敛的计算方式和消息通信机制。另外,不同的迭代任务在不同的迭代周期的计算和消息负载都不同,所以要有效地监控迭代中的变化,并针对性地调整本地计算和数据交互的策略。
图计算任务的可调可控性
对于大规模图数据的处理,一般需要较长时间来完成,其间需要大量时间和计算资源,系统的可用性和可靠性成为关键问题。这要求计算环境有弹性的资源管理机制和高效的容错控制机制。此外,针对高复杂度的计算任务,如何对数据进行压缩,以及算法何时中止迭代等算法都具有重要意义的,且面临着巨大挑战。
大图数据管理原理
基本图算法
PageRank
这是Google早期提出的链接分析算法,用来计算网站的重要性,将其与标题标识、关键词标识融合后得到搜索引擎中网站的排名,从而提高搜索结果的相关性。PageRank对网站进行评级,级别从0到10级,10级为最高级。得到的PR越高,表示这个网站越受欢迎。一般PR达到4,就是一个不错的网站了。
PageRank算法认为,一个网站的重要性取决于指向它的网页的数量与质量。PageRank是一个迭代算法 ,初始状态下,先赋予每个网页相同的重要性,然后通过算法迭代不断更新每个网页的重要性,直到最后收敛。在每一轮迭代中,对于网页A,会计算所有指向A的链接,即入链,不是单纯计算数量,而是计算权重。假设网页B指向网页A,那么B给A的分数为PR(B) / L(B),其中L(B)表示B的出链数,最后这一轮A的得分就是所有指向A的网页给A的分数的和。
由于网页的结构就是图的结构,所以在Google取得空前成就后,该算法得到了图中的广泛应用。
SimRank
SimRank 是一种基于图的拓扑结构信息来衡量任意两个对象间相似程度的模型。Simrank的基本思想是:如果两个实体相似,那么跟它们相关的实体应该也相似,也就是说,图中如果与顶点a相邻的顶点和与顶点b相邻的顶点相似,那么认为a和b也是相似的。SimRank的基本公式:
s
(
a
,
b
)
=
C
∣
l
(
a
)
∣
∣
l
(
b
)
∣
∑
i
=
1
∣
l
(
a
)
∣
∑
j
=
1
∣
l
(
b
)
∣
s
(
)
l
i
(
a
)
,
l
j
(
b
)
s(a,b) = \frac{C}{|l(a)| |l(b)|}\sum_{i=1}^{|l(a)|}{\sum_{j=1}^{|l(b)|}{s()l_i(a),l_j(b)}}
s(a,b)=∣l(a)∣∣l(b)∣Ci=1∑∣l(a)∣j=1∑∣l(b)∣s()li(a),lj(b)
其中,表示s(a,b)顶点a和顶点b的相似度,当a=b时,s(a,b)=1。l(a)表示指向a的边的源顶点。当l(a)为空或l(b)为空时,s(a,b)=0。公式的含义就是顶点a和顶点b的相似度等于所有指向a的边的源顶点和所有指向b的边的源顶点的相似度的平均值。参数C是个阻尼系数,如果l(a)=l(b)={A},那么s(a,b) = C*s(A,A)=C,所以C属于{0,1}。将公式中的I改为O也是成立的,即a与b为源顶点。
图的遍历模式
以顶点为中心
即以顶点为粒度执行消息收发、顶点值的更新等操作。这种模式最简单易用,目前大部分主流分布式图计算系统如Pregel、Giraph、Hama、Spark等都是采用这种计算方式。该模式下,可以自然使用很多图论中的算法,如PageRank、最短路径计算等。并且,图算法大多会在迭代中逐渐收敛,所以已经收敛的顶点就不需要再访问了,在Pregel等系统中会给每个顶点设置一个标志位,如果处于激活状态,则表示该顶点需要继续更新,否则可以被跳过。
以子图为中心
这种模式将图数据划分为若干partition/block,每个partition/block视为一个子图。在迭代计算的过程中,先计算同一个子图内的顶点,然后子图之间进行消息交换,这样就可以减少迭代次数和通信开销。Giraph++、Blogel等较新的系统中使用这种计算方式。
但是该模式大大增加了本地节点内部冗余信息发送的概率,从而增加了本地处理的开销。虽然相比以顶点为中心在跨节点消息和同步方面进行了优化,但是并不能取代以顶点为中心的处理方式,具体使用还要依图数据的特点而定。
以边和路径为中心
在以顶点为中心的模式中,会引入对出边数据的随机访问,在磁盘环境下,可能引入昂贵的I/O开销。有的系统将出边按目的顶点的存储顺序进行排序,避免随机磁盘,但会引入大量的预处理。
X-Stream系统中采用以边为中心的计算方式。在迭代计算中,先顺序扫描出边,获取对应的源顶点值及其标志位,如果处于激活状态,则产生并顺序存储消息数据,否则跳过;然后顺序扫描消息数据,更新对应的源顶点的值。该模式下,可以保证边数据和消息数据顺序存取且不需要额外预处理。但是引入了对源顶点的随机访问,且非激活顶点也无法避免扫描出边的操作。对于源顶点的随机访问,X-Stream系统对顶点数据进行分块操作,并逐一加载到内存,降低随机存取开销。
PathGraph系统中采用以路径为中心的计算方式,将图数据划分为基于树的若干分区,强调了图的连通性,提高了图遍历过程中的数据加载的局部性。
但是,以边和路径为中心的计算方式在分布式环境下都仍缺乏实践。
消息通信
在实际应用中,每个图顶点都需要向邻居节点发送消息或从邻居节点接受消息,而图的边可以看作消息收发的通道。而图中一般边的数量要远大于图顶点的数量,所以大图中的通讯规模是极大的,这对通讯设计要求极高。
消息发送时序控制
一种是集中式通信,即计算与通信串行处理,先计算,然后统一发送消息,虽然实现起来比较简单,但是容易造成瞬间的网络通信阻塞,且增大了发送端的消息存储开销。
第二种是异步式通信,即计算与通信并行处理,在计算时同时发送消息,将大规模通信分散在不同时间。这种方式充分利用了网络资源,也避免了损失网络通信阻塞。所以,主流的图处理系统如GPS都是采用异步式通信。
消息交换模式
一种是push方式,用于以源顶点为中心的计算模式下。在图处理时,遍历源顶点,完成顶点的计算更新,然后按照出边广播消息给目的顶点。这种方式用起来简单,并且由于源顶点可以分别处理,所以具有良好的并发性。但是,出边的目的顶点的分布具有较差的局部性;而且在消息迭代中,必须收到来自上一步的所有入链发送的信息之后才能进入到下一步的迭代计算。所以这种方式的缺点在于,较差的时空局部性、接收端要存储的消息规模较大。目前,主流系统如Pregel、GPS、Giraph等系统均采用该交换模式。
另一种是pull方式,用于以目的顶点为中心的计算模式下。在图处理时,遍历目的顶点,根据入边向对应的源顶点请求消息数据。这种方式下对于单个目的顶点来说,收到消息后即可执行计算更新,所以避免了大量的存储。但是在迭代即将收敛的阶段,大部分顶点可能已经达到收敛状态,而pull方式仍会向其发送请求,就会引入额外的请求开销。
同步控制
同步控制是指,在迭代过程中,前后两步之间是否要进行同步控制。这是所有分布式计算处理框架都必须面对的问题。
同步模式
即k-1次迭代中所有任务都完成之后,才可以开始第k次迭代,发送给第k次迭代的消息仅在第k次迭代时对顶点可见。该模式操作简单,便于理解,且易于调试,所以被大多数主流系统如Pregel、GPS等广泛应用。但是该模式存在水桶效应,也就是任务处理速度不一致,导致处理效率最慢的任务严重影响整体效率,以及存在收敛速度慢的问题。
异步模式
即相邻两次迭代中,各任务独立进行迭代计算,不存在相互等待。该模式缓解了水桶效应的影响,并且加快了收敛速度。但是这增大了编程和调试的难度。并且,由于顶点接受到信息后立即开始更新计算,可能导致大量冗余的消息传播。如单源最短路径问题中,假设顶点v当前的距离为5,收到了两条消息为m1=4,m2=3,那么计算后v的距离变为3,并且对出边进行广播。但是在异步模式下,如果先收到消息m1,v就更新距离为4,并且进行广播,那么在收到m2之后就要再次更新和广播消息,造成了冗余的消息处理和传播。
混合模式
即迭代计算时,可能采用同步模式,也可能采用异步模式,在迭代过程中进行自适应调整。在实际应用中,计算性能会收到具体的图应用的算法、图划分的方法、迭代的执行程度、具体的图的特征和分布式集群的规模等各种实际情况的影响。所以可以利用启发式算法,动态预测同步模式和异步模式的计算性能,实现迭代过程中计算模式的启动切换。
跨步模式
与同步模式相似,但是在执行第k步计算的时候,发给第k步和第k+1步的消息都是可以知道的。在执行第k步计算的时候,需要使用第k-1步发送过来的消息,并生成要发给第k+1步的消息,也就是说,此时发给第k+1步的消息其实已经有部分是可用的了。该模式的核心思想就是在保证同步模式优点的前提下,允许使用第k+1步的消息来加快消息传播,改善算法收敛速度。如单源最短路径问题中,假设顶点v当前的距离为5,收到了来自k-1步的两条消息为m1=4, m2=3,同时,用于第k+1步的消息m3=2也收到了,那么在跨步模式中就可以直接利用m3来更新和广播来,就会比同步模式快。但是如果在第k步本身是不需要进行更新的话,那么即使可以知道第k+1步会进行更新,也不会在第k步执行,而是等到k+1步再执行。因为能看到的第k+1步的信息是不完整的。假设顶点v当前的距离为5,收到了来自k-1步的两条消息为m1=6, m2=7,同时,用于第k+1步的消息m3=4也收到了,那么如果只看来自第k-1步的消息的话第k步就不需要更新了。因为第k+1步完整的信息可能是m3=4, m4=3,那么如果在第k步如果将k更新为4并广播,但实际上它本来是不需要执行这些的,在第k+1步就又要再更新广播一次,那么第k步的操作就是冗余的信息生成与发送。但是,跨步模式只有在特定算法中才能保证正确性。
容错管理
现在大图数据基本都是采用分布式图处理系统来存储的。图数据在实际应用中通常会不断膨胀,所以系统需要不断增加计算节点来横向扩展负载能力。但是增加计算节点,会不可避免地导致故障节点的数量也增加,所以在处理大图数据的时候出现不可预知的故障导致任务中止是十分常见的。而图处理通常都是需要多次迭代的,如果每次失败的时候都要靠重新启动节点来解决,那么会导致昂贵的重复运算代价,或者作业根本就执行不完。并且,故障出现后,在恢复之前整个系统都会中止,所以即使只有少数节点出现故障,系统也会进入闲置状态。
所以,为了提高系统的可用性,分布式图处理系统就十分需要应用合理且高效的故障恢复策略。
故障恢复技术
故障恢复机制是十分复杂的。首先,任何时刻都可能出现节点故障,可能在正常作业执行过程中,也可能出现在故障恢复期间出现嵌套故障,恢复算法要能够处理这两种情况下的故障。其次,故障恢复的开销会降低系统的性能,所以恢复算法必须十分高效,否则就很可能在恢复过程中出现嵌套,然后进入永无止境的嵌套故障中。并且,故障恢复机制对应用程序来说必须是透明的,也就是说,恢复算法必须只能依赖于系统的计算模型,而不应该依赖于任何具体应用的算法逻辑。
在云计算领域中,现在主流的设计思想是通过硬盘读写和冗余备份来提供保障。由于图处理一般是迭代计算,所以备份时机应该是两次迭代之间。但是这又会涉及到备份频次的问题,也就是多少次迭代之后备份一次。如果频次高,会导致作业运行速度缓慢;如果频次低,会导致故障恢复的时候重复计算的代价增高。
另一种思想是作业副本法,也就是系统中同时并行地运行同一个作业的多个副本,那么一个副本失败的时候还有其他副本在正常运行,当其中一个副本完成时,立即停止其他副本的执行并释放资源。这个方法的设计动机是认为当系统中只有作业运行时系统中的资源可能没有得到充分应用,所以利用这些资源与运行多个副本来处理故障情况。但是在处理大图数据的时候不大会有资源空闲的情况。
Giraph、GPS、GraphLab等面向大图的计算系统采用检查点恢复来加速故障的恢复。每个计算节点需要定期把自身维护的子图的状态写到一个稳定的存储系统中作为检查点,如分布式的文件系统。出现故障后,找到一个空闲的正常节点来代替故障节点,然后要求所有计算节点从最近的检查点中载入其子图的状态信息,然后同步地执行剩下的工作量。但是由于要在整个图上重新执行故障节点和其他计算节点中剩余的工作量,这些工作量要通过检查点来追踪,这样会造成较高的计算代价和通信代价。
故障侦测技术
对于复杂的计算任务,除了设计合理的故障恢复技术,可能还需要有故障侦测技术来进行预处理,然后再根据侦测到的故障的位置结合作业的具体运行程度采取不同的故障处理方式。
故障可能发生在工作节点端,如任务异常退出、磁盘读写异常、网络通信异常、物理机宕机等。针对这种故障,可以借助心跳报告机制来进行侦测,对于内部异常,包括任务异常退出、磁盘读写异常等信息,通过心跳上报给主节点;外部异常,包括网络异常、物理机宕机等信息,通过主节点对于心跳超时判断来进行侦测。
故障还可能发生在主节点端,如任务调度异常、作业控制对象异常等。这种故障可以直接由主节点捕获并进行处理。
大图数据划分技术
对大图进行划分是分布式存储及分布式计算的前提,也是大数据时代必要的技术。如果图计算时都是按照图连接的结构进行查找的,所以每次处理都会产生通信开销。因此,一个良好的划分算法应在负载均衡的前提下,尽可能减少子图之间的交互,从而减少计算时所需通讯。
并且,云计算资源会随着并发处理作业数目的变化和集群中节点的增删而动态变化,所以同一个图作业在不同时刻提交时,其分布式任务数目可能不一样,那么划分方法也会不一样。划分结果的不可重用性导致图划分效率也成为影响总计算代价的重要因素。
早期的图划分算法以Kernighan-Lin[3]算法为代表,近年来,相关工作可以分为以METIS[4]为代表的离线划分算法,和以LDG[5]为代表的在线划分算法。与离线划分算法相比,在线划分算法通过一定程度上牺牲划分效果,来获得较高的执行效率。但是,在线划分算法通常是集中式算法,以便于维护复杂的启发式规则,保证相对较好的划分效果,其扩展性显然会收到单机处理能力的限制。
图划分方式
一种是边切分方式,是指在图的划分中对边进行切分。图数据被划分后,被切断的边原本连接的两个顶点会出现在两个不同的子图中。这种切分方式不仅简单而且节省存储空间,被Pregel、Giraph、GPS等主流系统采用。但是这种模式下,在对某一个被切分的边进行操作时,就需要从不同子图上获取顶点信息,从而增加网络开销。
另一种的点切分方式,是指对图的顶点进行切分。图数据被切分后,图中的每一条边出现且仅出现在一个子图中,邻边多的顶点会出现在多个子图中。因为要多次存储顶点,所以会增加系统的存储开销,并且需要一定的机制来保证被切分的顶点的值的一致性,从而增加了系统的设计复杂性。但是这种方式使边都会出现,且仅出现一次,而大图数据中边的数量往往比顶点数量多得多,所以该方式可以大幅度减少网络通信,且在负载均衡方面也表现良好。
Kernighan-Lin算法
是边切分的一种。主要思想是先将一个网络图分割成两个大小相等的顶点集合A和B,A和B中的顶点与集合内的其他点有链接,相互之间也会有边链接,计算这两者的差,记为T,作为衡量集合A和B之间连通性的指标。算法在每次迭代过程中,在A和B中各任意选取一个顶点,将这两个进行模拟交换并计算T的增量,最后选择使T增量最大的模拟交换方式进行实际交换。但是,算法的时间复杂度过高,且在有较好的初始划分时才能求得一个局部最优解,否则就要不断迭代来对初始划分进行重划分。
离线划分算法
在图数据被分布式图处理系统加载前将图数据进行划分。其核心思想是通过对原图的粗糙化操作将大图归约成可以接受的小图,然后对小图执行Kernighan-Lin之类的算法进行划分,最后通过反粗糙化将小图划分还原成大图划分。这种算法进行划分后的子图具有较少的切分边,所以受到业界广泛应用。
在线划分算法
也叫做流式划分,是指在数据加载过程中对图数据一边加载一边划分。它假定数据以顶点流或者边流的方式到达,在划分过程中,按照已到达的数据的分布信息,通过一组启发式规则来决定当前到达数据的划分位置。该算法只需要对数据扫描一遍即可实现数据划分,极大提高了划分效率,但是由于只能依据部分数据来决定划分位置,所以划分精度会有所下降。
以LDG为例,假设图数据以邻接表的形式组织,且需要被划分为K个子图。对于顶点v,启发式规则为:计算v的出边指向的目的顶点与各个子图中已有的源顶点的交集,将v分配给交集最大的子图,即根据当前时刻v的目的顶点在各个子图中的分布情况来决定v的位置。并且,为了尽可能保证负载均衡,LDG允许用户自定义惩罚函数,根据子图的容量(可以是源顶点数,也可以是出边数),调整启发式函数的计算结果。当然,为了能够快速完成启发式函数的计算,LDG需要维护一个全局映射表,记录已经加载的源顶点在各个子图之间的分布信息。
动态重划分算法
在分布式图处理系统的运行过程中,会出现负载不均的情况,可能是因为初始图数据划分不均、集群环境的改变或者活跃节点数目的变化等。所以很多系统都设计了动态重划分策略来保证负载均衡。
图的动态重划分算法一般包含3个步骤:收集系统运行过程中的状态数据,如活跃节点的数目、消息收发的数量等;根据收集到的状态信息建立相应的代价收益模型,制定动态重划分策略;根据制定的策略进行数据迁移。根据重划分的粒度,可以分为以数据块为中心的动态重划分和以顶点为中心的动态重划分。
以数据块为中心的动态重划分,其基本的调整单位是数据块。以Giraph系统[6]为例,Giraph在加载数据时,将图数据流式划分为多个子图,子图数量一般是计算节点数量的整数倍,每个节点加载多个子图并建立子图与节点之间的映射表。每次迭代结束前,Worker节点都会向Master节点汇报本次迭代过程中每个子图的状态信息,包括运行时间、收发消息的数目以及活跃节点的数目等。在下次迭代开始之前,Master节点会根据接收到的信息制定重划分策略,并以子图和计算节点映射表的形式告知Worker节点。然后Worker节点根据调整策略发送或接收相应的子图。这种动态重划分策略易于实现,但是由于调整粒度太大,所以不能对负载进行精细的调整。
以顶点为中心的动态重划分,其基本的调整单位是顶点及其对应的邻接边。以Mizan系统为例,系统在加载完数据后要构建图顶点与计算节点的路由表,以便于消息传递。重划分过程与Giraph类似,要在迭代过程中收集信息。然后Worker根据收集到的信息制定迁移计划,再据此相互迁移顶点,并更新路由表。虽然这种重划分算法可以实现细粒度的动态调整,但是图顶点和计算节点的路由表是十分庞大的,其维护为系统带来了额外的负担。
无论哪种重划分策略,在实际应用中都能对负载均衡起到积极作用,但是在数据迁移的时候也都会给网络带来极大开销。
大图数据分布式存储与索引技术
目前大图数据管理的应用中,主要采用简单图和超图这两种数据模型,简单图的存储结构大多采用邻接矩阵和邻接表这两种。采用邻接矩阵表示比较直观,便于快速查找顶点之间的关系,但是存储代价高昂。邻接表相较而言存储开销小,逻辑简单,便于分割处理,所以应用范围更广。且常用的图算法,如PageRank、最短路径计算等,并不需要频繁查看两个顶点之间的连通性,所以邻接表完全可以处理。
传统的基于Pregel衍生出来的一些大规模图计算系统需要在任务运行时,先从独立的存储系统中获取数据,然后在计算迭代过程中往往是驻留内存的。存储系统通常采用HDFS这种分布式文件系统,可以存放邻接矩阵、邻接表等结构。但是,在大数据背景下,驻留内存的算法往往是支撑不起来的,一来是因为数据规模在快速增长,二来在迭代过程中会产生大量的中间计算结果。所以,很多系统改为采用磁盘机制来存储中间计算结果和消息数据等,这类系统称为磁盘驻留的大图处理系统。
单机磁盘处理系统
单机磁盘处理机制避免来分布式集群的维护工作。但由于图计算对数据访问的局部性较差,所以在迭代过程中会有大量的随机磁盘访问开销,严重影响整体性能。
因为消息是根据边进行发送的,所以在GraphChi[7]系统中,在进行计算之前,先对出边进行排序预处理,以此来避免随机访问的问题。预处理包括两个阶段,先按照目的顶点的ID将出边分配到不同的Shard中;然后在每个Shard中,出边再按照源顶点的ID进行排序。在迭代计算的过程中,Shard是基本的计算单位,在计算某个Shard时,先将其加载到内存,完成更新计算后,按照出边更新对应目的顶点的值。由于Shard中的数据均按照源顶点进行排序,因此避免来更新时的随机访问问题。
然而,也正因为排序的预处理,GraphChi引入了昂贵的预处理开销。并且,单机磁盘处理系统受限于CPU的计算能力,对于计算密集型算法难以在合理时间内完成计算。所以,分布式磁盘处理系统成为必然。
分布式磁盘处理系统
在Hadoop的计算过程中,可以通过调整对应的参数来控制Map任务和Reduce任务之间的Shuffle过程中磁盘数据的规模。但是相邻两次迭代计算之间的中间结果必须通过HDFS来进行传递,影响整体性能。而且,MapReduce模型是一个通用计算模型,索引机制也是通用的,所以对于大图数据的迭代计算来说,针对性不强。
Giraph和Spark均采用分块机制,即将图顶点数据和出边数据划分为若干数据块,然后依次加载数据块到内存,完成相关的计算逻辑。由于会有部分数据驻留内存,所以采用LRU策略来完成数据在内存和磁盘之间的调度。Giraph将迭代计算中的数据分为图数据(图顶点和出边)和消息数据。Giraph支持内存版本和磁盘版本两种运行机制,用户可以根据需求自行选择。在磁盘版本中,图数据按照顶点ID被分成若干Partition,每个任务负责维护至少一个Partition中的数据。消息数据按照目的顶点所在的Partition进行组织。当消息接收缓存溢出时,Giraph选择当前内存中消息规模最大的Partition,将其内存消息按照目的顶点在Partition中的存储顺序进行排序,然后写到一个独立的消息文件中。迭代结束后,图数据Partition和其接收的消息文件之间是一对多的映射关系。在下一次迭代计算中,当处理Partition中的某个图顶点时,Giraph会从多个消息文件中并行加载对应的消息,以完成计算工作。由于消息数据是按照目的顶点的存储顺序组织的,所以并行加载的时候只需要顺序扫描消息文件即可,避免了随机磁盘存取。这种消息排序和并行加载的机制,避免了在加载消息数据的时候将某个Partition对应的消息数据全部加载入内存,从而避免了消息数据的内存溢出,尤其是入度较高的Partition。
但是,Giraph对消息数据的排序会产生昂贵的开销,这严重影响了磁盘版本Giraph的处理效率。所以在MOCgraph[8]系统中,采用了消息的在线处理技术,即接收到的消息可以立即根据目的顶点的值进行更新计算,就不用缓存所有的消息了,省去了昂贵的内存存储开销。所以,在相同的内存配置下,MOCgraph在数据处理容量方面显著提高了Giraph的扩展性。
大图数据分布式三角形查询技术
即从一个顶点出发经过两个中转顶点回到起点形成的三角形,图中三角形的查找与统计是一个具有广泛应用的基础问题。图中三角形拥有两个重要特性:同质,传递。在社交网络中,同质表示用户倾向于和有着相似兴趣爱好的人成为好友;传递表示用户倾向于和拥有相同朋友圈的人成为好友。另外,统计三角形也被应用于挖掘隐藏的网页主题、检测垃圾邮件等功能中。
图中三角形主要研究三角形总数(triangle counting)问题和三角形列表(triangle listing)问题,即三角形有几个,分别是哪些。现有算法可以分为集中式算法、分布式算法以及近似算法。
集中式算法
如果图不是很大,可以将图以邻接矩阵的形式直接存储在内存中,那么三角形总数和三角形列表的计算就可以转化为矩阵乘法的计算。在邻接矩阵A(G)中,如果A(i,j)=1,表示顶点i和顶点j之间有一条边,那么
A
(
i
,
j
)
3
=
∑
x
∑
y
A
(
i
,
x
)
∗
A
(
x
,
y
)
∗
A
(
y
,
i
)
A(i,j)^3 = \sum_x\sum_y{A(i,x)*A(x,y)*A(y,i)}
A(i,j)3=x∑y∑A(i,x)∗A(x,y)∗A(y,i)
就可以表示图中三角形的数目了,但是在计算过程中每个三角形都计算了2遍,比如有三角形ABCA,那么ACBA也会被计算到。而三角形中有三个顶点,所以BACB、BCAB、CABC、CBAC也被统计了。这种方法比较容易,但是时间复杂度高。并且现在数据量一般都很大,所以需要将图进行划分,然后针对每个子图进行计算。
Graph Partition算法[9]中介绍了一种计算方式,在每次迭代中:先将图G划分成一系列子图,保证每个子图都能加载到内存中,不会被转移到磁盘中去;然后将子图加载到内存,并行计算每个子图中的三角形数目和列表;最后删除每个子图中不会再构成三角形的边。
分布式算法
当图中数据过大时,传统的集中式算法已经不再使用,就需要借助分布式计算框架来完成。
文献[10]中提出了基于MapReduce模型的三角形总数算法,分为两个阶段的MapReduce。在第一阶段,Map将图中的顶点进行合并,也就是对于相连接的两个顶点,键值为度数小的顶点,值为这两个顶点的元组;Reduce将键值进行合并,如果相同键值的键值对只有一个,就删除,否则进行两两合并。在第二阶段,Map要把节点写成边的形式;Reduce将Map的结果和第一阶段中Reduce的结果进行合并。最后得到的结果就是图中三角形的键值对。
大图数据分布式频繁子图挖掘
在许多领域中,数据被建模为属性图(见2.1.3),形成复杂的数据结构。挖掘频繁子图可以帮助找到图数据之间的相关性,进而发现一些隐藏的频繁模式。比如在图相似性搜索中,先挖掘频繁子图,然后将其作为图的特征,再进行相似性的搜索,这样可以得到更加精确的结果。现在较多的算法是在小图数据集中挖掘所有频繁子图模式,而在大图中挖掘的算法比较少。
挖掘算法主要基于Apriori和FP-growth。Apriori算法通过连接两个频繁i子集生成候选子集,然后根据频繁集的子集一定是频繁集的思想删除冗余的子集。AGM算法[11]借助了Apriori算法,通过宽度优先搜索每次加入一个顶点的方法来生成候选集,然后通过扫描数据库来计算候选集的频次。这种递归的方法在大规模图数据中效率不高。FP-growth算法提出了模式增长的思想,通过向频繁集添加一条边或一个顶点来得到k候选集。gSpan算法[12]中使用了FP-growth算法,并在扩展时加入了多种剪枝,避免了同构子图的计算。FP-growth算法比Apriori效率更高,所以应用更广泛。
现在越来越多的需求是要在单个大图中挖掘频繁子图,如发现社交网络。但这是一项复杂的任务,因为算法的复杂性是图的大小的指数集。并且对大图的挖掘不能将大图分割成多个小图来处理,因为计算模式频率的方法不同。在图集中挖掘频繁子图,是看一个子图在几个小图中出现,即使子图在某个小图中出现多次也只记为一次。但是在大图上要找到所有的同构图出现的次数,大大增加了复杂度。首先要对大图进行划分,这是NP难问题,如果对顶点采用Hash映射,虽然每个节点的顶点数均衡了,但是在用FP-growth算法的时候,可能会因为有的节点中的顶点之间连接稀疏而有的节点中连接紧密而导致负载不均衡。如果按照边进行划分,就很容易出现子图跨分区的情况。所以如何划分大图以及如何在处理跨分区子图中避免大量通信是一个很大的挑战。
一个经典的策略是基于MapReduce框架的。基于广度优先搜索迭代提取频繁子图,先由一个MapReduce计算频繁1-子图,输出频繁1-子图和下一个MapReduce的输入;在第二个MapReduce中生成候选2-子图,输入到第三个MapReduce中;在第三个MapReduce对候选2-子图计算支持度,得到频繁2-子图,其余的继续输入到第二个MapReduce中。第二个和第三个MapReduce作为一个迭代步,在第i次迭代中生成(i+1)-子图。如果没有新的候选子图生成或没有再得到频繁子图时停止迭代。这种方法只有在生成频繁1-子图的时候加载了图数据,之后的迭代计算中没有再用到图数据,所以巧妙避开了划分问题。
大规模图数据分布式处理的应用
图数据的查询、分析和挖掘有着非常广泛的应用。随着图数据规模的不断增大,越来越多的应用场景需要依靠分布式的处理平台来完成,而在应用中许多功能的实现会涉及到图分析和迭代计算。特别地,比起道路交通网、计算机网络、通信网络和软件测试等领域的传统应用,Web、社会网络和生物化学领域里诸多新型应用的图数据规模已经达到了很大的级别,集中存储和处理已经不能满足这些数据的分析和挖掘的需求了。
Web应用
基于链接分析的网页排序
互联网信息呈爆炸式增长,如何在如此庞大的数据中精准地查找到用户想要的信息是互联网时代急需解决的问题。一条检索可以返回上百万条结果,而用户不可能一一查看,而是希望浏览器自动将质量最高的网页排在前面。早期的网页排序的思想是:网页中检索词出现的频率越高就排在越前面。这种方法虽然简单直观,但是效果欠佳并且容易受到攻击。当下的搜索引擎都应用多种网页排序算法并综合网页链接、用户行为等多种因素来对搜索结果进行优化。
PageRank是较为经典的算法,具体算法见3.1.1。PageRank算法给学术界带来了巨大的变化,后人以此为基础,提出了大量的链接分析算法。而PageRank在网页排序之外,也具有大范围的实用性,可以覆盖很多的领域,且是大图分布式迭代计算支持的最具代表性的算法,主要的分布式大图处理系统都有针对PageRank的示例程序和评测。
Web日志挖掘
随着电子商务的发展,Web数据挖掘技术不仅为商家挖掘用户喜好提供了支持,还为客户提供了更为便利的购物方式。基于Web的数据挖掘技术可以分为:Web内容挖掘、Web结构挖掘以及Web使用挖掘。Web使用挖掘的研究对象主要是Web日志,即通过对Web服务器中的海量日志用数据挖掘技术进行分析,从而智能发现用户的访问模式。Web日志挖掘在改进系统性能、制定个性化服务、页面推荐、站点修改、商业智能等方面都起到了至关重要的作用。另外,可以通过Web日志挖掘技术分析出站点的异常访问模式和安全漏洞,帮助解决入侵检测、网络欺诈等问题。
面向主题的搜索
面向主题就是针对某一类主题或某一领域进行搜索,返回的结果都是与搜索主题相关的网页,而其他不相关的内容被过滤[13]。与通用的搜索引擎相比,面向主题的搜索引擎搜索出来的结果数据量比较小,因为只搜集了部分网页,但是搜索的准确率比较高,因为这些网页被限定在特定的主题中。建立面向主题的搜索引擎的成本要远小于通用的搜索引擎,因此发展非常迅速。
Web购物推荐
网上购物逐渐成为人们主要的购物方式。但是,随着商品数量的迅速增长,用户选择想要的商品也逐渐变得困难,因此,Web购物推荐系统的作用逐渐凸显。Web购物推荐系统通过分析用户浏览过的网页、购买的商品分析出用户喜欢的商品,然后将用户喜欢的商品和比较热门的商品推荐给用户,帮助用户更加容易地选择商品。
目前,常用的推荐技术有基于内容的过滤技术、协同过滤技术、基于效用的推荐技术等[14]。其中协同过滤技术是目前应用中最广泛的技术,而SimRank算法能够应用于协同过滤技术中,具体算法见3.1.2。在网上购物的情景中,用户和商品可以看成顶点,用户购买商品则用户为源顶点,出边指向商品对应顶点。认为相似的用户购买的商品也会相似,购买相似商品的用户也会相似。通过SimRank算法可以为用户提供有价值的参考,从而增加用户的体验,吸引到更多的用户。
Web问答系统
Web问答系统主要是利用信息抽取、信息检索,以及自然语言处理等技术,用准确、简洁的自然语言来回答用户的问题。该系统中需要对找到的内容进行分析评估找到高质量的答案,所以关键在于探索高质量问题和答案的特征,其中,基于链接的特征提取被广泛应用,PageRank这种典型算法可以有效用于对问答质量的分类。
社会网络应用
社会网络中关键节点检测
关键节点就是影响力大的节点,这些节点被认为对网络规模演化和信息传播速率有强影响力。比如,微博上同样的话题由不同用户转发,受到的关注程度是大不相同。寻找关键点有助于改进专家用户发现、病毒营销、内容排序等功能。
近年来提出了许多检测关键节点的方法,有的侧重描述节点属性特征,有的侧重通过网络的拓扑结构来进行检测。利用节点属性来对节点进行排名从而找到关键节点是一种常见的方法,如根据用户发布数量来确定用户活跃程度,或根据发表论文数量和被引用数量来衡量作者印象力等。相比而言,利用拓扑结构的方法更能体现出网络的社会性,如计算一个节点与其他节点的距离,越近则表示该节点是网络中的活跃节点,其影响力就越大。还有利用结构洞来计算的,结构洞是指,社会网络中某个或某些个体与有些个体发生直接联系,但与有些个体不发生直接联系,即无直接关系或关系间断的现象,从网络整体看好像是网络结构中出现来洞穴[15]。
社会网络社区发现
网络上的信息有很强的交互性和及时性,形成动态演化的社会网络。社会网络中由于某种关系结合在一起的一组个体称为社区,其内部的顶点之间连接相对紧密,而社区与社区之间的连接则相对稀疏。社区中的顶点一般有着相似的性质或功能,如朋友圈中一个社区可能代表一群有着相同兴趣爱好的人。
研究社会网络中的社区结构并分析其特征,可以有效检测舆论情况、分析特定话题传播轨迹等。进一步地,针对社区进行分析可以挖掘出个体之间的关系,提高网络搜索的精确性,从而提升网络信息挖掘能力。
社会媒体内容分析
现如今涌现出了大量的社交平台,用户可以在平台上建立社交关系,如加好友、收藏、关注感兴趣的话题或社区等。用户也可以上传自己的内容与其他用户分享,所以平台上有很多形式的数据,如多媒体数据、用户评论、地理信息等。
媒体内容分析就是分析媒体表达的语义信息,从而更好地服务于用户、企业等。如,分析用户上传地图片推测用户所在地;或通过手机用户行为信息建立偏好模型,从而为其推荐可能感兴趣的内容或者相似用户。
未来发展
趋势展望
图数据的管理,从存储到计算,已经经历了从基于内存到基于磁盘的单机处理,再到大数据时代下的分布式处理。近些年来,云计算在这方面取得了很大的优势。而图处理方面一直在面对的问题,并且将来也一直需要优化的问题一直没变,始终围绕着一下三点。
首先,是要加快算法收敛,减少迭代次数。这可以提高系统的执行效率,从而提高系统的可用性。目前最常使用的方法是加大计算粒度或采用异步调度模式。但是加大力度会牺牲算法的精度,而异步调度将大大增大开发和使用上的难度。所以提供可选的计算粒度并提供良好封装的同步和异步调度借口将成为一个发展趋势。
其次,要减少消息数目,减轻网络负载。在分布式算法下,节点之间的通讯是制约系统整体性能的一个瓶颈。目前,各个系统都采取了相应措施来优化通信,但都是在特定算法下或是特定数据结构中才能进行,并没有从根本上环节这一瓶颈。这是将来有待解决的一大问题。
最后,是实现负载均衡,消除水桶效应。水桶效应会严重影响系统的整体性能,尤其是在同步模式下。虽然高质量的图划分策略可以大幅度减轻网络负载和负载均衡的问题,但图划分本身就是一个NP难的问题,而目前的图划分技术难以在连通性、均衡性、时间复杂性上同时表现良好。而且,就算划分均衡了,系统中各个计算节点的性能可能也是不同的,那又会导致计算资源与数据量的不均衡。所以,如何结合计算资源实现高效的均衡划分以及高效的动态重划分仍是将来研究的一个重点。
个人想法
图数据相比其他结构的数据本身就有着更强的关联性,所以其可视化得到的结果可以比其他数据结构有更强的表现性和解释性。所以除了不断在算法方面进行改进之外,还应在应用方面进行加强,如展示网站结构、用户关系网等。也就是内嵌于各种应用中,增强用户使用体验。
参考文献
[1] 王海勋.图数据的管理与挖掘
[2] 谷峪,于戈,鲍玉斌.大规模图数据的分布式处理.清华大学出版社
[3] Kernighan-Lin algorithm. http://en.wikipedia.org/wiki/KernighanLin_algorithm, 2011-7-13
[4] Karypis G, Kumar V. METIS-unstructured graph partitioning and sparse matrix ordering system, version 2.0. Technical report, 1995.
[5] Stanton I, Kliot G. Streaming graph partitioning for large distributed graphs. In: Proc of the ACM SIGKDD Int’l Conf on Knowledge Discovery and Data Mining. 2012: 1222-1230
[6] Apache Giraph. http://giraph.apache.org/
[7] Kyrola A, Blelloch G E, Guestrin C. GraphChi: large-scale graph computation on just a PC. In: OSDI, 2012.
[8] Zhou C, Gao J, Sun B, Yu J X. MOCgraph: scalable distributed graph processing using message online computing. PVLDB, 2014.
[9] Chu S, Cheng J. Triangle listing in massive networks and its applications. In: Proc of the 17th ACM SIGKDD Int’l Conf on Knowledge Discovery and Data Mining(KDD’11), 2011: 672-680.
[10] Cohen J. Graph twiddling in a MapReduce world. Computing in Science and Engineering, 2009, 11(4): 29-41.
[11] Inokuchi A, Washio T, Motoda H. An apriori-based algorithm for mining frequent substructures from graph data. In: PKDD, 2000:13-23.
[12] Yan X, Han J. gSpan: graph-based substructure pattern mining. In: Proc IEEE 2002 Int’l Conf on Data Mining(ICDM’01), 2001: 313-320.
[13] 李蓉. 面向主题的搜索引擎的设计与实现. 华东交通大学硕士学位论文,2011.
[14] 张晶. 基于FP关联规则的购物推荐系统的开发. 复旦大学硕士学位论文,2009.
[15] Burt R S. Structural holes: the social structure of competition. Cambridge, MA: Harvard University Press, 1992.
本文深入探讨了图数据管理在大数据时代的重要性和面临的挑战,包括图数据的强耦合性、动态性、查询复杂性以及可调可控性。介绍了基本的图算法如PageRank和SimRank,图的遍历模式,以及大规模图数据的存储、索引、通信优化和容错管理策略。对未来发展趋势,文章提出关注算法收敛、减少消息开销和负载均衡等关键问题。
224

被折叠的 条评论
为什么被折叠?



