当前位置: 首页 > 工具软件 > GraphX > 使用案例 >

GraphX的基本介绍

杨飞飙
2023-12-01

1、GraphX的需要懂的三个问题:

(1)提供给用户的API,各家提供的差不多

(2)图在分布式系统中如何存储?每个机器存哪个边?哪个点?

(3)分布式图是如何通信的呢?(边点确定时)

2、GraphX图引擎

基于Spark,其存的点和边叫分别较做EdgeRDD和VertexRDD,相比于RDD,附加了元信息。

分布式的存储方式会影响后期的执行效率;边和点的存储会影响后期的算法执行。

3、GraphX如何构造图

1)分两步:(1)构造EdgeRDD(2)构造VertexRDD

比如使用GraphLoader加载图信息:(建议)

val graph = GraphLoader.edgeListFile(sc,"da/a.txt")

分析源码就知道先构造的EdgeRDD,然后在构造VertexRDD。(后期会有源码剖析)

4、分割

边分割:每个顶点全部数据在一个机器上,缺点是在读边时会存在跨机器通信。GraphX跨机器通信是Shuffle,是粗粒度的。但是GraphX不支持边分割。

点分割:点跨机器,点还是相同的。当点数据发生变化时,edgeparption都会向VertexPartition更新。好处是边没有冗余,但是点存在冗余。这样点可以并行处理,符合MP用法,所以GraphX采用点分割。

目前点切割有4中方法,分别为:

1D/2D/Random /Canonical Random Partition

1D:把srcID相同的边放在一个partition里

Random:随机存

Canonical:双向边都放在一partition

2D:在1D中若某一个srcID度很大,第一次Shuffle时候很有效,但是在第二次Shuffle时候开销非常大,原因是DSTID是不受控制的。

5、分布式环境的执行?执行

GraphX采用的点分割,在GraphX中提供了Pregel接口,其是BSP接口。对于Pregel接口,其每一次迭代会有多少次Shuffle?两次,分别对边的分布及点的分布影响

第一次是:所有的Edge向所有的VertexRDD汇聚消息时。(EdgePartition与VertexPartition时不同的)

第二次是:每个Vertex更新完自己的信息根据route table向每一个有需要的EdgePartition中发送信息。

这个Shuffle是不可避免的,每次Pregel BSP有两次Shuffle。总会有消息传递的,所不同的是消息传递的是多是少?取决于边的数量、算法的收敛速度、把迭代的边或点进行优化。

6、Spark GraphX概述

GraphX是一个分布式图处理框架,基于Spark平台提供了对图计算和图挖掘简洁易用且丰富多彩的接口,极大的方面了用户对分布式图处理的需求。

图的分布式 或者并行处理其实是把图分成很多的子图,然后分别对这些子图进行计算,计算的时候可以分别迭代分阶段的计算,即对图进行并行计算。

需要知道的是图和表(矩阵)是可以相互转化的。

起初,MapReduce的本身特性很适合处理图计算,但是由于中间迭代过多,以及磁盘落地等因素,使得MapReduce处理图计算的效率过低。

目前的图计算框架狠多,来自Google的Pregel、GraphLab等,都是基于BSP的,

BSP(Bulk Synchronous Parallel)

  1. 作用于的每个顶点并行完成自己的处理逻辑 vertexProgram
  2. 消息发送,即每个节点向其相邻节点广播其内容更新 sendMessage,并等待所有节点完成信息交换(超步)
  3. 用更新的消息重新进行顶点程序的计算; 
注:存在由木桶原理引起的性能问题(顶点、边分布不均)。

Graphx利用了Spark这样了一个并行处理框架来实现了图上的一些可并行化执行的算法

引入triplets,主要是和Pregel这个计算模型相关;

图本身是graphx中一个非常重要的概念。

成员变量

graph中重要的成员变量分别为

  1. vertices
  2. edges
  3. triplets

为什么要引入triplets呢,主要是和Pregel这个计算模型相关,在triplets中,同时记录着edge和vertex. 具体代码就不罗列了。

成员函数

函数分成几大类

  1. 对所有顶点或边的操作,但不改变图结构本身,如mapEdges, mapVertices
  2. 子图,类似于集合操作中的filter subGraph
  3. 图的分割,即paritition操作,这个对于Spark计算来说,很关键,正是因为有了不同的Partition,才有了并行处理的可能, 不同的PartitionStrategy,其收益不同。最容易想到的就是利用Hash来将整个图分成多个区域。
  4. outerJoinVertices 顶点的外连接操作

看到网上大牛写的一篇很好的GraphX的实现剖析:

http://www.cnblogs.com/hseagle/p/3777494.html








 类似资料: