分布式图处理系统(GraphLab、PowerGraph以及同步BSP模型的Pregel)主要有两种执行模式。一种是同步执行模式,还有一种是异步执行模式。同步模式即相邻两步迭代之间存在同步控制,所有任务均完成该步的工作之后,才可以启动下一次迭代计算,发往第k次迭代的消息仅在第k次迭代时对顶点可见。异步模式即相邻两步迭代之间不存在同步控制,各任务独立进行迭代计算,不存在相互等待。在迭代过程中,当消息到达接收方后,目的顶点可以立即启动计算处理,并广播新的计算结果,而不必同步等待所有顶点均收到所有消息数据。下面我们就详细介绍一下分布式图处理系统中的同步异步执行模式:
同步执行模式在两次相邻的迭代之间,存在Barrier的限制,所有任务均完成该步的工作之后,才可以启动下一次迭代计算。在正在的同步计算模式实现下,同步模式下使用两个位图来相应地识别当前和下一次迭代中的活跃顶点。当消息激活顶点时,位图会更新。迭代后,所有消息都已处理完毕,并且每个Worker中的两个位图被翻转。上面的位图表示当前迭代顶点执行中活跃顶点的标识。下面的位图表示下一轮迭代中活跃顶点的标识,深色表示激活顶点状态,白色表示不激活顶点状态。
对于异步模式,这里有一个全局优先级(例如FIFO)队列调度活跃顶点。每个Worker线程都有一个本地待处理队列来保存停滞的活跃顶点,这可能会等待来自相邻顶点的消息的响应。当有空余的线程被空出来的时候,这个空余的线程会从Active Queue中拿取活跃顶点,然后在当前管道出来队列中执行顶点程序,分别经过Gather、Apply、Scatter阶段。在Scatter阶段的时候会激活邻居顶点,将激活的邻居顶点放回入 Active Queue队列中去。
同步模型
优势:批量发送消息,大大提高网络利用率。由于消息被批量发送,同步模式更加适合于消息通信量大的算法(IO敏感型),并且每个顶点上的计算是轻量级的。
缺点:1.在大多数图算法中,同步模式存在迭代计算收敛不对称的缺点。这意味着大多数顶点会很快的收敛在少部分的迭代后。然而存在一些顶点收敛速率很慢,需要很多轮的迭代计算。
2.同步模式不适用于一些图处理算法:图着色算法旨在使用最少的颜色将不同的颜色分配给相邻的顶点。在贪婪的实现中,所有的顶点同时选择最小的颜色。因为具有相同颜色的相邻顶点将根据相同的之前颜色来同时来回地选取相同的颜色。
异步模型
优势:1.异步模式能够加速程序的收敛。并且它十分适合CPU敏感型的算法。
2.并且有些图处理算只适合异步模式
缺点:1.异步模式存在顶点lock contention开销。对于相邻顶点来说,异步模式通过分开调用Gather、Apply、Scatter阶段来避免数据竞争,也就是说其中某个顶点程序会被lock,需要等待相邻顶点某个阶段执行完成。
2.异步模式频繁的发送消息,CPU不断的封装TCP\IP包,浪费了CPU的利用率。
下面我们介绍一下分布式系统中的同步异步执行引擎:
1) Excange message阶段,master接受来自mirror的消息;
2) Receive Message阶段,master接收上一轮Scatter发送的消息和mirror发送的消息,将有message的master激活, 对于激活的顶点,master通知mirror激活,并将vectex_program同步到mirrors;
3) Gather阶段,多线程并行gather, 谁先完成,多线程并行执行localgraph中的顶点,mirror将gather的结果发送到master;
4) Apply阶段,master执行apply(apply()),并将apply的结果同步到mirror (sync_vertex_data()).
5)Scatter阶段,master和mirror基于新的顶点数据,更新边上数据,并以signal的形式通知相邻顶点。
异步引擎中,每个顶点是消息驱动的状态机。
1) 在每一轮执行开始时,Master从全局的调度器(Sceduler)获取消息,获取消息后,master获得锁,并进入Locking状态。同时,master通知mirror获取锁,进入Locking状态。
2) master和mirror分别进行Gathering操作,mirror将gathering结果汇报给master,由master完成汇总。
3) master完成applying之后,将结果同步到mirror上。
4) master和mirror独立的执行scattering,执行完成之后释放锁进入None状态,等待新的任务到来。
5) mirror在scattering状态时,可能再次接收到来自master的locking请求,这种情况下,mirror在完成scattering之后将不会释放锁,而直接进入下一轮任务中。
可串行化异步(Asynchronous + Serializable Engine)
异步执行引擎很难去编程实现,并且由于调试的复杂性,所以提出了异步引擎进行可串行化,防止相邻顶点程序同时运行。Async+S就是相邻顶点必须可串行化执行不能并行执行。
相邻的Master顶点会抢夺共享锁,当抢到锁的顶点,进入执行调度阶段。接下来会执行Gather Apply Scatter阶段。相邻顶点不可以同时运行点程序,也就是说相邻顶点程序会等待,保证相邻顶点不能并行地执行点程序。