关于Graphx中的pregel的API理解

由于在做一些图论相关的工作,平时工作中使用Spark比较多,所以决定学习一下Graphx,对以后挖掘数据会比较有帮助。

Graphx的入门之SSSP(单源点最短路径)

    val inintialGraph: Graph[Double, PartitionID] = graph.mapVertices((id, _) => if (id == sourceId) 0.0 else Double.PositiveInfinity)

在上面的图中,我们假设graph为已经定义好的图结构,包括定义了vertex和edge,在这一步初始化计算最短路径所需要的图

在这里,对每一个Vertex做了一个map,即吧所有的点map为源点到这个点的距离,初始化为本点为0,其他的都初始化为无穷大。

val sssp: Graph[Double, PartitionID] = inintialGraph.pregel(Double.PositiveInfinity)(
      (id, dist, newDist) => math.min(dist, newDist),
      triplet => {
        if (triplet.srcAttr + triplet.attr < triplet.dstAttr) {
          Iterator((triplet.dstId, triplet.srcAttr + triplet.attr))
        } else {
          Iterator.empty
        }
      },
      (a, b) => math.min(a, b)
    )
    println(sssp.vertices.collect().mkString("\n"))
    sc.stop()

在这一步计算sssp。

这里需要看一下pregel的接口,通过看Spark的Graphx的Pregel源码可以看到:

def apply[VD: ClassTag, ED: ClassTag, A: ClassTag]
   (graph: Graph[VD, ED],
    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是个科里函数,第一个括号内为初始化需要的参数比如初始化的message,迭代次数等,第二个括号内为pregel在运行过程中所需要的三个处理的函数。

vprog

sendMsg

mergeMsg

其中第一个vprog函数,为Vertex Program 意思就是对节点的操作函数,看源码可以看到

var g = graph.mapVertices((vid, vdata) => vprog(vid, vdata, initialMsg)).cache()
在第一次迭代的时候通过之前的initialMsg来初始化每个节点的信息。

接下来源码为:

var messages = GraphXUtils.mapReduceTriplets(g, sendMsg, mergeMsg)
可以看出这里是一个类似于mapReduce的操作,其中sendMsg充当map函数,mergeMsg充当reduce函数,结合sssp计算过程,在每一次迭代过程中,map函数的作用是如果本次的路径计算结果小于这个vertex上已有的距离的值,就发送这个距离,否则发送一个空置。而在reduce阶段,对于每一个vertex来说,可能一个vertex接受到多个map的结果,需要做的是对所有的值去取一个最小的距离。也就是上面代码中实际的math.min(a,b)

完整的源码可以看文章的末尾。所以根据这里的分析,我们就可以得出这三个函数的实际作用了。

1、vprog用于更新此时active的vertex的值。

2、sendMsg用于操作每一个active的Vertex的出度方向的Edge,决定发送message是否为空。

3、mergeMsg为对下一个进入active状态的Vertex来说,可能接收到多条message,如何处理这多条message,最终只留下一个message。

这里可能比较容易混淆vprog和mergeMsg的作用,两者的区别在于处理对象的不同,mergeMsg处理的是一个Vertex上接收到的多个message,而vprog则是对于本次迭代开始的时候,根据接收到的message和此时Vertex上的attr属性来说,如何更新Vertex的attr。


由此,便可以明白pregel的整个处理流程。此处是计算sssp,可以根据这样的一个架构计算PageRank了。


【参考文章】

http://blog.csdn.net/u013468917/article/details/51199808

http://www.cakesolutions.net/teamblogs/graphx-pregel-api-an-example


【Graphx的pregel的源码】

  def apply[VD: ClassTag, ED: ClassTag, A: ClassTag]
     (graph: Graph[VD, ED],
      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] =
  {
    require(maxIterations > 0, s"Maximum number of iterations must be greater than 0," +
      s" but got ${maxIterations}")

    var g = graph.mapVertices((vid, vdata) => vprog(vid, vdata, initialMsg)).cache()
    // compute the messages
    var messages = GraphXUtils.mapReduceTriplets(g, sendMsg, mergeMsg)
    var activeMessages = messages.count()
    // Loop
    var prevG: Graph[VD, ED] = null
    var i = 0
    while (activeMessages > 0 && i < maxIterations) {
      // Receive the messages and update the vertices.
      prevG = g
      g = g.joinVertices(messages)(vprog).cache()

      val oldMessages = messages
      // Send new messages, skipping edges where neither side received a message. We must cache
      // messages so it can be materialized on the next line, allowing us to uncache the previous
      // iteration.
      messages = GraphXUtils.mapReduceTriplets(
        g, sendMsg, mergeMsg, Some((oldMessages, activeDirection))).cache()
      // The call to count() materializes `messages` and the vertices of `g`. This hides oldMessages
      // (depended on by the vertices of g) and the vertices of prevG (depended on by oldMessages
      // and the vertices of g).
      activeMessages = messages.count()

      logInfo("Pregel finished iteration " + i)

      // Unpersist the RDDs hidden by newly-materialized RDDs
      oldMessages.unpersist(blocking = false)
      prevG.unpersistVertices(blocking = false)
      prevG.edges.unpersist(blocking = false)
      // count the iteration
      i += 1
    }
    messages.unpersist(blocking = false)
    g
  } // end of apply



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
⼤数据技术概述 ⼤数据的概念 4V:⼤量化volume、价值密度低value、快速化velocity、多样化variety。⼤量化每两年增长⼀倍,到了2020年,全球就会有35ZB数据 量,Byte->KB->MB->GB->TB->PB->EB->ZB。多样化,结构化数据,保存在关系数据库,具有规范的⾏和列的结构数据,只占⼈类数据 量10%不到。90%是⾮结构化数据,存储在⾮关系数据库。快速化,数据有价值必须快速处理,⼀秒定律,数据从⽣成到决策响应仅需 要⼀秒,时间延长不会有商业价值,例如推荐系统。价值密度低,⼤量数据有价值的⽐较少,但是单点价值⽐较⾼ ⼤数据影响 数据库专家jim gray,⼈类从诞⽣以来,经历了四种研究范式。2010年后,进⼊⼤数据时代以后,是以数据为⼼的研究范式。第⼀种实 验,⼀开始科研就是做实验观察;第⼆种理论,发明了⽜顿定律、⼏何理论由理论去研究科学问题;第三阶段,⼀九四⼏年计算机开始发明 以后,进⼊以计算为⼼的时代,靠计算可以帮助我们解决相关的科学问题。以计算为⼼,事先已经知道问题是什么,以数据为⼼事先 问题不知,只有⼀堆数据,从⼤量数据去发现问题,再靠数据去解决问题,全部靠数据去驱动。我们思维⽅式⾃从⼤数据时代到来后,发 ⽣了值的变迁。全样⽽⾮抽样,以前采⽤统计学抽样⽅式(存储设备贵、存储数据少、CPU和技术能⼒不强、⽆法短时间迅速计算),⼤数 据时代有⾜够能⼒存储⾜够算例去计算。效率⽽⾮精确,不苛求精确度,全样数据不存在误差放⼤问题,追求速度。相关⽽⾮因果,追求相 关性,⽐如相关性是推荐系统的核⼼,有相关性⾜够带来商业价值。 ⼤数据的关键技术 数据流程包括数据采集、数据存储与管理、数据处理与分析、数据隐私与安全。⼤数据的关键技术两⼤核⼼,分布式存储和分布式处理,解 决数据存储和数据⾼校计算问题。分布式存储:⾕歌GFS和开源实现HDFS->⾕歌Big Table和开源版本Hase->NoSQL(键值、列族、图 形、⽂档数据库)->NewSQL。分布式处理:MapReduce->Spark->Flink。 ⼤数据计算模式 不同的计算模式需要使⽤不同的产品。第⼀个批处理,MapReduce和Spark⾯向批处理。第⼆个流计算,流数据像溪⽔⼀样不断到达,每 次量可能不⼤,但是会连续不断的到达。流数据要求实时处理,给出实时响应(秒级或毫秒级),否则分析结果会失去商业价值。流计算代 表产品有S4、Storm、Flume、Puma、DStream、银河流数据处理平台。第三种模式是图计算,有些应⽤场景⽐较适合图来建模,⽐如 地理信息系统(快递)、微博微信社交群体,⽹友是点,点赞就建⽴边,会发现哪些⼩朋友圈⽐较紧密。图计算代表软件:Google PregelGraphX、Giraph、Hma、PowerGraph、GoldenOrb。第四种场景是查询分析计算,代表产品:Google Dremel、Hive、 Cassandra、Impala。 ⼤数据技术之Hadoop Hadoop⽣态系统图 HDFS存储⾮结构化数据,⾯向批处理,YARN资源调度和管理框架,计算所需要底层内部CPU资源。MapReduce数据的计算。数据仓库 Hive本⾝不保存数据,数据保存在底层HDFS,本⾝是编程接⼝,把你写的SQL语句⾃动转换对HDFS查询分析,得到结果。Pig数据流处 理,数据清洗转换。Mahout数据挖掘的算法库,实现常⽤数据挖掘算法(分类、聚类、回归等),调⽤接⼝,传⼊参数,减少⼯作量,针 对海量数据进⾏数据挖掘分析。Ambari⾃动化的安装部署配置管理Hadoop集群的。Zookeeper分布式协作服务,选管家等,专门做分布 式协调⼀致性⼯作。HBase实时性计算,分布式数据库。Flume⽇志采集,Sqoop数据库ETL(抽取、转换、加载),完成Hadoop系统组 件之间的互通,Hadoop系统组件当数据和关系数据库当数据之间相互导⼊导出(HDFS数据可以导⼊MySql当去)。 MapReduce,Map函数和Reduce函数,编程容易,屏蔽底层分布式并⾏编程细节。采⽤分⽽治之思想,并⾮所有任务都可以分⽽治之。 YARN实现⼀个集群多个框架,例如⼀千台机器,同时部署了三个框架(MapReduce、Storm、Impala),会产⽣打架,有三个管家去底 层强CPU资源。如果三个产品只接受⼀个管家,就不会打架。出现了YARN资源调度和管理框架。 ⼤数据技术之Spark Spark架构图 Spark Core:包含Spark的基本功能;尤其是定义RDD的API、操作以及这两者上的动作。其他Spark的库都是构建在RDD和Spark Core 之上的。 Spark SQL:提供通过Apache Hi

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值