大数据图数据库之离线挖掘计算模型
/* 版权声明:能够随意转载,转载时请务必标明文章原始出处和作者信息 .*/
author: 张俊林
节选自《大数据日知录:架构与算法》十四章,书籍文件夹在此
对于离线挖掘类图计算而言,眼下已经涌现出众多各方面表现优秀而各具特点的实际系统,典型的比方Pregel、Giraph、Hama、PowerGraph、GraphLab、GraphChi等。
通过对这些系统的分析。我们能够归纳出离线挖掘类图计算中一些常见的计算模型。
本节将常见的计算模型分为两类。一类是图编程模型。另一类是图计算范型。编程模型很多其它地面向图计算系统的应用开发人员,而计算范型则是图计算系统开发人员须要关心的问题。在本节中,关于编程模型,主要介绍以节点为中心的编程模型及其改进版本号的GAS编程模型;关于计算范型。则重点介绍同步运行模型和异步运行模型。
这几类模型已经被广泛採用在眼下的大规模图挖掘系统中。
14.4.1 以节点为中心的编程模型
以节点为中心的编程模型(Vertex-Centered ProgrammingModel)首先由Pregel系统提出,之后的绝大多数离线挖掘类大规模图计算系统都採用这个模型作为编程模型。
对图G=(V,E)来说。以节点为中心的编程模型将图节点vertexÎV看作计算的中心,应用开发人员能够自己定义一个与详细应用密切相关的节点更新函数Function(vertex),这个函数能够获取并改变图节点vertex及与其有关联的边的权值,甚至能够通过添加和删除边来更改图结构。
对于全部图中的节点都运行节点更新函数Function(vertex)来对图的状态(包含节点信息和边信息)进行转换,如此重复迭代进行,直到达到一定的停止标准为止。
典型的图节点更新函数Function(vertex)基本遵循例如以下逻辑。
即首先从vertex的入边和出边收集信息,对这些信息经过针对节点权值的函数f()变换后。将计算得到的值更新vertex的权值,之后以节点的新权值和边原先的权值作为输入。通过针对边的函数g()进行变换,变换后的值用来依次更新边的权值。通过vertex的节点更新函数,来达到更新部分图状态的目的。
以节点为中心的编程模型有非常强的表达能力。研究表明,非常多类型的问题都能够通过这个编程模型来进行表达,比方非常多图挖掘、数据挖掘、机器学习甚至是线性代数的问题都能够以这样的编程模型来获得解决。
这也是为何以图节点为中心的编程模型大行其道的根本原因。
14.4.2 GAS编程模型
GAS模型能够看作是对以节点为中心的图计算编程模型的一种细粒度改造。通过将计算过程进一步细分来添加计算并发性。
GAS模型明白地将以节点为中心的图计算模型的节点更新函数Function(Vertex)划分为三个连续的处理阶段:信息收集阶段(Gather)、应用阶段(Apply)和分发阶段(Scatter)。通过这样的明白的计算阶段划分。能够使原先的一个完整计算流程细分。这样在计算过程中能够将各个子处理阶段并发运行来进一步添加系统的并发处理性能。
这里假设当前要进行计算的节点是u,并以此为基础来说明GAS模型。
在信息收集阶段,将u节点的全部邻接节点和相连的边上的信息通过一个通用累加函数收集起来:
通过以上三个阶段的操作,能够定义以图节点为中心的高度抽象的GAS计算模型。在GAS模型中,节点的入边和出边在信息收集和分发阶段怎样使用取决于详细的应用,比方,在PageRank计算中,信息收集阶段仅仅考虑入边信息,分发阶段仅仅考虑出边信息,可是在相似于Facebook的社交关系图中,假设边表达的语义是朋友关系。那么在信息收集和分发阶段则是全部边的信息都会纳入计算范围。
14.4.3 同步运行模型
同步运行模型是相对于异步运行模型而言的。
我们知道,图计算往往须要经过多轮迭代过程。在以节点为中心的图编程模型下。在每轮迭代过程中对图节点会调用用户自己定义函数Function(vertex)。这个函数会更改vertex节点及其相应边的状态,假设节点的这样的状态变化在本轮迭代过程中就能够被其它节点看到并使用,也就是说变化马上可见。那么这样的模式被称为异步运行模型;假设全部的状态变化仅仅有等到下一轮迭代才可见并同意使用,那么这样的模式被称为同步运行模型。採用同步运行模型的系统在迭代过程中或者连续两轮迭代过程之间往往存在一个同步点。同步点的目的在于保证每一个节点都已经接受到本轮迭代更新后的状态信息,以保证能够进入下一轮的迭代过程。
在实际的系统中,两种典型的同步运行模型包含BSP模型和MapReduce模型。关于BSP模型的介绍及其与MapReduce模型的关系,能够參考本书“机器学习:范型与架构”一章。这里不再赘述。以下介绍图计算中的MapReduce计算模型,整体而言。由于非常多图挖掘算法带有迭代运行的特点,MapReduce计算模型并非十分适合解决此类问题的较佳答案,可是由于Hadoop的广泛流行。实际工作中另一些图计算是採用MapReduce机制来进行的。
14.4.4 异步运行模型
异步运行模型相对于同步运行模型而言。由于不须要进行数据同步。而且更新的数据能够在本轮迭代就可以被使用,所以算法收敛速度快,系统吞吐量和运行效率都要明显高于同步模型。可是异步模型也有相应的缺点:其非常难判断程序的正确性。由于其数据更新马上生效,所以节点的不同运行顺序非常可能会导致不同的运行结果。尤其是对图节点并发更新计算的时候,还可能产生争用状况(Race Condition)和数据不一致的问题,所以其在系统实现的时候必须考虑怎样避免这些问题。系统实现机制较同步模型复杂。
以下以GraphLab为例解说异步运行模型的数据一致性问题,GraphLab比較适合应用于机器学习领域的非自然图计算情形,比方马尔科夫随机场(MRF)、随机梯度下降算法(SGD)等机器学习算法。
在解说异步模型的数据一致性问题前,先来了解一下GraphLab论文提出的图节点的作用域(Scope)概念。对于图G中的某个节点v来说,其作用域Sv包含:节点v本身、与节点v关联的全部边,以及节点v的全部邻接图节点。之所以定义图节点的作用域。是由于在以节点为中心的编程模型中,作用域体现了节点更新函数f(v)能够涉及的图对象范围及与其绑定的数据。
在并发的异步运行模型下,能够定义三类不同强度的数据一致性条件(见图14-12),依据其一致性限制条件的强度,由强到弱分别为:全然一致性(Full Consistency)、边一致性(Edge Consistency)和节点一致性(Vertex Consistency)。
全然一致性的含义是:在节点v的节点更新函数f(v)运行期间,保证不会有其它更新函数去读写或者更改节点v的作用域Sv内图对象的数据。因此,满足全然一致性条件的情形下。并行计算仅仅同意出如今无公共邻接点的图节点之间。由于假设两个图节点有公共邻接图节点。那么两者的作用域必有交集,若两者并发运行。可能会发生争用状况,而这违反了全然一致性的定义。
比全然一致性稍弱些的是边一致性条件,其含义为:在节点v的节点更新函数f(v)运行期间。保证不会有其它更新函数去读写或者更改节点v,以及与其邻接的全部边的数据。
即与全然一致性条件相比。放松了条件。同意读写与节点v邻接的其它图节点的数据。
在满足边一致性条件下。并行计算同意出如今无公共边的图节点之间。由于仅仅要两个节点u和v不存在共享边,则一定会满足边一致性条件。
更弱一些的是节点一致性,其含义为:在节点v的节点更新函数f(v)运行期间。保证不会有其它更新函数去读写或者更改节点v的数据。
非常明显,最弱的节点一致性能够同意最大程度的并发,之所以说其限制条件较弱。是由于除非应用逻辑能够保证节点更新函数f(v)仅仅读写节点本身的数据。否则非常易发生争用状况,使得程序运行结果不一致。
选择不同的一致性模型对于并行程序运行的结果正确性有非常大影响,所谓并行运行的结果正确性,能够用其和顺序运行相比是否一致来进行判断。
因此,能够定义“序列一致性”例如以下:
假设对全部可能的并发运行顺序总是存在与序列运行全然一致的运行结果,在此种情形下,我们能够将这个并发程序称为是满足序列一致性的。
是否满足序列一致性能够帮助我们验证将一个顺序运行的程序改造为并行运行程序后的正确性。
在并行的异步图计算环境下。以下三种情形是能够满足序列一致性的。
情形一:满足全然一致性条件。
情形二:满足边一致性条件,而且节点更新函数f(v)不会改动邻接节点的数据。
情形三:满足节点一致性条件,而且节点更新函数f(v)仅仅会读写节点本身的数据。
上面三种情形可供应用者在设计算法时參考。以在并发性和结果正确性之间做好权衡:一致性条件越弱,则并发能力越强,可是争用状况发生概率越高,即结果可能越难保障正确性。
假设应用能够明白节点更新函数的数据涉及范围,就能够依据上述几种情形来进行选择。更好地做到在保证结果正确性的前提下提高并发性能。