GraphLab与Pregel对比

Stella981
• 阅读 741

一、GraphLab

示例1:GraphLab完成对V0邻接顶点的求和计算

GraphLab与Pregel对比

示例中,需要完成对V0邻接顶点的求和计算,串行实现中,V0对其所有的邻接点进行遍历,累加求和。而GraphLab中,将顶点V0进行切分,将V0的边关系以及对应的邻接点部署在两台处理器上,各台机器上并行进行部分求和运算,然后通过master顶点和mirror顶点的通信完成最终的计算。

每个顶点每一轮迭代经过gather->apple->scatter三个阶段。

1)       Gather阶段

工作顶点的边 (可能是所有边,也有可能是入边或者出边)从领接顶点和自身收集数据,记为gather_data_i,各个边的数据graphlab会求和,记为sum_data。这一阶段对工作顶点、边都是只读的。

2)       Apply阶段

Mirror将gather计算的结果sum_data发送给master顶点,master进行汇总为total。Master利用total和上一步的顶点数据,按照业务需求进行进一步的计算,然后更新master的顶点数据,并同步mirror。Apply阶段中,工作顶点可修改,边不可修改。

3)       Scatter阶段

工作顶点更新完成之后,更新边上的数据,并通知对其有依赖的邻结顶点更新状态。这scatter过程中,工作顶点只读,边上数据可写。

在执行模型中,graphlab通过控制三个阶段的读写权限来达到互斥的目的。在gather阶段只读,apply对顶点只写,scatter对边只写。并行计算的同步通过master和mirror来实现,mirror相当于每个顶点对外的一个接口人,将复杂的数据通信抽象成顶点的行为。

下面这个例子说明GraphLab的执行模型:

GraphLab与Pregel对比

================================================================

分割线

================================================================

二、Pregel

实例二

GraphLab与Pregel对比

从图中可以看出,数值6是图中的最大值,在第0步超级步中,所有的节点都是活跃的,系统执行用户函数_F_(vertex):节点将自身的数值通过链接关系传播出去,接收到消息的节点选择其中的最大值,并和自身的数值进行比较,如果比自身的数值大,则更新为新的数值,如果不比自身的数值大,则转为不活跃状态。

在第0个超级步中,每个节点都将自身的数值通过链接传播出去,系统进入第1个超级步,执行_F_(vertex)函数,第一行和第四行的节点因为接收到了比自身数值大的数值,所以更新为新的数值6。第二行和第三行的节点没有接收到比自身数值大的数,所以转为不活跃状态。在执行完函数后,处于活跃状态的节点再次发出消息,系统进入第2个超级步,第二行节点本来处于不活跃状态,因为接收到新消息,所以更新数值到6,重新处于活跃状态,而其他节点都进入了不活跃状态。Pregel进入第3个超级步,所有的节点处于不活跃状态,所以计算任务结束,这样就完成了整个任务,最大数值通过4个超级步传递给图中所有其他的节点。算法14.1是体现这一过程的Pregel C++代码。

GraphLab与Pregel对比

三、GraphLab和Pregel中Vertex区别

GraphLab

Pregel

操作

GetValue()

四、数据同步(消息)

GraphLab

Pregel

mirror (sync_vertex_data())

SendMessageToAllNeighbors()

SendMessageTo()

五、

有一个重要的区别在Pregel和GraphLab之间,动态计算是如何表达的。GraphLab从数据的移动中分离了未来计算的调度。作为结果,GraphLab更新函数可以访问数据在相邻的顶点,即使相邻顶点没有调用当前的更新。相反,Pregel更新函数通过消息初始化并且只能访问在消息中的数据,限制了所能表达的内容。例如,动态PageRank是很困难的表达在Pregel上, 计算给定页面PageRank值需要的所有相邻的PageRank值,即使所有相邻的页面最近的一些相邻的页面并没有改变。因此,发送数据 (PageRank值)给相邻的顶点的决定不能由发送顶点来做出(根据Pregel的要求),但必须由接收顶点决定。GraphLab,自然表示了抽取模型,由于相邻顶点只负责调度和更新函数,可以直接读取相邻定点的值,即使他们没有改变顶点值。

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
janusgraph
精确查询语句含义测试语句执行时间查询顶点标签为FALV的顶点数量g.V().hasLabel('FALV').count()2400s查询顶点属性中id为19012201clockWithResult(1){g.V().has('id','19012201')}0.18540099999999998s查询顶点属性中
Stella981 Stella981
3年前
Spark学习之路 (二十八)分布式图计算系统
一、引言  在了解GraphX之前,需要先了解关于通用的分布式图计算框架的两个常见问题:图存储模式和图计算模式。二、图存储模式  巨型图的存储总体上有边分割和点分割两种存储方式。2013年,GraphLab2.0将其存储方式由边分割变为点分割,在性能上取得重大提升,目前基本上被业界广泛接受并使用。
Stella981 Stella981
3年前
C++ OpenCV特征提取之积分图计算
前言什么是积分图像积分图像的定义:取图像左上侧的全部像素计算累加和,并用这个累加和替换图像中的每一个像素,使用这种方式得到的图像称为积分图像。为什么要用积分图像直方图的计算方法为遍历图像的全部像素并累计每个强度值在图像中出现的次数。有时仅需要计算图像中某个特定区域的直方图,而
Wesley13 Wesley13
3年前
C语言实现数据结构的邻接矩阵
写在前面  图的存储结构有两种:一种是基于二维数组的邻接矩阵表示法。            另一种是基于链表的的邻接表表示法。  在邻接矩阵中,可以如下表示顶点和边连接关系:    !(https://oscimg.oschina.net/oscnet/fe38c2aff8c2a62f0d7ab71f55c1eb1cea
Stella981 Stella981
3年前
HugeGraph图数据库各类索引功能对比
HugeGraphDatabaseIndexHugeGraph图数据库的索引支持比较全面,图数据库的索引一般包括几方面:图索引/边索引(graphindex):主要用于加速获取顶点的关联边,一般使用邻接表或十字链表等方式,也可以使用hash索引。hugegraph使用的是邻接表。超级点索引(vertexcentricind
菜园前端 菜园前端
1年前
什么是图?
原文链接:什么是图?图是网络结构的抽象模型,是一组由边连接的节点。图可以表示任何二元关系,比如道路、航班等。在JavaScript中没有图,但是可以通过Object和Array来构建图。常用操作深度优先遍历广度优先遍历图的表示法邻接矩阵邻接表关联矩阵...
E小媛同学 E小媛同学
8个月前
快速上手:运营商三要素API集成指南
在这篇文章中,我们将指导您如何快速集成运营商三要素API,以便在您的应用程序中实现身份验证和运营商信息查询的功能。我们将提供一个简单的UI代码示例,以及如何在后端处理API请求和响应。
小万哥 小万哥
5个月前
NumPy 舍入小数、对数、求和和乘积运算详解
NumPy提供五种舍入小数的方法:trunc(),fix(),around(),floor(),ceil()。此外,它还支持对数运算,如log2(),log10(),log(),以及自定义底数的对数。NumPy的sum()和prod()函数用于数组求和与乘积,可指定轴进行计算,cumsum()和cumprod()实现累积求和与乘积。关注公众号"LetusCoding"获取更多内容。
一点一木 一点一木
1个月前
Cursor 、v0 和 Bolt.new:当今 AI 编程工具的全面解析与对比
本文对CursorAI、v0和Bolt.new三大AI编程工具进行了全面比较,分析其各自优势与局限性,帮助开发者在不同工作流中灵活应用。