graphx中Pregel函数详解

article/2025/9/7 10:47:59

1、PregelAPI

图本质上是一种递归的数据结构,其顶点的属性值依赖于其邻接顶点,而其邻接顶点属性又依赖于其邻接顶点,许多重要的图算法通过迭代计算每个顶点的属性直到到达定点条件,这些迭代的图算法被抽象成一系列图并行操作。

 

2、Pregel的计算模型

主要分为三个函数:
1、vertexProgram函数

2、sendMessage函数

3、messageCombiner函数

 

在进行了解之前,先对相关知识进行粗略的了解:

 

知识点1:在第一次迭代的时候,所有的顶点都会接收到initialMsg消息,在次轮迭代的时候,如果顶点没有接收到消息,verteProgram就不会被调用。

 

知识点2:对相关参数的了解(详细看黑体部分)

VD:顶点的数据类型。

ED:边的数据类型

A:Pregel message的类型。

graph:输入的图

initialMsg:在第一次迭代的时候顶点收到的消息。

maxIterations:迭代的次数

vprog:用户定义的顶点程序运行在每一个顶点中,负责接收进来的信息,和计算新的顶点值。在第一次迭代的时候,所有的顶点程序将会被默认的defaultMessage调用,在次轮迭代中,顶点程序只有接收到message才会被调用。

sendMsg:用户提供的函数,应用于边缘顶点在当前迭代中接收message

mergeMsg:用户提供定义的函数,将两个类型为A的message合并为一个类型为A的message。(thisfunction must be commutative and associative and ideally the size of A shouldnot increase)

 

其中用到的Graph类的API

mapReduceTriplets():计算每个节点的相邻的边缘和顶点的值,用户定义的mapFunc函数会在图的每一条边调用,产生0或者多个message发送到这条边两个顶点其中一个当中,reduceFunc函数用来合并map阶段的输出到每个节点。

 

3、实例

 以下通过spark1.0.1上的最短路径来举个例子.

源码的路径为graphx包的lib文件夹内。

以下为计算最短路径的基本的图信息(图为有向图)。







主要函数:

 

SPMap:定义一个Map[VertexId,Int]类型的Map函数,别名为SPMap,函数的属性Key为VertexId类型,其实也就是scala中的Long类型,它在图中的别名是VertexId,还有Int类型的路径的长度。

 

makeMap函数:用来初始化图的属性信息。

 

incrementMap函数:主要用于将自身的属性值(即源顶点属性值)中路径的长度加1,然后和目标定点的属性值比较,下面会详细描述。

 

addMaps函数:比较源顶点属性和发送信息过来顶点的属性取最小值。

 

下面是ShortestPaths.scala的run函数:


run函数传入的参数为:已经构造好的图graph和landmarks

landmarks:是我们要求最短路径的顶点的集合。

 

初始化节点属性:

程序的第一步初始化图的节点的属性,为了方便举例,假设我给定的landmarks的集合为{1}。

注意:mapVertices函数是图的基本常用函数之一,它作用于graph中的每一个顶点。


在Graph类中,它是这么定义的:


程序的API上的定义为:通过map函数转换图中每个节点的属性值,VD2代表的是新的数据类型。(嗯,我英文不是很好,就大概这个意思哈)。

 

根据程序的意思,初始化图,将landmarks中的顶点初始化为Map(1-> 0),即自身到自身的距离为0,其余的顶点属性初始化为Map()。

 

接下来定义一个initMessage它的值为Map(),作用是在Pregel第一次运行的时候,所有图中的顶点都会接收到initMessage。

 

在接下来定义了一个vertexProgramProgram函数和sendMessage函数。

在这里,vertexProgram函数调用了addMaps函数,通过程序显而易见的是:两个消息来的时候,取它们当中路径的最小值。其实在下面也就是相当于messageCombiner函数。


SendMessage函数的原理是:

1、通过incrementMap函数把源顶点的距离属性加1得到新的属性值newAttr。

2、新的属性newAttr和原来的属性比较取最小值,如果新的属性是最小的,则通过Iterator发送该信息到目标顶点的函数。该信息的结构为(dstId,newAttr),否则不发送。

 

最后把以上信息传递给Pregel去执行。

 

执行的流程简图如下:

1、初始化图的属性值




2、调用sendMessage函数:

调用sendMessage函数,包含出度的顶点才能发送消息。


首先第一步,假设从顶点1开始:

步骤和上面说的一样,顶点1的距离属性值加1即从(1,0)变为(1,1),和顶点2的属性值比较(具体看代码吧),得出顶点1的属性值最小,满足发送的条件,发送消息Iterator(2,(1,1))。

顶点4、5类似,顶点2、4、5由于他们之间的属性值为Map(),所以不满足发送条件,顶点3没有出度,所以不发送消息。

点1->2:(2,(1,1))

点1->4:(4,(1,1))

点2->3:empty

….

 




3、调用vertexProgram函数:

在看API文档或者代码可以知道,vertexProgram在第一次在初始化的时候,会在所有顶点上运行,之后,只有接收到消息的顶点才会运行vertexProgram,所以接下来容易可以知道,只有顶点2,4,5运行程序,并改变他们自身的属性值。



4、然后类似的重复步骤2、3直到图中的message为0,或者 满足我们给定的迭代次数,

 

嗯,怎么知道会有迭代次数呢?往下看

 

接下来就简略的看看Pregel的代码,看看他是怎么运行的,由于我还在初步的学习阶段,仅供参考,如果有好的理解可以交流交流。

从传入的参数可以知道,我们可以通过maxIterations指定迭代次数,mergeMsg函数也就是刚才所说的addMaps函数。

 


接下来就是主要的实现逻辑:


看了第一句,通过调用graph的mapVertices函数就初始化所有图的属性信息,然后调用mapReduceTriplets函数,它返回一个VertexRDD[A]类型的RDD,mapReduceTriplets也是常用的函数之一。

 

注意:由于mapReduceTriplets里面的代码个人觉得过于复杂,看了很久没看懂,如果有兴趣希望可以交流一下。

 

接下来就是我个人的假设阶段了:

通过注释可以看出

message应该就是接收到消息的顶点,那activeMessages就是顶点的数量了。

接下来通过迭代

通过图的所有顶点和接收到消息的顶点进行内连接,然后运行顶点的vertexProgram函数,即刚才我们所说的只有接受到消息的顶点才会运行vertexProgram函数。得到新的newVerts集合。

图和newVerts进行outerJoinVertices把newVerts的新信息update到图中。

然后继续发送新的消息。

判断activeMessages 和 指定的迭代次数

继续迭代直到activeMessages为零和满足设定的迭代次数值为止。



http://chatgpt.dhexx.cn/article/KT7GAbIK.shtml

相关文章

Pregel与图迭代

graphx是如何实现Pregel迭代操作,我们应该如何使用该模型。先看下pregel接口源码: 接口中各参数的含义已在图中进行注释,所以此处不再赘述。简单介绍下源码中的参数说明: 剖析 pregel模型提供了消息收集方向、迭代次数、初始化消…

Google图算法引擎Pregel介绍

参考文献点击打开链接 【前言:有一种说法[1]是Google的程序里面80%用的是MapReduce,20%用的是Pregel。今天就来介绍一下这个Pregel。想要深入研究的同志们,可以参考最新的SIGMOD 2010 ppt[2]。】 简介 Pregel是一个用于分布式图计算的计算…

图计算: 使用 Spark Graphx Pregel API 处理分层数据

今天,分布式计算引擎是许多分析、批处理和流应用程序的支柱。Spark提供了许多开箱即用的高级功能(pivot、分析窗口函数等)来转换数据。有时需要处理分层数据或执行分层计算。许多数据库供应商提供诸如“递归 CTE(公用表达式&#…

pregel 与 spark graphX 的 pregel api

[原文](https://blog.csdn.net/u013468917/article/details/51199808)简介 在Hadoop兴起之后,google又发布了三篇研究论文,分别阐述了了Caffeine、Pregel、Dremel三种技术,这三种技术也被成为google的新“三驾马车”,其中的Pregel…

Pregel体系结构

在Pregel计算框架中,一个大型图会被划分成许多个分区,每个分区都包含了一部分顶点以及以其为起点的边 一个顶点应该被分配到哪个分区上,是由一个函数决定的,系统默认函数为hash(ID) mod N,其中,N为所有分区…

Spark GraphX 中的 pregel函数(转载)

文章目录 pregel函数源码 与 各个参数介绍:案例: 求顶点5 到 其他各顶点的 最短距离pregel原理分析 一篇关于 Spark GraphX 中 pregel函数 的笔记,通过一个小案例将pregel函数理解透彻。 pregel函数源码 与 各个参数介绍: def…

03 graphx 从 SSSP 来看 pregel

前言 呵呵 最近刚好有一些需要使用到 图的相关计算 然后 在其他文章中找到了一篇 关于最短路径的graphx计算的代码 spark graphx 最短路径及中间节点 呵呵 很久没有用这些东西了, 虽然只是简单的使用, 但是还是要 复习一下, 稍微理解一下 他的执行方式 pregel 相关论文 …

ArangoDB(四)Pregel

arango pregel.status()返回值 localhost:8529_system> pregel.status(1099521660554) {"state" : "done","gss" : 7,"totalRuntime" : 8.389497518539429,"aggregators" : {},"sendCount" : 392647,"re…

graphx中的pregel原理详解

优秀参考: graphx教程参考:https://www.jianshu.com/p/ad5cedc30ba4 pergel函数详细讲解:https://blog.csdn.net/hanweileilei/article/details/89764466 迪杰斯特拉原理简介:https://www.jianshu.com/p/ad5cedc30ba4 ps: 以最…

Pregel模型

简介 在Hadoop兴起之后,google又发布了三篇研究论文,分别阐述了了Caffeine、Pregel、Dremel三种技术,这三种技术也被成为google的新“三驾马车”,其中的Pregel是google提出的用于大规模分布式图计算框架。主要用于图遍历&#xf…

Spark Graphx Pregel(pregel参数详解,pregel调用实现过程的详细解释)

Spark Graphx Pregel 一.Pregel概述1.什么是pregel?2.pregel应用场景 二.Pregel源码及参数解释1.源码2.参数详细解释(1)initialMsg(2)maxIteration(3)activeDirection(4)…

2020.11.26课堂笔记(sparkGraphx算法之pregel)

参考博客:https://blog.csdn.net/hanweileilei/article/details/89764466 大佬博客写的很详细,不用继续看这篇了,随便写一些记录一下。 Pregel框架: Pregel是一种面向图算法的分布式编程框架,采用迭代的计算模型&…

Pregel(图计算)技术原理

图计算简介 图结构数据: 许多大数据都是以大规模图或网络的形式呈现。许多非图结构的大数据,也常常会被转换为图模型后进行分析。图数据结构很好地表达了数据之间的关联性。关联性计算是大数据计算的核心——通过获得数据的关联性,可以从噪…

python bar函数

bar(left, height, width, color, align, yerr)函数:绘制柱形图。left为x轴的位置序列,一般采用arange函数产生一个序列;height为y轴的数值序列,也就是柱形图的高度,一般就是我们需要展示的数据;width为柱形…

C++ 函数模板

函数模板是通用的函数描述,它们使用泛型来定义函数,其中的泛型可用具体的类型替换。通过将类型作为参数传递给模板,可使编译器生成该类型的函数。由于模板允许以泛型(而不是具体类型)的方式编写程序,因此有…

lead窗口函数

lead函数在Impala中可以配合over使用,lead函数有三个参数 lead(property,num,default) 第一个参数「property」标识想查询的列,「num」标识相对于当前行的第num行,第三个参数是默认值。 举例: -- 建表 CREATE TABLE test(id s…

C++ 仿函数

文章目录 1.由来2.定义3.实例参考文献 1.由来 我们先从一个非常简单的问题入手,来了解为什么要有仿函数。 假设我们现在有一个数组,数组中存有任意数量的数字,我们希望能够统计出这个数组中大于 10 的数字的数量,你的代码很可能…

心形函数的几种表达式

用两个函数表示: f(x)sqrt(1-(abs(x)-1)^2) h(x)-2*sqrt(1-0.5*abs(x)) 也可以根据图中的q(x)画出心形的内部: q(x)(f(x)-h(x))/2*cos(200*x)(f(x)h(x))/2 带入得: 用一个函数表示,我拟合了很久才画出来的: f(x)…

共轭函数

共轭函数在最近火的不行的Gan生成对抗神经网络进阶版本的数学推理中有着神奇的作用,因此在这边记录下。 共轭函数的定义为: f ∗ ( t ) max ⁡ x ∈ dom ⁡ ( f ) { x t − f ( x ) } f ^ { * } ( t ) \max _ { x \in \operatorname { dom } ( f ) }…

高斯函数解析

高斯函数广泛应用于统计学领域,用于表述正态分布,在信号处理领域,用于定义高斯滤波器,在图像处理领域,二维高斯核函数常用于高斯模糊,在数学领域,主要用于解决热力方程和扩散方程。 https://blo…