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)
Graphx利用了Spark这样了一个并行处理框架来实现了图上的一些可并行化执行的算法。
引入triplets,主要是和Pregel这个计算模型相关;
图本身是graphx中一个非常重要的概念。
graph中重要的成员变量分别为
为什么要引入triplets呢,主要是和Pregel这个计算模型相关,在triplets中,同时记录着edge和vertex. 具体代码就不罗列了。
函数分成几大类
看到网上大牛写的一篇很好的GraphX的实现剖析:
http://www.cnblogs.com/hseagle/p/3777494.html