优秀参考:

graphx教程参考:https://www.jianshu.com/p/ad5cedc30ba4

pergel函数详细讲解:https://blog.csdn.net/hanweileilei/article/details/89764466

迪杰斯特拉原理简介:https://www.jianshu.com/p/ad5cedc30ba4

ps: 以最短路径为例子讲解

个人理解的pregel函数是通过模拟节点和节点之间的信息传递的过程,计算出想要的结果信息。比如最短距离、出度、入度等等....

可以当作节点和节点之间通过边发送消息来理解。在有向图中,某一个节点可以是源节点src,也可能是目标节点dst,以边的方向确定。

pregel函数参数:

  def pregel[A: ClassTag](initialMsg: A,maxIterations: Int = Int.MaxValue,activeDirection: EdgeDirection = EdgeDirection.Either)(vprog: (VertexId, VD, A) => VD,sendMsg: EdgeTriplet[VD, ED] => Iterator[(VertexId, A)],mergeMsg: (A, A) => A): Graph[VD, ED] = {Pregel(graph, initialMsg, maxIterations, activeDirection)(vprog, sendMsg, mergeMsg)}

 initialMsg: 节点的默认初始化信息,更新节点属性要调用vprog函数

maxIrerations:最大迭代次数

activeDiraction:控制sendMsg发送的方向,为out时,只有src->dst方向发送消息。

vprog:更新节点属性的函数。节点收到消息后,通过mergeMsg合并消息,然后通过vprog更新节点信息。

sendMsg:节点和节点之间发送的消息,以Iterator[(VertexID, Msg)]的格式发送,把消息Msg发送给VertexID。不发送则为Iterator.empty

mergeMsg:当接收到多条消息时,用mergeMsg函数来合并多条信息

在迭代过程中一直有活跃节点的概念,只有上一次迭代中活跃的节点才能在当前迭代中执行sendMsg。 使用initialMsg初始化节点的时候,所有节点都是活跃状态。

活跃顶点定义为:在上一次迭代中成功发送消息和成功收到消息的节点,这里指的消息不能为Iterator.empty。

以最短距离为例,代码如下:

    //被计算的图中 起始顶点idval srcVertexId = 1L val initialGraph = graph1.mapVertices{case (vid,(name,age)) => if(vid==srcVertexId) 0.0 else Double.PositiveInfinity}//调用pregelval pregelGraph = initialGraph.pregel(Double.PositiveInfinity,Int.MaxValue,EdgeDirection.Out)((vid: VertexId, vd: Double, distMsg: Double) => {val minDist = math.min(vd, distMsg)println(s"顶点${vid},属性${vd},收到消息${distMsg},合并后的属性${minDist}")minDist},(edgeTriplet: EdgeTriplet[Double,PartitionID]) => {if (edgeTriplet.srcAttr + edgeTriplet.attr < edgeTriplet.dstAttr) {println(s"顶点${edgeTriplet.srcId} 给 顶点${edgeTriplet.dstId} 发送消息 ${edgeTriplet.srcAttr + edgeTriplet.attr}")Iterator[(VertexId, Double)]((edgeTriplet.dstId, edgeTriplet.srcAttr + edgeTriplet.attr))} else {Iterator.empty}},(msg1: Double, msg2: Double) => math.min(msg1, msg2))

mapVertex函数初始化节点,源节点为0.0, 其他节点为正无穷。

调用pregel:

  1. 首先使用Double.PositiveInfinity 初始全部节点,vprog函数:val minDist = math.min(vd, distMsg)更新节点信息,结果是源节点为0.0, 其他节点为正无穷,所有节点为活跃状态。

  2. 第一轮迭代,所有节点发送消息,满足edgeTriplet.srcAttr + edgeTriplet.attr < edgeTriplet.dstAttr则发送成功(活跃节点),不满足则发送不成功(变为非活跃节点)。成功接受消息的节点变为活跃节点。消息内容为:边的权重+源节点属性值

    1, 节点1向节点2发送0+7->7
    2, 节点1向3发送0+9->9
    3, 节点1向6发送0+14->14
    4, 调用mergeMsg,合并消息。这里节点仅接收到一条消息,所有可忽略
    5, 调用vprog函数,更新节点信息。
    6, 活跃节点有:1,2,3,6

  3. 第二轮迭代,活跃节点调用sendMsg发送消息,重复上一步骤

    1, 节点1向2,3,6发送消息失败
    2, 节点2向3发送消息失败
    3, 节点2向4发送消息7+15->22
    4, 节点3向4发送消息9+11->20
    5, 节点2向6发送消息2+9->11
    6, 节点4调用mergeMsg合并消息,选取小值。调用vprog更新节点信息
    7, 节点6调用vprog更新节点信息

  4. ....... 第三轮迭代..... 第四轮迭代......

graphx中的pregel原理详解相关推荐

  1. 【转载】word2vec 中的数学原理详解

    文章目录 一.前言 二.预备知识 三.背景知识 四.基于 Hierarchical Softmax 的模型 五.基于 Negative Sampling 的模型 六.若干源码细节 原文传送门: wor ...

  2. 转:word2vec 中的数学原理详解

    1,目录和前言 https://blog.csdn.net/itplus/article/details/37969519 2,预备知识:逻辑回归.贝叶斯公式.霍夫曼树 https://blog.cs ...

  3. Python机器学习中的数学原理详解(补充勘误表)

    数学是机器学习和数据科学的基础,任何期望涉足相关领域并切实领悟具体技术与方法的人都无法绕过数学这一关.在一篇题为<放弃幻想,搞AI必须过数学关>的网文中,作者一针见血地指出想从事AI相关工 ...

  4. word2vec 中的数学原理详解(二)预备知识

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/peghoty/article/details/37969635 https://blog.csdn. ...

  5. word2vec 中的数学原理详解(三)背景知识

    word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Miko ...

  6. word2vec 中的数学原理详解(六)若干源码细节

    word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Miko ...

  7. word2vec 中的数学原理详解(一)目录和前言

    word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Miko ...

  8. word2vec 中的数学原理详解

    https://www.cnblogs.com/peghoty/p/3857839.html

  9. jQuery中getJSON跨域原理详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...

最新文章

  1. 搭建linux下eclipse php完美搭建开发php,搭建linux上的Eclipse+PHP编程环境
  2. SAP PM预防性维护
  3. 使用Windows远程桌面(mstsc)通过RDP协议访问Ubuntu/Debian服务器
  4. vue3.0中使用计算属性时报错
  5. 关于MSSQL存储过程中使用游标的一个小例子(学习)
  6. php Xdebug的安装与使用详解
  7. hill密码源代码c语言,古典密码(Hill加密算法)(示例代码)
  8. vivoy9s怎么设置返回键_vivoy9s怎么设置返回键 可以使用虚拟导航键
  9. Spring Boot 实际应用(三)发送邮件实现
  10. linux ubuntu 12.04 下默认是安装了openjdk的
  11. 穿透还原12.1新变种病毒样本
  12. 汽车在转型!福特中国的架构实践
  13. java json 本身_JSON以及Java转换JSON的方法(前后端常用处理方法)
  14. CENTOS安装后没有图形界面GUI,怎么办?
  15. 2020高销量蓝牙耳机推荐,十大平价最受欢迎蓝牙耳机排行榜
  16. Redis数据库(二)
  17. java电话簿_JAVA实现简单电话簿功能
  18. 运算放大器(运放)介绍
  19. 云原生系列六:容器和Docker
  20. 计算机硬盘是输出还是输入,输入输出

热门文章

  1. MySQL跨不同数据库创建视图
  2. 龙蜥专场精彩回放来了!10位技术大咖、242位开发者相聚
  3. 代码保护软件VMP指令中包含了函数调用
  4. 关于Sublime text 2中Emmet的安装
  5. MySQL软件常见操作
  6. 火云开发课堂 - 《Shader从入门到精通》系列 第六节:在Shader中使用纹理动画
  7. 命悬一线,工程灾难预防和处理--《进入空气稀薄地带》笔记
  8. H5实现摇一摇技术总结
  9. 从王者荣耀看设计模式(七.装饰者模式)
  10. app架构图,写给Android开发的小程序布局指南,讲的明明白白!