赞
踩
图计算是专门针对图数据结构的处理
图的应用实例
传统的图计算算法存在的典型问题
常常表现出比较差的内存访问局限性
针对单个顶点的处理工作过少
计算过程中伴随着并行读的改变
解决这些典型图计算的解决方案:
为特定的图应用定制相应的分布式实现
基于现有的分布式计算平台进行图计算:如MapReduce,图计算是细粒度的多次迭代工作, 因此在MapReduce上性能较差
使用单机的图算法库:BGL、LEAD、NetworkX、JDSL、Stanford、GraphBase和FGL等,但对于大规模的图计算任务有很大局限性
使用已有的并行图计算系统,比如Paeallel BGL和CGM Graph,实现了很多并行图算法
通用的图计算软件:解决传统图计算存在的典型问题
是基于遍历算法的、实时的图数据库,如Neo4j、OrientDB、DEX、Infinite Graph等
以图顶点为中心的、基于消息传递批处理的并行引擎,如GoldenOrb、Giraph、Pregel、Hama
这些软件都是基于通用模型:BSP(Bulk Synchronous Parallel Computing Model)模型,也叫整体同步并行计算模型或者大同步模型
其通过网络连接起来的处理器,去完成图计算的并行任务,其包括了一系列的全局超步
一个超步的垂直结构图
Pregel是谷歌公司发布的一款商业图计算产品
谷歌在后Hadoop时代的新“三架马车”
有向图顶点
Pregel计算模型以有向图作为输入
有向图的每个顶点都有一个String类型的顶点ID
每个顶点都有一个可修改的用户自定义值与之关联
每条有向边都和其源顶点关联,并记录了其目标顶点ID
边上有一个可修改的用户自定义值与之关联
计算模型:BSP模型
顶点间消息传递
注意:Pregel没有采取以上两种方式,而主要采取消息传递模型
远程读取会带来高延迟,Pregel不需要远程读取就可以避免远程读取带来的高延迟
基于内存共享的模型的可扩展性不高,Pregel没有采用共享内存的方式,扩展性较好
Pregel计算过程
Pregel的计算过程是由被称为“超步”的迭代组成的
在每个超步中,每个顶点上面会并行执行用户自定义的函数
Pregel的迭代何时结束?
当所有顶点都处于非活跃状态,并且所有顶点都不在有消息传递时,结束算法
实例:求最大值的Pregel计算过程图
Pregel已经预先定义好一个基类:Vertex
- 在Vertex类中,定义了三个值类型的参数,分别表示顶点,边喝消息。每个顶点都有一个给定类型的值与之对应
- Pregel程序:编写Pregel程序时,需要继承Vertex类,并且覆写Vertex类的虚函数Compute()
- 每个顶点都运行相同的Pregel程序
- 每个顶点的状态都可修改,在同一超步中,状态修改后对该顶点立即可见,但对于其他顶点不可见
- 对整个过程中,唯一需要持久化的状态是顶点和边的对应的关联值
Pregel的消息传递机制
顶点之间的通讯是借助于消息传递机制来实现的,每条消息都包含了消息值和需要到达的目标顶点ID
在一个超步S中,一个顶点可以发送任意数量的消息,这些消息将在下一个超步(S+1)中被其他顶点接收
Combiner
Pregel计算框架在消息发出去之前,Combiner可以将发送往同一个顶点的多个整型值进行求和得到一个值,只需要向外发送这个“求和结果”,从而实现了由多个消息合并成一个消息,大大减少了传输和缓存的开销
实例
默认情况下,Prege计算框架并不会开启Combiner功能
当用户打算开启Combiner功能时,可以继承Combiner类并覆写虚函数Combine()
此外,通常只对那些满足交换律和结合律的操作才可以去开启Combiner功能
Aggregator:提供了一种全局通信监控和数据查看的机制
拓扑改变
如求最小生成树,一定会删除一些冗余的边,发生拓扑的改变
Pregel计算框架允许在Compute()函数中修改图的拓扑结构
对于全局拓扑改变,Pregel采用了惰性协调机制
发出改变请求,必须将某个请求发给顶点v,告诉其要删除这条边;可能有好几个顶点发出请求要求顶点v删除边
顶点v会收到多个这个请求,刚开始收到请求,顶点v不会对其进行协调;当改变请求到达目标顶点,并且目标顶点需要执行的时候,
才会对请求进行协调
对于本地的拓扑改变,是不会引发冲突的,顶点或边的本地增减能够立即生效,很大程度上简化了分布式编程
输入输出
Pregel的执行过程
在Pregel计算框架中,一个大型图会被划分成许多个分区,每个分区都包含了一部分顶点以及以其为起点的边
一个顶点应该被分到哪个分区上
是由一个函数决定的,系统默认函数为hash(ID) mod N,其中,N为所有分区总数,ID是这个顶点的标识符
Pregel用户程序的执行过程
1.选择Master、Worker
2.Master把图分为多个分区
3.Master把用户输入划分成多个部分
4.Master向Worker发送指令
5.所有Worker的节点都处于停机状态后,结束计算
容错性
Worker:一般在执行过程中,它的信息是保存在内存当中,包括
Worker会对自己所管辖的分区中的每个顶点进行遍历,并调节顶点上的Compute()函数,Compute参数包括
Worker:在Pretzel中,为了获得更好的性能,“标志位”和输入消息队列是分开保存的
为什么需要保存两份标志位和消息队列?
如果一个订单在超步S接收到消息,表示V将会在下一个超步S+1中(而不是当前超步S中)处于“活跃状态”
顶点v如何向顶点u发送消息?
Master
Master维护着关于当前处于 “有效”状态的所有worker的各种信息,包恬每个Worker的ID和地址信息,以及每个Worker被分配到的分区信息
Master指令
Master向所有处于有效状态的Worker发送相同的指令,然后等待Worker回应,在指定时间内某—个Worker没有回应,说明这个Worker已经失效了,Master会进入恢复的模式
在每个超步中,图计算的种工作,会在“路障(barrier)"之前结束
Master在内部运行了一个HTTP服务器来显示图计算过程中的各种信息
Aggregator
Pregel非常适合用来解决单源最短路径问题,实现代码如下
单源最短路径举例
超步0:顶点0开始向其他节点发送消息
超步1
Hama简介
Hama的安装过程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。