一.前言
1.Natural Graphs(如社交网络,网页)
特点:幂律分布
面临的挑战:高维度的点和低质量的分区策略
2. Pregel: Pregel是一个同步的,每个节点向外传播消息的算法,每一个节点都会根据接收到的信息改变自己的Rank,然后将自己的Rank分别发送给所有的邻接点,所有接收的信息都会被合并成一条数据。
缺点:对于邻居数很多的顶点,它需要处理的消息非常庞大,所以对于符合幂律分布的自然图,这种计算模型下很容易发生假死或者崩溃.
3.GraphLab: GraphLab使用异步的共享内存的分布式处理方法,所谓的共享内存就是每一个节点都可以共享另外的节点和边的信息,而不需要接收发送。所有的节点都可以共享当前节点、邻边、以及所有不考虑边方向的邻接点的所有信息。
缺点:会导致节点太多地进行对周边节点信息的调用,而且在异步的过程中,一个节点执行的时候其他邻接点必须处于上锁的状态,会导致效率降低。
4.总结:Pregel跟GraphLab都是用哈希函数随机分配,所以会导致很多节点被分配到很差的位置,数据分布不平衡,单个机器的存储容量可能会不够用,是不适合处理这种Natural Graphs。
二.PowerGraph创新点
PowerGraph针对Natural Graphs ,主要的创新有两点
第一,采用点切分策略,来保证整个集群的均衡性,该策略对大量密率图分区是非常高效的。
第二,提出了GAS计算模型,将高维度的点进行并行化。
1.基于点的切分策略
(1)Vertex-Cut VS Edge-Cut
边切分过程:从(a)图中可以看出,切分的过程中,总共有AB,BC,CD三条边被切开,保存到3台机器后,边的总数目由原来的3条,变成了6条,多了一倍,外加5个节点副本。
点切分过程:从(b)图中可以看出同样是4个节点的图,将B、C节点切分开来,存储到3台机器后,得到右边这个图,可以看出边的数目还是3台,只多了两个节点的副本。
点切分优点:对于Natural Graphs ,边的数量远大于顶点数量,基于点切分的分区策略相比边切分的分区策略会减少边的副本的维护,节省更多内存空间。
(2) 点切分方法(三种切分方法)
1)随机边分配策略:按照点切分的方式,随机放置边
这里数据集选用的是Twitter数据集,有410w个顶点,14亿条边 。横坐标是实际集群中机器的数目,纵坐标表示1个顶点期望跨的机器数目,蓝色的线表示表示理论推测期望值,红线是实际随机边放置的曲线图。可以看出期望值和理论值之间基本能够匹配,所以针对随机边放置策略,就可以做到精确的估计内存和通信开销。
2)贪婪的点切分策略
切分过程:新加进来的边,它的某个节点已经存在于某台机器上,就将该边分到对应的机器上,比如在1号机器上已经存在AB这条边,2号机器上已经存在BC这条边,那么当一条新的边AD在要加进来时,发现A节点已经在1号机器上,所以就将该边放置到1号机器上。如果再来一条边BE,发向两台机器上都存有B节点,这时候贪婪策略会选择机器中分配的边最少的机器进行分配。
关于贪婪边切分策略,有两种实现方式:
a.贪婪协同边分配
协同边放置策略,这需要维护一张全局的顶点放置的历史纪录表,在执行贪心切分之前都要去查询这张表,在执行的过程中需要更新这张表。协同点切分的策略,它的特点是慢但点切分的质量高
b.Oblivious(遗忘)的贪婪策略
Oblivious的贪婪策略,它是一种近似的贪婪策略,不需要做全局的协同。贪婪算法的运行不依赖每一台机器,不需要维护全局的记录表,而是每台机器自己维护这张表,不需要做机器间的通信。这种策略速度快,但切分质量比较低
(3)三种点切分分区策略的性能的对比(平均的机器跨度和构建时间)
结论:随机边分配策略构建时间短,但平均的机器跨度最大;贪婪协同边分配算法平均机器跨度最小,但构建时间最长;而Oblivious(遗忘)的贪婪策略能够在平均机器跨度和构建时间上获得一个折中的性能。
2. GAS模型:基于点分割的图计算抽象成的通用计算模型
当图数据被分割后进入不同计算节点进行计算的时候,由于在不同节点中对于同一个节点有可能有多个副本,这个节点副本之间如何进行数据交换协同也成为了一个难题,GAS模型用于解决这个难题。
功能介绍:Gather: Gather阶段的主要工作主要发生在各个计算节点,搜集这个计算节点图数据中某个顶点的相邻边和顶点的数据进行计算(例如在PageRank算法中计算某个顶点相邻的顶点的数量)。
Apply: Apply阶段的主要工作是将各个节点计算得到的数据(例如在PageRank算法中各计算节点计算出来的同一顶点的相邻顶点数)统一发送到某一个计算节点,由这个计算节点对图的节点的数据进行汇总求和计算,这样就得到这个图顶点的所有相邻节点总数。
Scatter: Scatter阶段的主要工作是将中心计算节点计算的图顶点的所有相邻节点总数发送更新给各个计算节点,这些收到更新信息的节点将会更新本计算节点中与这个图顶点相邻的顶点以及边的相关数据。
PowerGraph中使用PageRank算法的过程: i表示目标节点, Wji表示从j点到i点的权值,对目标节点求PageRank值,
Gather阶段,先求i所有邻居节点的权值,用户自定义一个sum操作,统计所有邻居节点的权值之和;
Apply阶段,利用上一阶段的sum值加上一个偏置值,计算得到i的新的权值,更新i点的权值;
Scatter阶段如果i值被修改,就触发相应的邻居节点j重新计算。
当顶点按点切分方式被分到4台机器之后,在多个节点上指派一个为Master(主节点),其余的为Mirror(从节点),Mirror(从节点)上可以运行Gather程序来收集所有邻居的信息,并进行sum (聚合计算)后发送给Master,Master(主节点)上的Gather程序收集这些结果,最终将这个结果应用到Apply程序上,得到新的节点状态。然后通过Scatter程序将新的节点状态广播给各个Mirror(从节点),Mirror(从节点)进而广播给各个邻居。
三. Pregel、GraphLab和PowerGraph性能对比
Pregel、GraphLab和PowerGraph使用人工合成的Power-law Graph运行PageRank算法,可以看出PowerGraph不仅通信开销小而且运行时间短,对高维度点也有很强的健壮性。
PowerGraph使用真实的Twitter数据集运行PageRank算法,通信开销和运行时间相比GraphLab和Pregel都非常低。
四.参考资料
[1] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.258.7712
[2] https://blog.csdn.net/qq_21125183/article/details/80679689
[3] https://blog.csdn.net/qq_38265137/article/details/80547763
[4] https://www.jianshu.com/p/1b0e2ec54fae
[5] https://www.jianshu.com/p/f088bf589820
五.注
资料整理来源于网络,如有侵权,请联系删除!