摘要
GPS(用于图形处理系统)是我们开发的完整的开源系统,用于在极大的图形上进行可伸缩,容错和易于编程的算法执行。本文起着双重作用,即描述GPS系统,并为分布式图形处理系统(如GPS)中的图形划分提供技术和实验结果。 GPS与Google专有的Pregel系统相似,具有三个新功能:
(1)扩展的API,使全局计算更容易表达和更高效;
(2)一种动态重分配方案,该方案基于消息传递模式在计算过程中将顶点重新分配给不同的工作程序;
(3)一种优化,它在所有计算节点上分布高阶顶点的邻接表,以提高性能。除了介绍GPS的实现及其新颖的功能外,我们还提供了关于静态和动态图分区方案的性能影响的实验结果,并描述了针对GPS的高级领域专用编程语言的编译,可以轻松表达复杂算法。
介绍
通过引入MapReduce框架[14]和其开源实现Hadoop [2],可以简化构建处理大量数据的系统。这些系统提供了对大量数据的自动可伸缩性,自动容错能力以及基于实现一组功能的简单编程接口。但是,已经认识到[24,26],当以大图的形式处理数据时,这些系统并不总是合适的(详见第7节)。类似于MapReduce的框架-可缩放,容错,易于编程-但专门针对图形数据,将有巨大的用处。为此,开发了Google专有的Pregel系统[26]。 Pregel是一个分布式消息传递系统,其中图形的顶点分布在各个计算节点之间,并相互发送消息以执行计算。我们已经为Google的Graphel系统实现了一个强大的开放源代码系统,称为GPS,用于Graph Processing System。
除了开源之外,GPS还具有Pregel或其他开源系统Giraph [1](在第5节中进一步讨论)中不存在的三个新功能:
- Pregel API只能轻松,高效地实现“以顶点为中心”的算法。 GPS API具有扩展功能,可以有效地实现由一个或多个顶点为中心的计算组成的算法,并结合全局计算。
- 与Pregel不同,GPS可以在计算过程中跨计算节点对图形进行动态分区,以减少通信。
- GPS具有称为大邻接表分区(LALP)的优化,该优化可在计算节点之间划分高顶点的邻接表,从而再次减少通信。
接下来,我们解释Pregel和GPS使用的计算框架。然后,我们激发GPS的新功能。最后,我们概述了本文的第二个贡献:实验表明了跨计算节点的图形的不同划分方式和可能的重新划分方式如何影响GPS上运行的算法的性能。
批量同步图处理
Pregel引入并由GPS使用的计算框架基于大批量同步并行(BSP)计算模型。开始计算时,图的顶点分布在计算节点之间。计算由称为超级步骤的迭代组成。在每个超级步骤中,类似于MapReduce框架中的map()和reduce()函数,将用户指定的ver-tex.compute()函数并行应用于每个顶点。在vertex.compute()内部,顶点更新其状态信息(可能基于传入消息),发送其他顶点消息以供下一次迭代使用,并设置一个标志,指示该顶点是否已准备好停止计算。在每个超级步骤结束时,所有计算节点都会在开始下一个超级步骤之前进行同步。当所有顶点投票停止计算时,迭代停止。与Hadoop相比,该模型更适合图计算,因为它具有固有的迭代性,并且图可以在整个计算过程中保留在内存中。我们将在第7节中更详细地将该模型与基于Hadoop的系统进行比较。
master 计算
在vertex.compute()中实现图形计算非常适合某些算法,例如计算PageRank [9],查找最短路径或查找连接的组件,所有这些都可以在完全“以顶点为中心”的条件下执行。但是,某些算法是以顶点为中心(并行)和全局(顺序)计算的组合。例如,考虑以下k均值图聚类算法,该算法由四个部分组成:
(a)选择k个随机顶点作为“聚类中心”,这是整个图的全局计算;
(b)将每个顶点分配给聚类中心,以顶点为中心的计算;
(c)通过计算穿过簇的边的数量,以顶点为中心的计算,来评估簇的优劣; (d)决定是否停止(如果聚类足够好),或者返回(a)进行全局计算。
我们可以通过指定“主”顶点来运行它们,从而在vertex.compute()中实现全局计算。但是,这种方法有两个问题:
(1)主顶点在所有其他顶点均处于空闲状态的超步中执行每个全局计算,从而浪费资源。
(2)vertex.compute()代码变得更难理解,因为它包含为所有顶点编写的某些部分以及为特殊顶点编写的其他部分。为了轻松有效地整合全局计算,GPS扩展了Pregel的API,并添加了一个附加函数master.compute()
GPS分区功能
在GPS中,就像在Pregel中一样,位于不同计算节点中的顶点之间的消息是通过网络发送的。除master.compute()外,还设计了GPS的两个新功能,以减少此类消息导致的网络I / O。
- 首先,GPS可以根据计算的消息发送模式,在计算期间自动跨计算节点自动重新划分图形的顶点。 GPS试图定位经常互相发送消息的顶点。
- 其次,在许多图算法中,例如PageRank和查找连接的组件,每个顶点都会向其所有邻居发送相同的消息。例如,如果计算节点i上的高阶顶点v在计算节点j上有1000个邻居,则v在计算节点i和j之间发送相同的消息1000次。取而代之的是,GPS的LALP优化(在第3.4节中进行了说明)存储了分区的邻接表,用于相邻邻居所在计算节点上的高顶点。在我们的示例中,1000条消息减少为1条。
分区实验
默认情况下,GPS和Pregel将图形的顶点随机分布到计算节点(通常是循环法)。使用GPS,我们已经探讨了图形划分问题:如果在计算开始之前“智能地”将顶点分配给计算节点,某些算法的性能会更好吗?如果在计算PageRank,最短路径或其他算法之前,使用流行的METIS [27]算法进行分区会怎样?我们是否通过使用GPS的动态分区方案来进一步提高性能?我们进行了广泛的实验,证明在某些情况下所有这些问题的答案都是肯定的。我们还将看到,当使用复杂的分区方案时,在计算节点之间保持工作负载平衡并非无济于事,但对于实现良好性能至关重要。
文章贡献
- 在第2节中,我们介绍GPS,这是一种适用于大规模图形算法的开源Pregel式分布式消息传递系统。我们将介绍该体系结构和编程API。
- 在3.1节中,我们研究了不同的图分区方案如何影响GPS在各种图和算法上的网络和运行时性能。我们使用基于Pregel的另一个开源系统Giraph [1]重复了一些实验,并报告了结果。我们还描述了大型邻接表分区功能(LALP),并报告了有关的一些实验。
- 参照图4,我们描述了GPS的动态分区方案。我们使用动态重新分区重复了第3.1节中的一些实验。
- 在第5节中,我们讨论了其他一些减少内存使用并提高GPS总体性能的优化。
- 在第6节中,我们简要地讨论了我们在编译高级文件时的工作。领域特定语言,用于将图形计算成GPS。我们讨论了在Green-Marl [19]语言中实现某些图形算法的优势,作为直接在GPS中编程的替代方法。
GPS系统
GPS使用Pregel [26]的分布式消息传递模型,该模型基于批量同步处理[36]。大致来说,输入是一个有向图,该图的每个顶点都保留一个用户定义的值,以及一个指示该顶点是否处于活动状态的标志。可选地,边缘也可以具有值。计算以称为superstep的迭代进行,在所有顶点都处于非活动状态时终止。在超步i中,每个活动顶点u并行:
(a)查看在超步i-1中发送给u的消息;
(b)修改其价值;
(c)将消息发送到图中的其他顶点,并有选择地变为非活动状态。
在超级步骤i中从顶点u到顶点v发送的消息可供v使用,以用于超级步骤i +1。每个顶点的行为都封装在一个函数vertex.compute()中,该函数在每个步骤中仅执行一次。
体系结构总览
GPS的体系结构如图1所示。在Pregel中,有两种类型的处理元素(PE):一个主元素和k个工作者,W0 … Wk1。主节点维护PE标识符的映射。物理计算节点和工作人员使用此映射的副本与彼此和主机进行通信。 PE使用Apache MINA [4]进行通信,Apache MINA是一种基于Java异步网络I / O包java.nio构建的网络应用程序框架。== GPS是用Java实现的==。计算节点运行HDFS(Hadoop分布式文件系统)[18],该文件用于存储持久性数据,例如输入图和检查点文件。接下来,我们将解释输入图如何在工作人员之间划分。在2.3节中描述了master和worker的实现。
跨工作人员的输入图分区
输入图G是通过简单格式在HDFS文件中指定的:每行以顶点u的ID开头,然后是u即将离开的邻居的ID。输入文件可以有选择地指定顶点和边的值。 GPS使用Pregel使用的简单循环机制将G的顶点分配给工人:将顶点u分配给工人W(u mod k)。当我们尝试更复杂的分区方案时(第3.1节),我们运行一个预处理步骤来分配节点ID,以便循环分布反映我们所需的分区。 GPS还支持在计算过程中跨工作人员选择性地重新划分图形。
Master and Worker Implementation
主PE和工人PE再次类似于Pregel [26]。主机通过指示工作人员协调计算:(a)开始解析输入文件;
(b)开始新的超级步骤;
(c)终止计算;
(d)检查其状态是否容错。主机在等待所有工人发出的通知之前,先指示工人下一步该做什么,因此,它是工人在各个超级步骤之间进行同步的集中位置。主机还在每个超级步骤的开始处调用master.compute()函数,工作程序存储当前和下一个超级步骤的顶点值,活动标志和消息队列。每个工作程序包括三个“线程组”,如下所示。
- 一个计算线程循环遍历工作器中的顶点,并在每个活动顶点上执行vertex.compute()。它为群集中的所有工作人员(包括其自身)维护传出消息缓冲区。当缓冲区已满时,它要么分配给MINA线程以通过网络发送,要么直接传递给本地消息解析器线程。
- MINA线程发送和接收消息缓冲区,以及主服务器和工作服务器之间的简单协调消息。收到消息缓冲区后,它将传递到消息解析器线程。
- 消息解析器线程将传入的消息缓冲区解析为单独的消息,并将它们排队到下一个超步的接收顶点的消息队列中。
这种线程结构的一个优点是只有两个轻量级的同步点:当计算线程将消息缓冲区直接传递给消息解析器线程时,以及MINA线程将消息缓冲区传递给消息解析器线程时。由于消息缓冲区很大(默认大小为100KB),因此这些同步很少发生。
API
与Pregel相似,GPS程序员将Vertex类子类化,以定义顶点值,消息和可选的边缘值类型。程序员通过实现vertex.compute()函数对计算的以顶点为中心的逻辑进行编码。在vertex.compute()中,顶点可以访问它们的值,传入的消息以及全局对象的映射-我们对Pregel聚合器的实现。全局对象用于协调,数据共享和统计汇总。在每个步骤的开始,每个工作人员都具有相同的全局对象图副本。在超级步骤中,顶点可以更新其工作人员的本地地图中的对象,这些对象将在超级步骤结束时使用用户指定的合并功能在主节点上合并。准备就绪后,顶点将通过调用API中的voteToHalt()函数来声明自身处于非活动状态。
该API的问题(至此已介绍)是难以实现包括全局计算和以顶点为中心的计算的算法,如以下示例所示。
考虑在第1节中介绍并在图3中概述的简单的k均值,如图聚类算法。该算法有两个以顶点为中心的部分:
- 将每个顶点分配给最近的“集群中心”(图3中的第5行)。这个过程是[26]中算法的简单扩展,可以从单一来源找到最短路径。
- 计算穿过群集的边的数量(图3中的第6行)。此计算需要两个超级步骤;如图4所示。
现在考虑图3中的第2行和第3行:检查最新聚类的结果并终止是否已达到阈值,或者选择新的聚类中心。到目前为止,对于API,我们必须将此逻辑放在vertex.compute()中,并指定一个特殊的“主”顶点。因此,在while循环的每次迭代(图3中的第3行)上都花费了一个完整的额外超级步骤,以在一个顶点进行此非常短的计算,而其他顶点则处于空闲状态。全局对象无法帮助我们进行此计算,因为它们仅存储值
在GPS中,我们通过扩展Pregel API使其包含附加函数master.comput()解决了示例2.2中的缺点。程序员将Master类细分为子类,并实现master.comput()函数,该函数在每个超级步骤的开始处被调用。Master类可以访问所有合并的全局对象,并且可以存储自己的全局数据且对所有顶点不可见。在将全局对象映射广播给工作人员之前,它可以更新全局对象映射。
图5显示了一个示例master.compute(),它与已描述的以顶点为中心的计算(封装在SimpleClusteringVertex中,未显示)一起使用,以实现图3的总体聚类算法。图3中的第2行和第3行在图5的第24和25行中实现。SimpleClusteringMaster维护一个全局对象comp-stage,该对象协调算法的不同阶段。主节点使用此全局对象向顶点发出信号,指示它们当前处于算法的哪个阶段。
通过查看此对象的值,顶点可以知道要执行的计算以及要发送和接收的消息的类型。因此,我们能够将以顶点为中心的计算封装在vertex.compute()中,并与master.compute()进行全局协调。
静态图划分
接下来,我们将介绍针对图的不同静态分区的实验。在第3.2节中,我们展示了通过在计算开始之前“智能地”划分大型图形,我们可以将总网络I / O减少多达13.6倍,并将运行时间减少多达2.5倍。分区的效果取决于三个因素:
(1)正在执行的图算法;
(2)图形本身;
(3)跨计算节点的辅助任务的配置。
我们展示了各种设置的实验,证明了所有三个因素的重要性。我们还探讨了如何在工作人员之间划分高级顶点的邻接表。我们将在第3.4节中报告这些性能改进。第3.1节说明了我们的实验设置,第3.3节重复了我们在Giraph开源图形处理系统上进行的一些实验。
实验准备
我们使用运行Red Hat Linux OS的大型实例(4个虚拟内核和7.5GB RAM)在Amazon EC2集群上运行了所有实验。我们在关闭检查点的情况下重复了每个实验五次。我们提供的数值结果是所有运行的平均值,而忽略了初始数据加载阶段。多次运行的性能变化很小。表1.2中指定了我们在实验中使用的图形。我们考虑了图形的四个不同的静态分区:
- 随机:第2节中描述的默认“ mod”分区方法,确保顶点ID是随机的。
- METIS-默认值:METIS [27]是可公开获得的软件,可将图形划分为指定的数字。分区,以尽量减少跨分区的边缘数量。默认情况下,METIS会平衡每个分区中的顶点数量。我们将ufactor参数设置为5,导致分配给每个分区的顶点数量最多达到0.5%不平衡。
- METIS平衡:使用METIS的多约束分割功能[27],我们生成分区,其中分区的顶点数量,输出边缘和输入边缘是平衡的。我们再次允许在这些约束中的每一个都施加0.5%的不平衡。尽管分区时间本身并不是我们研究的重点,但METIS平衡计算所需的时间比METIS默认时间要长。
- 基于域:在这种仅用于Web图的分区方案中,我们将同一域中来自同一域的所有网页定位在同一位置分区,并在工作人员之间随机划分域。
除非另有说明,否则我们始终会生成与工人相同数量的分区。请注意,我们假设在一个环境中,在GPS上执行图形算法之前发生了一次分区,而图形算法可能会运行很多次。因此,我们将实验重点放在分区对算法的影响上,而不是分区本身的成本上。
我们在实验中使用了四种不同的图形算法:
- PageRank(PR)
- 单一来源(SSSP)查找最短路径,在[26]中实现
- HCC [22]算法以查找连接的组件
- RW-n ,纯随机游走模拟算法。每个顶点都以初始n个walker开始。在顶点u上向每个漫游者i发出信号,u随机选择一个邻居,例如v,以模拟下一步。对于u的每个邻居v,u向v发送一条消息,指示从u步行到v的步行者的数量。
分区的性能影响
由于它们具有大量同步特性,因此诸如Pregel,GPS和Giraph之类的系统的速度由最慢的工作人员确定,以达到超步之间的同步点。我们可以将工人的工作量分为三个部分:
- 计算:循环计算每个顶点,并调用vertex.compute()
- 网络工作:工人之间发送和接收信息
- 解析和排队消息:在我们的实现中,消息存储为原始字节,这涉及字节数组分配和字节数组之间的复制。
尽管随机分区会在每个工作人员之间产生均衡的工作负载,但是几乎所有消息都是通过网络发送的。我们表明,通过使用更复杂的方案对图进行分区,我们既可以维护工作人员之间的均衡工作量,又可以显着减少网络消息和总体运行时间。
通过对图进行复杂的分区,我们可以明显减少网络I / O,因为与随机分区相比,我们在每个工作线程中定位了更多边缘。我们在
3.2.1节中介绍的第一组实验量化了各种设置下的网络I / O减少。
3.2.2节中,我们介绍了在运行各种条件时测量由于复杂分区而导致的运行时减少的实验各种设置中的算法。我们观察到,即使在工作人员之间的通信量较低的情况下,维护工作人员之间工作负载平衡的分区方案的效果也要好于没有工作方案的方案。
仔3.2.3节中,我们讨论了当分区方案生成平衡分区时如何解决工作人员之间的工作负载不平衡问题。
第一节 network I/o
在我们的第一组实验中,我们在各种设置下以不同的分区方案运行不同的图形算法时,测量了网络I / O(所有工作人员的网络写入量,以GB为单位)。我们报告的减少与随机分区的性能有关。总体而言,按域划分的网络I / O减少量在1.8倍至2.2倍之间,对于METIS平衡,网络I / O减少量为13.3倍至36.3倍,对于METIS默认值,则为26.6倍至58.5倍。我们在图6中展示了我们的两个实验。图6a显示了在sk-2005-d图上运行PageRank时,不同分区方案的网络I / O,其中60个工作人员在60个计算节点上运行。图6b显示了在uk-2007-u图上执行不同的算法(也有60个工作人员和60个计算节点)时,用于随机和METIS平衡分区的网络I / O。该图形绘制了PageRank和RW-800的每个超步网络I / O,以及HCC和SSSP的整个网络I / O。我们还试验了不同数量的工作程序和计算节点。我们发现网络I / O减少百分比相似。当然,网络I / O并不是整个运行时的唯一因素,因此我们的其余实验将考虑分区方案和其他参数对运行时的影响。
第二节 运行时间
在本节中,我们开始测试复杂的分区在多大程度上改善了整体运行时间。
由于复杂分区的主要好处是减少了通过网络发送的消息数量,因此我们期望在生成大量消息且计算工作量较低的算法中,分区能够最大程度地提高运行时间。我们使用的图形算法的计算和通信工作量可以表征为:
- PageRank:每个顶点较短的计算,高通信
- HCC:每个顶点较短的计算,中等通信
- RW-800:每个顶点较长顶点计算(由于生成随机数),中等通信
- SSSP:简短的每顶点计算,低通信
图7显示了我们实验结果的示例。图7a显示了sk-2005-d图上60个计算节点上的PageRank。 60名工人。在该实验中,基于域的分区的改进范围为1.1倍,针对METIS平衡的改进范围为2.3倍。在PageRank的其他实验中,METIS平衡始终表现最佳,与随机分配相比,运行时间减少了2.1倍至2.5倍。 METIS-default的改进范围从1.4x到2.4x,基于域的分区的改进范围从1.1x到1.7x。
执行其他图形算法时的运行时减少量少于PageRank,这并不奇怪,因为PageRank具有我们考虑的算法中最高的通信与计算比率。图7b在uk-2007-u图上显示了四种算法,该算法使用在30个计算机节点上运行的30个工作程序。我们比较了随机分配和METIS平衡的性能。如图所示,METIS-balanced在执行PageRank时将运行时间减少了2.2倍,对于HCC,SSSP和RW-800则分别减少了1.47倍,1.08倍和1.06倍。
第三节 工作负载平衡
到目前为止,在我们报告的所有实验中,METIS-default在网络I / O方面的表现均优于METIS平衡,但在运行时却较差。之所以具有这种违反直觉的性能,是因为METIS-default容易造成瓶颈,从而降低了系统的运行速度。
对于我们正在考虑的所有图形算法,消息都是沿着边缘发送的。回想一下,METIS-default仅平衡每个分区中的顶点数量,而不平衡边缘。结果,一些工人处理的消息数量大大高于平均水平。图8显示了在图7a的每个实验中,最慢的工作人员处理的消息数。随机和METIS平衡的消息数表明工作量相当均匀(每位工作人员的平均分布约为6300万条消息)。但是使用METIS默认值时,一个分区的负载是其他分区平均负载的两倍以上,因此会减慢整个系统的运行速度。
我们讨论了如何改善工作负载不平衡,并在使用可以生成不平衡分区的复杂分区方案时提高运行时收益。一种方法是生成比我们拥有的工作人员更多的分区,然后为每个工作人员分配多个分区,从而平均“重”和“轻”分区的工作量。例如,如果我们重复图7a和8的METIS默认实验,但是生成240个分区并为每个工作程序分配四个分区,则最慢的工作程序处理96M消息,而不是图8中的132M,运行时间从9.8减少到8.0分钟作为第二个实验,我们使用了METIS-default生成的原始60个分区,但在20个计算节点上只有20个工作程序,因此为每个工作程序分配了三个分区。该实验的结果显示在图9的METIS默认值(3个分区)栏中。与随机分区相比,此设置将运行时间提高了2.2倍,明显好于图1中的1.4倍METIS默认值。 7a。通过为每个工作进程分配一个分区,但在每个计算节点上运行多个工作进程,我们可以获得相同的“平均”效果。图9中的METIS-default(3个工作程序)栏显示了使用METIS-default之前生成的60个分区,为每个工作程序分配一个分区并在每个计算节点上运行3个工作程序的性能。我们看到,为每个工作者分配一个分区,为每个计算节点分配三个工作者,其执行效果与为每个工作者分配三个分区,为每个计算节点分配一个工作者的执行相似。
在Digraph上的实验结果
系统之间会有差异,digraph和GPS上相似
GPS的LALP
顶点不存储在单个工作程序中,而是在多个工作程序之间进行分区。此优化可以提高性能,但仅适用于具有两个属性的算法:
(1)顶点仅使用其邻接列表(传出邻居)来发送消息,而不用于计算; (2)如果一个顶点发送了一条消息,它就会向其所有传出邻居发送相同的消息。例如,在PageRank中,每个顶点都将其最新的PageRank值发送给其所有邻居,这是顶点访问其邻接表的唯一时间。另一方面,RW-n不满足属性2:从顶点u到邻居v的消息包含从u到v的步行者的数量,并且不一定与u发送给其他对象的消息相同邻居。
假设顶点u位于工作线程Wi中,并且让Nj(u)为工作线程Wj中u的输出邻居。假设| Nj(u)| =10000。在执行PageRank的过程中,Wi在每个步骤中向Wj发送10000条相同消息的副本,其中Nj(u)中的每个顶点一个。相反,如果Wj存储Nj(u),则Wi只需要向节点j的Wj发送一条消息,并且Wj将此消息复制10000次到Nj(u)中每个顶点的消息队列。
众所周知,许多现实世界中的图形具有偏斜度分布,其中少数顶点的邻接表包含图形中所有边的很大一部分。对于这些图形,LALP可以显着改善网络流量和运行时间。 GPS程序员在使用此优化时会指定参数τ。如果一个顶点u的相邻邻居超过τ个,则GPS将u的邻接列表划分为N1(u),N2(u)…Nk(u)并将Nj(u)发送给工作人员Wj,以便在工作人员之间进行图的初始分区。在执行期间,当u向其所有邻居发送消息时,GPS会拦截该消息,并向每个工人Wj发送一条消息,而Wj会将消息传递给Nj(u)中的所有顶点。(妙啊)
为了验证LALP可以提高性能,我们使用32个工作线程和16个计算节点在twitter-d图上运行了具有不同τ值的PageR-ank。随着我们减少τ,GPS在所有工作人员中分配更多的邻接表,并且我们期望网络I / O会减少。另一方面,随着τ的减小,每个工作者Wj维护的对的映射会增长,从而在消息解析过程中会产生一些内存和计算开销。我们期望有一个可实现最佳运行时性能的最佳τ。我们的实验结果如图11所示。图11a显示降低τ会降低网络I / O。图11b显示,对于我们的实验,最佳τ约为60,与不使用LALP进行运行相比,可将运行时间提高1.41倍。
动态再划分
为了减少通过网络发送的消息数量,在算法计算过程中将某些顶点动态地重新分配给其他角色可能会有所帮助。任何动态重分配方案都必须回答三个问题:
- 要重新分配哪些顶点;
- 如何以及何时将重新分配的顶点移动到新的工作人员;
- 如何找到重新分配的顶点。
下面,我们在GPS中解释对这些问题的答案,并讨论其他可能的选择。当图形最初被我们的第3.1节中的一种分区方案进行分区,然后在计算过程中进行动态重新分区时,我们还将介绍测量GPS的网络I / O和运行时性能的实验。
选择顶点重新分配
一种选择是,如果u向Wj发送/从Wj发送的消息比从其他任何工作者发送/从Wj接收的消息多,并且该消息的数量超过某个阈值,则将u的顶点u重新分配给新的Worker Wj。这种方法有两个问题。
首先,为了观察传入的消息,我们需要在每条消息中包括源工作程序,这在实际消息的大小较小时会显着增加内存需求。为了避免这种内存需求,GPS仅基于已发送的消息进行重新分配。
其次,我们使用这种基本的重新分配技术,观察到在多次迭代中,越来越多的顶点仅被分配给少数几个工作人员,从而造成严重的失衡。尽管具有网络优势,但“密集”工作人员大大降低了系统速度。为了保持平衡,GPS在工作人员之间交换顶点。每个工人Wi构造一个顶点集Sij,对于每个Wj,这些顶点有可能会重新分配给Wj。同样,Wj构造一个集合Sji。然后,Wi和Wj传达其集合的大小,并精确地交换最小(Sij,Sji)顶点,从而确保每个工人中的顶点数量都不会通过动态重新分区而改变。
将重新分配的顶点移动到NewWorkers时机
(a)您的最新价值;
(b)您的邻接表;
(c)您关于超步(x + 1)的消息。
一种选择是在超步x的末尾与超步x + 1的开始之间插入一个“顶点移动”阶段,在此期间所有顶点数据都将被移动。
GPS使用另一种方法将自身在超步内移动的顶点组合在一起:在超步x的末尾,工作人员按照上一小节中的说明交换其设置的大小。然后,在超步x的结束和超步(x +1)的开始之间,确定要交换的确切顶点,并重新标记邻接列表,如下一节所述。重新标记邻接列表可确保将在超步x + 1中发送给u的所有消息都发送给Wj。但是,此时您尚未发送给Wj。在计算超步(x + 1)时,Wi首先调用u.compute(),然后仅将u的邻接表和最新值发送给Wj。因此,您的超级步(x + 1)消息不会发送到Wj,从而减少了动态重新分区的网络开销。
查找重新分配的顶点
当将顶点u重新分配给新工作线程时,群集中的每个工作人员都必须获取并存储此信息,以便将将来的消息传递给u。每个工人一个明显的选择是存储一个键值对的内存映射。当然,随着时间的流逝,此地图可能包含的数量与原始图中的顶点数量一样多,这会导致很大的内存和计算瓶颈。在我们的实验中,多达90%的顶点最终可以重新分配。因此,GPS改为使用基于重新标记重新分配的顶点ID的方法。假设您已被重新分配给Wj。我们给u一个新的ID u0,使得(u0 mod k)= j。由于每对Wi和Wj交换相同数量的顶点,因此也可以有效地交换顶点ID。另外,每个工作程序都必须遍历其分区中的所有邻接表,并将每次出现的u更改为u0。这种方法有两个注意事项:
- 如果应用程序要求在计算结束时输出原始节点ID,则这信息必须与ID修改过的节点一起保留,这会产生一些额外的存储开销。
- 当用新ID重新标记节点u时,我们将在所有具有u边的节点的邻接列表中修改其ID。
如果正在执行的图算法涉及不沿边的消息(即,从节点u1到节点u2的消息,其中从u1到u2没有边),则无法使用我们的重标记方案。在大多数适用于GPS的图形算法中,消息的确遵循边沿。
动态分区实验
动态重新分区旨在通过减少通过网络发送的消息数量来改善网络I / O和运行时间。另一方面,动态重分区还会通过在工作进程之间发送顶点数据以及运行时开销(确定要发送哪些顶点并重新标记邻接列表)来增加网络I / O开销。如果在使用动态重分区的算法的初始超级步骤中,开销超出了好处,这也就不足为奇了。我们期望有一个交叉的超步s,这样,仅当图算法运行超过s个超步时,动态重分区才能比静态分区更好。显然,s对于网络I / O与运行时性能可能有所不同,并且取决于图,图算法和初始分区。
在我们的第一个实验中,我们在uk-2007-d图上运行PageRank,进行了3至100次迭代,具有随机初始分区,并且带有或不带有动态重新分区。我们使用了30个在30个计算节点上运行的工作程序。在GPS中,当要交换的顶点数低于阈值(默认为图形中顶点总数的0.1%)时,主任务将关闭动态重新分区。在我们的PageRank实验中,这通常发生在超级步骤15-20附近。我们的结果如图12所示。该实验的交叉超级步骤是网络I / O进行5次迭代,运行时进行55次迭代。当足够长时间运行PageRank时,动态重分区可以将网络I / O的性能提高2.0倍,而将运行时的性能提高1.13倍。
我们重复了实验,现在开始使用METIS平衡和基于域的图而不是随机图对图进行分区。当初始分区达到METIS平衡时,我们看不到动态重新分区带来的明显的网络I / O或运行时收益。另一方面,当我们从基于域的分区开始时,网络I / O的交叉迭代次数为4,而运行时的交叉迭代次数为36。当运行PageRank足够长的时间时,动态重新分区分别将网络I / O和运行时的性能提高了2.2倍和1.2倍。在我们的设置中,动态分区的运行时收益似乎充裕。但是,在网络速度较慢的环境中,网络I / O带来的好处也将带来显着的运行时改进。
总结和未来工作
我们介绍了GPS,这是一种用于大规模图形计算的开源分布式消息传递系统。 GPS目前在各个大学中都有少数用户。像Pregel [26]和Giraph [1]一样,GPS被设计为可扩展的,容错的,并且易于通过用户提供的简单功能进行编程。使用GPS,我们研究了在各种设置中不同图形分区方案的网络和运行时影响。我们还描述了GPS的动态分区功能,提出了其他一些可提高GPS性能的系统优化,并简要介绍了从Green-Marl高级语言到GPS的编译器。随着将来的工作,我们计划制造GPS当群集中的RAM量不足以存储带有与顶点和边相关联的大量数据的图形时,可以有效地使用磁盘。我们还想确切地了解使用批量同步处理和顶点之间的消息传递可以有效执行哪些图算法。例如,尽管有大量同步消息传递算法可以找到无向图的弱连接组件,但是我们不知道有任何这种算法可以找到强连接组件。