LEOPARD: Lightweight Edge-Oriented Partitioning and Replication for Dynamic Graphs(2016)

LEOPARD: Lightweight Edge-Oriented Partitioning and Replication for Dynamic Graphs

LEOPARD:动态图的轻量级面向边的分区和复制

研究对象:只有结构变化的动态(流式边输入)无向图(只考虑只读图算法,非只读算法也是不需要同步副本的临时数据),因为对于其他需要计算的图算法,作者认为同步副本的成本掩盖了副本带来的减少割边的好处
方法:复制顶点+重分配;使用 Fennel 的启发式思想
均衡目标:分区间顶点个数相等,割边最少
缺点:没有区分高度顶点和低度顶点,都是统一处理:计算得分、复制。

摘要

  本文介绍了一种动态图划分算法,专为大型且不断变化的图而设计。我们提出了一个分区框架,可以随着图结构的变化而动态调整。我们还引入了与分区算法紧密结合的复制算法,进一步减少了分区算法的割边数。尽管所提出的方法在重新分配顶点时仅考虑图的局部部分,但广泛的评估表明,所提出的方法随着时间的推移保持了质量划分,这在任何时候都可以与使用最先进的静态图分区算法(如METIS)从头开始执行完整分区相媲美。此外,当使用顶点复制时,边割数可以提高一个数量级。

引言

  近年来,大图变得越来越普遍。此类图形数据集太大,无法在单台机器上管理。处理这种规模的数据的典型方法是将其划分到商用机器集群中,并在分布式设置中运行并行算法。事实上,许多新的分布式图数据库系统正在出现,包括 Pregel [22]、Neo4j、Trinity [34]、Horton [30]、Pegasus [15]、GraphBase [14] 和 GraphLab [21]。
  在本文中,我们介绍了此类分布式图数据库系统的数据分区复制算法。我们的目的不是创建一个新的图数据库系统;相反,我们的数据分区和复制算法可以与现有的可扩展图形数据库系统集成,以提高其并行查询执行引擎的性能。
  在无共享机器集群上划分大型图的最常见方法是将哈希函数应用于图的每个顶点,并将该顶点以及从该顶点发出的任何边存储在分配给该哈希桶的机器上。不幸的是,以这种方式对图数据进行散列分区可能会导致图算法的性能不理想,因为图算法的访问模式涉及沿着图的边遍历图。例如,当执行子图模式匹配时,通过从图的匹配部分沿着边连续遍历图来匹配模式。如果对图进行分区,使图中彼此接近的顶点在物理上尽可能地靠近存储,则可以显著减少这种图算法的网络流量。
  通常,对于具有面向遍历访问模式的工作负载,分区算法有两个理想的目标。首先,如果两个顶点由一条边连接,那么最好将这两个顶点存储在同一台物理机器上。如果分区算法将这些顶点分配给两台不同的机器,则该边被称为“割边”。其次,存储在每个分区上的子图的大小(就顶点和边的数量而言)应该大致相等,以便图算法可以在集群中平等地并行化以获得最大性能。这两个目标经常发生冲突。例如,如果整个图存储在单台机器上,很容易保证不被切边,但是分区会极不平衡,并且图算法将无法利用集群中的并行资源。另一方面,哈希分区通常在将顶点和边分配给节点方面达到近乎完美的平衡,但会产生大量的割边。
  最小化边缘切割和维持平衡分区的双重目标通常被表述为 k 平衡分区问题。k 划分已经被广泛研究,并且存在许多 k 划分算法,无论是在理论空间还是在实际实现中。然而,几乎所有这些 k 分区算法都在静态图上运行——即,在分区算法开始之前整个图是已知的。其中最著名的包括 METIS [17] 和 Chaco [12],它们经历了多个级别的粗化和细化。最近的工作包括更轻量级的算法,这些算法多次遍历静态图并对其进行分区,而不将整个图存储在内存中[35,37,25]。
  虽然对静态图进行良好的初始分区很重要,但许多现代图是动态的,新的顶点和边以很高的速度添加,并且在某些情况下顶点和边可能会被删除。因此,良好的初始分区可能会随着时间的推移而退化。每次分区质量开始恶化时,重复运行静态图分区算法来重新分区整个图,效率会很低。相反,最好是增量地维护一个高质量的图分区,随着新的顶点和边被添加到图中而动态调整。由于这个原因,最近有一些关于动态图划分的研究[33,32,31,40,39,42]。
  分布式系统的另一个重要方面是通过跨多个机器/节点复制数据来实现容错复制,这样如果一个节点发生故障,数据仍然可以由复制节点处理。通常,容错级别由最小副本数量指定。如果存储在特定节点上的整个子图被复制到一个等效的副本节点,那么可以认为复制完全独立于分区。然而,更复杂的复制方案是可能的,其中存储在节点上的子图的不同部分被复制到不同的节点,这取决于哪些节点存储的子图“最接近”子图的特定部分。以这种方式复制数据可以显着提高分区的边切割目标,同时保持所需的容错保证。
  一种可能的复制算法是为图中的每个顶点制作所有非本地邻居的副本 [27, 13],以便对邻居的所有访问都是本地的。不幸的是,许多图包含“高度”顶点(与许多边关联的顶点),在这种复制算法下,这些顶点最终会被复制到大多数(如果不是全部)节点。因此,结果是一些顶点的复制远远超过容错所需的最低级别,而其他“低度”顶点根本没有被复制。一个好的复制算法需要确保每个顶点的最小复制,同时明智地使用任何额外的复制资源来复制那些最有利于分区算法的顶点
  复制的一个问题是保持副本同步。对于顶点包含频繁更新属性的图,更新成本乘以副本的数量。此外,许多大容量同步并行(BSP)图处理算法(例如众所周知的页面排名、最短路径和二分匹配[22])通过在算法的每次迭代中更新每个顶点上正在进行的计算来工作。在每次迭代时强制复制这些正在运行的计算会抵消复制的优势。
  以前的动态图分区方法是为图应用程序设计的,其中计算涉及在顶点之间频繁传递数据。因此,他们不认为复制是一种减少割边的机制,因为在计算过程中保持副本彼此同步的成本太高。相比之下,我们的工作重点是包含只读图计算的工作负载。虽然顶点和边可以频繁地从图中添加或删除,甚至可以偶尔通过显式的图更新操作进行更新,但对图的处理操作分为两类-“只读”和“非只读”。复制有可能改善只读操作的局部性,而不会影响非只读操作的性能,非只读操作涉及写入临时数据,这些临时数据可以在计算结束时删除(因为在这种情况下可以忽略副本)。也许最常见的只读操作是子图模式匹配和图同构——此类操作在 SPARQL 数据库系统中普遍存在,其中查询被表示为 RDF 数据上的子图模式匹配操作。然而,只读操作对于其他类型的图系统也很常见。例如,社交网络数据上的三角形查找是分析网络属性的重要工具。
  因此,我们工作的主要贡献是引入了第一个(据我们所知)动态图分区算法,该算法同时结合了复制和动态分区。我们首先提出了一个新的、轻量级的、动态的图分区框架,它可以立即合并新的边,并在图结构随时间变化时保持高质量的分区。我们的方法借鉴了单通道流方法(非动态的)的技术和计算方式用于图划分。我们利用流模型的灵活性来开发顶点复制策略,该策略可以显着改善分区算法的边切割特性,同时保持容错保证。由于从复制中得到的切边减少只适用于某些图操作,我们还提供了一个模型,该模型指定了给定特定类型的图算法的复制图的有效切边。
  我们还在来自不同领域的11个图数据集上对Leopard(我们的动态分区和复制算法的实现)进行了广泛的评估:网络图,社交图,合成图。我们发现,即使没有复制,我们基于流的动态划分方法产生的“边切割”与在同一时间点使用最先进的静态划分算法重新划分相同图时产生的边切割类似。然而,一旦启用复制功能,Leopard产生的边切割会小得多——在两种情况下,将边切割为80%的数据集转换为20%的边界切割。

背景及相关工作

  即使不考虑动态图,静态图分区本身也是一个NP难问题[11]——即使是最简单的二分图划分问题也是NP难的[10]。有几种基于线性规划的解决方案可以获得 k-way 划分的 O(log n) 近似解[1, 8]。然而,这些方法往往是不切实际的。已经提出了各种实用算法,虽然它们没有提供任何性能保证,但在实践中证明是高效的。对于小图,KL[19]和FM[9]等算法被广泛使用。对于大型图,有几种多级方案,如METIS[17]、Chaco[12]、PMRSB[3]和Scotch[26]。这些方案首先经过几个级别的粗化,将图粗略地划分成小块,然后使用 KL [19] 和/或 FM [9] 进行细化分区,最后将这些小块投影回较细的图中。这些算法可以并行化以提高性能,例如ParMetis[18]和Pt-Scotch[5]。为了处理十亿节点图,Wang等人[41]在Trinity[34]的基础上设计了一种多级标签传播方法。它遵循粗化和细化的框架,但用标签传播[29]方法代替最大匹配以减少内存占用。
  大多数关于动态图划分的研究都集中在对原始划分进行一批更改导致原始划分恶化后对图进行重新划分[33]。一般来说,使用两种方法。第一种方法是从头开始进行映射划分,简单地再次使用静态划分器进行完整的划分 [32]。第二种(更常用的)方法是扩散式划分。它包括两个步骤:(1)使用线性规划确定应该在分区之间转移多少顶点的流动解决方案,以及(2)决定应该转移哪些顶点的多级扩散方案 [31, 40]。这些重新分区方案是重量级的,并且倾向于处理一批更改而不是一次处理一个更改。此外,它们往往来自高性能计算社区,并且不考虑分区和复制。相反,在本文中,我们关注的是轻量级动态分区方案,它在新的更改流到系统中时不断更新分区,并将复制与分区紧密集成
  最近的工作介绍了用于大规模动态图的轻量级分区算法。Vaquero[39]提出了一种框架,该框架利用贪婪算法将顶点重新分配到具有最多邻居的分区,但同时延迟一些顶点迁移以确保收敛。Xu等人提出了基于图处理系统中活动顶点历史日志的分区方法。我们的工作与他们的工作不同,因为我们没有假设任何关于图形如何处理的历史信息。更重要的是,Vaquero和Xu等人提出的系统是为BSP图处理系统设计的,该系统使用与运行计算相关的临时数据不断更新图中的顶点。因此,由于使用这些临时数据更新副本的开销,他们不认为复制是一种改进边割的机制。相比之下,我们工作的核心贡献是只考虑只读图算法(如子图模式匹配操作、三角形查找和某些类型的图遍历操作),其中数据复制有可能减少切边并大大提高这些只读操作的性能。因此,分区和复制的集成是我们工作的重点,而不是上面提到的其他工作。
  最近有几篇论文表明,在图数据库系统中,将复制视为头等大事可以极大地提高性能。Pujol等人使用复制来确保顶点的邻居总是与顶点共存于同一个分区中。换句话说,如果一个顶点的邻居最初没有和一个顶点放在同一个分区中,它们就会在那里被复制。然而,这种强大的保证带来了巨大的开销——高度的顶点被复制了很多次,保持副本的一致性需要大量的通信。Mondal和Deshpande通过定义一个新的公平要求来指导复制,以确保一个顶点的一部分邻居(但不一定是所有邻居)位于同一个分区[23],从而解决了这个问题。此外,它们使用集群模式来分摊做出复制决策的成本。然而,Mondal和Deshpande论文的主要焦点是复制,他们的系统是建立在哈希分区器之上的。相比之下,我们的工作重点是通过轻量级图分区和复制的组合来减少边切割。在Leopard中,分区和复制作为单个组件构建在一起,并协同工作以增加查询处理的局部性
  Duong等人表明,复制的另一个重要好处是减轻了查询时间[7]的负载倾斜。如果没有复制,存储“流行节点”的分区就会因为对这些节点值的请求而不堪重负。复制这些受欢迎的节点可以分散可用于服务这些请求的资源,并减少负载倾斜。与Pujol等人以及Mondal和Deshpande等人的工作类似,Duong等人的复制方案也通过使用本地分区中的邻居数量来指导复制算法来减少切边。Duong等人提出的算法是针对图的完全划分。这项工作没有讨论图结构随时间变化时的增量重分区(这是Duong等人明确留给未来工作的)。相反,本文的重点是动态重划分问题。将复制考虑集成到动态重分区算法中是非常重要的,上面引用的相关工作还没有解决这个问题。
  Leopard的轻量级动态图分区算法建立在轻量级静态分区器的基础上。这些算法在执行一次数据传递时对图进行分区——对于从输入图数据集中读取的每个顶点,它们立即将其分配到一个分区,而不知道随后将读取的顶点。由于这些算法的在线特性,通常使用轻量级启发式方法来决定在哪里分配顶点,包括线性确定性贪婪(LDG)方法[35]和FENNEL[37]。LDG使用乘法权值来维持均衡的分区,FENNEL利用模块化最大化[4,24]来部署贪婪策略来维持均衡的分区。Nishimura和Ugander b[25]通过引入多通道分区和分层分区进一步推进了这项工作。类似地,Ugander和Backstrom引入了一种迭代算法,其中每次迭代都对数据集进行一次完整的遍历,并使用线性、贪婪、标签传播算法同时优化边局部性和分区平衡[38]。然而,单通道算法以及Nishimura等人和Ugander等人的算法被设计为按需运行,以便偶尔(重新)划分整个图作为一个整体。此外,它们不考虑复制。相比之下,我们在本文中的重点是在动态修改图时,以轻量级的方式连续重新划分图。此外,我们明确地将容错复制作为同时改进分区的工具

顶点重新分配

  作为 Leopard 背后直觉的一个关键观察结果是,动态图分区问题类似于第 2 节中描述的一次性分区问题 [35, 37]。在许多情况下,使大多数动态图动态化的是添加新顶点和边。因此,在任何时间点,动态图都可以被视为一次性(流式)分区算法的中间状态。因此,Leopard 可以利用流式算法的启发式策略。
  一次流启发式背后的直觉如下:为了实现低割边率,应该将一个新顶点分配给具有其大多数邻居的现有分区。但同时,应该对大分区进行惩罚,以防止其变得太大。
  FENNEL 评分启发式如公式 1 所示Pi 指的是第 i 个分区中的顶点。v 指的是要分配的顶点,N(v) 指的是 v 的邻居集合。αγ 是参数。

arg ⁡ max ⁡ 1 ≤ i ≤ k { ∣ N ( v ) ∩ P i ∣ − α γ 2 ( ∣ P i ∣ ) γ − 1 } \mathop {\arg \max }\limits_{1 \le i \le k} \{ |N(v) \cap Pi| - \alpha \frac{\gamma }{2}{(|Pi|)^{\gamma - 1}}\} 1ikargmax{N(v)Piα2γ(Pi)γ1} (1)

  此启发式将顶点 v 作为输入,计算每个分区的分数,并将 v 放置在分数最高的分区中。|N(v) ∩Pi| 是分区 Piv 的邻居数量。随着分区中邻居数量的增加,分区的分数也会增加。为了确保平衡分区,它包含一个基于分区中顶点数量 |Pi| 的惩罚函数。随着顶点数量的增加,分数会降低。
  虽然一次性分区算法能够以非常低的开销获得良好的初始分区,但它们在三个重要方面表现不足:(1)顶点仅分配一次且永远不会移动,(2) 不考虑删除,(3) 不考虑复制。因此,我们无法简单地改编一次性流式算法。
  在本节中,我们首先讨论在流算法中引入选择性重分配。我们将完整的动态分区算法(包括与复制的紧密集成)的描述推迟到第4节。
例1说明了重新分配的动机。
例1:假设有两个分区P1和P2。为了简单起见,我们假设这两个分区在任何时候都是大致平衡的,所以我们只关注一个顶点的邻居数量来确定它应该放在哪里。在将前100条边加载并放置到不同的分区后,顶点 vP1 中有3个邻居,在P2中有2个邻居。因此,P1v 更好的分区。然而,在加载并放置另外 100 条边之后,顶点 v 现在在 P1 中有 4 个邻居,在 P2 中有 10 个邻居。v 更好的划分是 P2。因此,顶点的最优分区会随着时间的推移而变化,因为会添加(或删除)新的边,尽管大多数这些新边是添加到与顶点 v 所在的分区不同的分区。
  因此,Leopard不断地重新访问由一次分区算法分配的顶点和边,并在适当的情况下重新分配它们。理论上,每次添加(或删除)一条边时,都可以检查所有顶点的重新分配。然而,这显然是不切实际的。相反,Leopard采用了更具战略性的方法。
  当添加或删除一条边(v1,v2)时,大多数顶点受到的影响很小。只有图中靠近这条边的那些顶点才可能受到足够的影响,从而有可能证明移动是合理的。如果 v1v2 位于不同的分区,则它们成为重新分配的良好候选项,因为它们现在在不同分区上有一个额外的邻居(或更少)。特别是,v1 可能应该移动到 v2 的分区,反之亦然。这可能会在重新分配的顶点的邻居之间引起连锁反应——一旦一个顶点移动到新的计算机上,它的邻居也可能更适合移动到新的计算机上。
  因此,当添加新边(v1,v2)时,v1v2 被选为潜在重新分配的初始候选者进行检查。如果它们中的任何一个被重新分配,那么移动顶点的直接邻居将被添加到候选集中。因此,这个候选集包含了受最近的图活动直接影响的顶点集。对候选集中的顶点子集进行检查,看是否有可能重新分配。这个检查过程涉及重新应用评分函数(例如,方程1)到这些候选顶点上。在下一节中给出了选择将重新评分并可能重新分配的特定候选集的算法。

重新分配的时间点

  在选择审查候选者之后,Leopard必须决定是否对这些候选者进行审查。正如上文所述,对顶点 v 进行重新分配的审查涉及计算顶点 v 放置在集群中每个分区上的得分(例如,方程1)。这个评分过程包括基于每个分区中 v 的邻居数量的计算,这需要访问有关 v 的邻居所在位置的信息。如果顶点位置查找表足够小,可以放在一台机器上,那么查找的成本就很小。然而,对于大规模图,查找表分布在整个集群中,这个成本可能是显著的(Leopard 使用分布式一致性哈希表 [16] 将顶点标识符映射到它们各自的分区)。一般来说,检查带来了不可忽视的成本,当检查导致重新分配的可能性很小时,不应该进行检查。
  随着顶点的邻居数量增加,新邻居的影响力会减小。例如,在我们在第6节中进行的一个实验中,当一个顶点的邻居数增加到11个时,有13%的概率将其重新分配到一个新的分区,而当一个顶点的邻居数增加到40个时,仅有2.5%的概率将其重新分配到一个新的分区。因此,对于已有大量邻居的顶点来说,支付重新分配检查的成本效率较低。因为很可能这个检查工作将被浪费,并且顶点将保持在其当前分区中。
  因此,Leopard偶尔会避免重新分配候选顶点 v 的检查计算,如果 v 在图中已经有许多邻居。尽管如此,Leopard确保即使有大量邻居的顶点也会定期检查。关于何时跳过检查的逻辑的伪代码如图1所示。给定顶点 v 和阈值 t,如果跳过计算重新分配得分的计算量与 v 的总邻居数的比率小于 t,则该函数将跳过计算。这使得在向 v 添加新邻居后执行重新分配检查的概率与 (1−t)/(t)(v.neighbors) 成正比。
在这里插入图片描述

  将这个公式分解为两个组成部分,可以看出有两个因素决定是否应该进行检查:1/(v.neighbors) 和*(1−t)/t* 。这意味着随着邻居数量的增加,重新分配的检查概率下降。同时,当 t 趋于 0 时,总是会进行检查,而当 t 趋于 1 时,永远不会进行检查。
  设置 t 显然需要权衡。较大的 t 会跳过更多的检查并降低分区质量,但会提高算法的速度。第6节通过实验回顾了这种权衡(参见图10和图11)。

LEOPARD 分区

  我们现在提出了完整的Leopard分区算法,它将复制与动态分区紧密集成在一起。
  复制在Leopard中有两个目的:提供容错性和改善访问局域性。容错是通过将顶点复制到不同的机器来实现的。每个顶点有n个副本,即使系统丢失n - 1个机器,每个顶点仍然是可访问的。一些图形数据库系统是建立在分布式文件系统(如HDFS)之上的,这些文件系统提供了自己的复制机制来实现容错。这样的机制在Leopard的复制中是冗余的,如果可能的话,应该避免与Leopard一起使用(例如,HDFS有一个配置参数来删除复制)。
  更好的访问局部性可以提高性能。即使一条边 (v1, v2) 被切断(意味着 v1v2 在不同的分区中,这通常导致它们被存储在不同的机器上),如果 v2 的副本存储在 v1 的分区上(反之亦然),涉及 v1v2 的计算仍然可以在本地进行,而无需等待网络通信。
  大多数系统将复制的访问局部性和容错性分开处理[7,13,27]。例如,分区器将创建一个初始分区,并有选择地将某些重要的顶点复制到多个分区中,以减少切边。然后,将整个分区(或分区碎片)复制到其他机器以实现容错。这具有“双重复制”这些重要顶点的效果。这可能不是最有效的资源利用方式。如果在第一阶段复制额外的重要顶点,而不是复制原始的重要顶点集,则可以实现更好的边切割。因此,Leopard采用了同时考虑访问局部性和容错的方法,以避免这种资源浪费。但是,需要注意的是,当需要访问多个分片或分区以恢复故障机器上的数据时,从故障中恢复会更加复杂。虽然在图数据库空间中是新颖的,但这种权衡恢复复杂性以提高资源利用率的方法以前已经在列存储数据库系统的上下文中执行过。不同的列组合(可能以不同的排序顺序)存储在不同的机器上,同时确保每个列的至少 k 个副本位于整个集群[36]。
  复制的主要缺点是保持副本彼此同步的成本。如果必须对存储在顶点内的数据执行更新,则此更新必须传播到所有副本,并且如果不允许副本对于特定应用程序暂时分歧,则必须自动执行此更新。在本文中,我们将更新分为两类:对图中顶点或边的基本属性进行永久更新(例如,更改社交网络用户的名称);以及在图计算过程中对顶点或边的临时更新。在本节中,我们假设前一类更新发生的频率远低于对这些顶点的读取,或者顶点和边的添加或删除。然而,当这种假设不成立时,研究界已经提出了几种解决方案来处理复制[6,28]。我们不对后一种更新类型(临时更新)做任何假设,并在下面更详细地讨论它们。

复制,访问局部性和切割

  如果 vu 位于同一台机器上,那么从顶点 v 到相邻顶点 u 的访问是本地的。当顶点不被复制时,这直接关系到是否切割边(v, u),切边比率可以用来预测访问局部性。然而,当考虑顶点复制时,切割比的定义更为复杂。
  图2展示了一个包含三角形顶点的样本图,呈现了这种复杂性。在没有复制(a)的情况下,所有三条边都被切割。在使用复制(b)的情况下,A、B和C分别复制到分区3、1和2。可以认为,边(A,B)不再被切割,因为分区1现在包含A和B的副本。按照同样的逻辑,边(A,C)将不再被切割,因为分区3现在包含两个顶点。但是,如果查询想要访问A、B和C,则不能在本地执行此查询。换句话说,即使边(A,B)没有被切割,边(A,C)也没有被切割,我们不能传递地推断出A,B和C在同一个分区中相反,在一个没有复制的系统中,这样的传递性质是成立的
在这里插入图片描述
  最根本的问题是复制给边增加了一个方向。当B被复制到A的分区时,它允许从具有A的主副本的分区访问B,但是它不允许从具有B的主副本的分区访问A。因此,A 和 B 的所有共同访问中有一半是非本地的(从 B 的主副本发起的访问),一半是本地的(从 A 的主副本发起的访问)。换句话说,顶点复制修复了被复制顶点和它被复制到的分区上的所有顶点之间的“切割”边,但这些边只被“一半”修复了——在实践中,对该边的所有访问中只有一半是局部的。
  此外,在某些情况下,Leopard选择让副本分散。特别是,在迭代图计算期间与每个顶点相关联的临时数据(随着计算的每次迭代而更新)不会传播到副本。这是因为只有在每个副本在下次更新之前被多次访问时,才值得花费将数据通过网络发送以保持副本同步的成本。对于迭代图计算,在每次迭代中发生更新,这种多次访问的要求无法满足。因此,Leopard在计算期间不会将这些临时数据传播到副本,因此在计算期间不能使用副本节点(因为它们包含陈旧的值)。在这种情况下,有复制的有效切边与没有复制的有效切边是相同的
  为了准确比较在复制的、分区的图上的算法查询访问局部性与相同算法在未复制的图上的局部性,我们专注于有效切边,这可以防止夸大复制对切边的好处。为了精确定义有效的切边,我们将所有的图操作分为“只读”和“非只读”。只读操作不会在操作期间向图的顶点或边写入数据。例如,子图模式匹配、三角形查找和某些类型的图遍历操作通常是只读的。相反,非只读操作,如上面讨论的迭代BSP算法,可能会将数据写入图中。有效切边是相对于在图上执行的特定操作的分类来定义的。给定一个操作O和一条边(u, v),图3给出了该边的有效切割值。当计算整个图的边切值时,defineeffecvecut返回“HALF CUT”的边对最终边切值的影响仅为完全切割的边的一半。这解释了将顶点复制到新分区的单向好处。
  图4显示了与只读操作的切边定义中提供的四种情况相对应的示例。
在这里插入图片描述
在这里插入图片描述

最小平均复制

  Leopard使用一种名为MAR的复制方案,即Minimum-Average replication的缩写。顾名思义,该方案有两个参数:顶点的最小拷贝数平均拷贝数最小拷贝数确保容错性,超过最小拷贝数的任何额外拷贝提供额外的访问局域性。一般情况下,第二个参数指定的平均拷贝数必须大于或等于第一个参数。图5显示了一个带有MAR的示例图。
在这里插入图片描述

  给定一个顶点,MAR算法决定应该创建多少个它的副本,以及它们应该放在哪个分区中。Leopard采用了两步方法。首先,运行顶点分配评分算法的改进版本。第二,从第一步生成的分数与其他顶点的最近分数一起进行排名。相对于最近分数,排名较高的顶点比分数相对较低的顶点更容易被复制。

顶点分配评分与复制

  由于复制的存在,分配得分函数需要进行修改,以适应顶点的次要副本的存在,并保持与第4.1节中给出的新边切割定义一致。特别是得分函数(例如,方程1)需要在每个分区上对顶点的所有邻居进行评分。给定一个当前正在评分的顶点 v,我们定义顶点 u 是否是分区 Pv 的邻居,这取决于我们当前正在评分的是 v 的主副本还是次副本:
定义: 考虑图G = (V, E)P(v)s(v) 分别表示 v 的主副本和次副本。如果 (v,u)∈E , 并且满足下列条件之一,那么uP 分区上 v 的邻居:
(1) v 是主副本,p(u)∈p
(2) v 是主副本,s(u)∈P
(3) v 是次副本,p(u)∈p
  考虑到该定义依赖于是对顶点 v 的主或次副本进行评分,Leopard 为每个分区 P 计算两个分数:一个用于顶点 v 的主副本另一个用于次副本。主副本将被放置在主副本得分最高的分区中,而次副本将根据其得分使用第4.2.2节中介绍的算法进行放置。

对次副本的分数进行排序

  在为每个候选分区计算顶点 v 的次副本的分数之后,这些分数从高到低排序。由于存在容错所需的最小副本 M,因此次副本立即放置在与最高 (M−1) 分数对应的分区中。但是,与平均副本数 A 对应的MAR参数通常大于M,因此可能会创建额外的副本。为了决定要复制多少副本,Leopard将 v 的分数与其他顶点最近的5个分数进行比较。根据v的分数高于或低于最近5个顶点的平均分数的程度,Leopard使v的副本数量高于或低于A。图6中的算法显示了创建多少副本的具体细节。
在这里插入图片描述

  为什么 v 的分数只与最近计算的 s 个顶点的分数进行比较,而不是与所有的分数进行比较,有两个原因。首先,对于一个大的图,所有计算分数的数量很大。存储它们需要消耗空间,对它们进行排序需要花费时间。其次,随着图表变大,得分也趋于上升。因此,在初始阶段计算的分数与后期计算的分数不具有可比性。参数 s 表示分数比较的滑动窗口,是一个可定制的参数。在实践中,s可以很小(大约100个分数),因为这个窗口的功能只是获得最近分数的统计样本。因此,这个分数窗口占用的空间可以忽略不计,并且很容易放在内存中。
  下面的示例说明了MAR是如何工作的。
例2:假设MAR的参数M(最小)= 2,A(平均)= 3,分区数为5。同样假设滑动窗口s的大小为24。当对顶点v的主拷贝运行顶点分配评分算法时,分区1到5的得分分别为0.15、0.25、0.35、0.45和0.55。由于分区5的得分最高,因此选择它作为v的主副本的分区。在为v的次要副本运行顶点分配评分算法之后,分区1到4分别获得0.1、0.2、0.3和0.4的分数(分区5被排除在外,因为它已经有了主副本)。由于M = 2,而分区4的分数最高,因此立即选择分区4作为次要副本的位置(以满足最低复制需求)。包括分区5,现在有两个分区有v的副本。然后将次要副本的四个分数(即0.1,0.2,0.3和0.4)与滑动窗口中最近的24个分数结合起来,然后对所有28个分数进行排序。如果v的其他三个次要分数中的任何一个处于所有分数的前 A − 1 k − 1 = 3 − 1 5 − 1 = 50 % \frac{{A - 1}}{{k - 1}} = \frac{{3 - 1}}{{5 - 1}} = 50\% k1A1=5131=50%,则为这些分区制作额外的v副本。

添加和删除分区

  在某些情况下,图数据分区的分区数量必须动态更改。在这些情况下,Leopard 需要分散数据以包含新分区,或者将数据集中到更少的分区。在 Leopard 中减少分区数量相对简单。对于放置在要删除的分区上的每个顶点,我们运行顶点重新分配评分算法并将其相应地分配给最佳分区。因此,我们现在将重点关注添加新分区。
  添加新分区的一个简单方法是使用静态分区器在增加的分区数量上对整个图进行重新分区,或者使用更大的 P(分区数)值在 Leopard 中重新加载整个图。不幸的是,通过扫描整个图来重新分区数据的成本很高,而且如果添加分区的原因是为了适应当前繁重的工作负载而添加机器,那么时机就特别糟糕。
  相反,Leopard 首先选择一组顶点作为新分区的种子,然后对其邻居、邻居的邻居、邻居的邻居的邻居等运行顶点重新分配评分算法,直到所有分区都被分配,达到大致平衡。Leopard 按此顺序进行,因为移动到新分区的种子顶点的邻居最有可能受到更改的影响,并且也可能移动到新分区。这导致需要仅计算图的一小部分的重新分配分数,从而保持添加新分区的开销较小。
  新分区的初始种子有多种选项。• 从所有分区中随机选择顶点。• 所有分区的高度顶点。 • 从最大分区中随机选择的顶点(分区大小不存在完美平衡的程度)。我们在 6.4 节中通过实验评估这些方法。

评估

实验装置

  我们的实验是在第四代 Intel Core i5 和 16GB 内存以及 Ubuntu 14.04.1 LTS 上进行的。

图形数据集

  我们对几个真实世界的图进行了实验,图7列出了它们的大小。它们来自不同的领域,包括社交图、协作图、Web图和电子邮件图。最大的图是Friendster社交图,它有6600万个顶点和18亿个边。
在这里插入图片描述

  我们还实验了一个合成图模型,即著名的BaraBasi-Albert (BA)模型[2]。这是一个用于生成具有优先附着的随机幂律图的算法。对于这个模型的参数,我们使用n = 15,000,000, m = 12, k = 15。
  我们通过生成所有边的随机顺序并按此顺序流式传输边插入请求,将所有这些图转换为动态图。虽然这种生成动态图的方法不会导致动态工作负载中的删除,但我们也运行了包括工作负载中删除的实验,并观察到由于Leopard处理边的添加和删除的并行方式,结果完全相同。

对比

  我们考虑以下五种划分方法作为比较点。
1、Leopard。尽管Leopard支持任何顶点分配评分函数,但在这些实验中,我们使用了Tsourakakis等人(FENNEL)[37]使用的相同评分函数。
2、一次性FENNEL分区。这个比较点是一个传统的带有FENNEL评分函数的单通流算法(参数与上文相同)。像所有传统的流算法一样,在一个顶点被放置到一个分区后,它永远不会移动。这个比较点用于评估Leopard中顶点重分配的好处。
3、METIS[17]。METIS是一种最先进的、广泛使用的静态图划分算法。它不处理动态图形,所以我们不会像流到Leopard和FENNEL那样将更新请求流到METIS。相反,在发出所有更新请求之后,我们给METIS提供最终图,并对最终图执行静态分区。显然,在分区时拥有最终图的全局视图是一个很大的优势。因此,使用METIS作为分区质量的近似上界。Leopard的目标是获得与METIS类似的最终分区,尽管在进行分区时没有最终图的全局视图。
4、ParMETIS b[31]。ParMETIS是一种先进的并行图划分算法。它是为不同于Leopard的动态图分区而设计的。特别是,ParMETIS是为在向图中添加了许多顶点和边后进行批量重分区操作而设计的。这使得与Leopard的比较变得非常重要。Leopard持续地维护一个图的良好分区,而ParMETIS允许分区恶化,然后偶尔用它的批处理重分区器修复它。因此,我们报告了两组独立的 ParMETIS 结果——在批量重新分区程序运行之前和之后不久。在任何时间点,ParMETIS 都会具有介于这两点之间的分区质量。为了展示ParMETIS的优点,我们使用FENNEL在重新划分操作之间维持合理质量的分区,当新顶点和边添加到图中时(而不是将新顶点和边随机分配到分区,直到下一次重新划分迭代)。
5、哈希分区。大多数现代可扩展图数据库系统仍然使用哈希函数来确定顶点位置。因此,我们与哈希分区器进行比较,尽管已知它会产生许多切割边缘。

评价指标

  我们使用两个指标评估分区方法:边切割率 λ负载不平衡 ρ,定义为
在这里插入图片描述

动态分区
系统比较

  在本节中,我们在没有复制的情况下评估分区质量。我们使用上述五种分区方法将 11 个现实世界图划分为 40 个分区,并在图 8 中报告结果。该图仅显示切边率,因为所有方法的 ρ(平衡)大致相同(对于散列分区,其值为 1.00,对于其他分区器,其值为 1.02 到 1.03)。
  正如预期的那样,散列分区的性能非常差,因为散列分区器不会尝试将相邻顶点放置在同一台机器上。39/40(即 97.5%)的边被切割,因为有 40 个分区,一个顶点恰好与其邻居位于同一分区的概率为 40 分之一。
  “One-pass FENNEL”分区器的性能也很差,因为图的结构随着新边的添加而变化,但算法无法相应调整。当将此分区器与 Leopard 进行比较时,图数据动态重新分配的重要性就变得显而易见。另一方面,图 8 没有显示分区的计算成本。我们发现 FENNEL 分区器的完成速度比 Leopard 快 44.6 倍。因此,虽然 Leopard 的分区要好得多,但它的计算成本很高。然而,这个实验没有使用3.1节中描述的跳跃优化。在下面描述的进一步实验中,我们将发现这个 44.6 的计算差异可以减少到 2 倍,而切割比仅发生很小的变化。
在这里插入图片描述

  ParMETIS的性能好坏取决于批处理重分区程序运行的时间。对于这个实验,批量重分区器在加载了图的四分之一、二分之一和四分之三的顶点和边之后运行,在加载了整个图数据集之后运行第四次。我们给出了ParMETIS的两个结果——在执行最后一批重分区之前不久(标记为ParMETIS-pre-rp),以及在执行最后一批重分区之后(标记为ParMETIS- post-rp)。ParMETIS-pre-rp是ParMETIS的最坏情况——它是自上次重新分区以来最长的时间。在这段时间内,根据FENNEL启发式将顶点和边添加到图中。ParMETIS-post-rp是ParMETIS的最佳场景——它刚刚完成了图的全局重分区。ParMETIS的重分区算法虽然比METIS的“从头开始”的分区算法更轻,但其重分区操作后的切边与METIS接近。
  令人惊讶的是,Leopard能够实现非常接近METIS和ParMETIS的最佳情况(post-rp)的分区,尽管它们在运行分区算法时具有最终图的全局视图的优势。由于我们使用METIS作为分区质量的近似上限,因此很明显,随着时间的推移,Leopard能够保持高质量的分区。
  尽管Leopard对所有图都实现了很好的分区,但是相对于METIS,它对Web图的分区质量是最差的。对图7中图的统计分析表明,Web图具有较大的直径。直径较大的图往往更容易划分。实际上,具有全局知识的静态分区器能够在我们实验中使用的Web图中切割不到十分之一的边。然而,如果没有这种全局知识,Leopard会进入局部最优,从而导致更多的边被切割
  这些局部最优是由流算法的平衡启发式引起的。Leopard的评分公式旨在保持每个分区的大小大致相同(如上所述,Leopard的ρ-balance在1.02到1.03之间)。对于难以分割的图,比如我们使用BaraBasi-Albert模型生成的幂律图,有许多顶点,无论它们放在哪里,都会导致许多边被切割。由于这些“有问题的”顶点的确切位置不会对最终划分的质量产生很大影响,因此可以将它们放置在最有助于保持低ρ的分区中。相反,对于可分区图,这种“固定ρ”的顶点较少,并且偶尔会将顶点放置在具有更少邻居的分区上,以避免不平衡。这将导致来自同一分区的其他顶点跟随原始顶点到不同的分区。最终的结果是,一组显然应该属于一个分区的顶点偶尔会出现在两个或三个不同的分区上。
  这意味着Leopard应该跟踪邻居的局部性,并分别平衡等式1的组成部分。当这些组件之间经常存在差异时,Leopard应该偶尔将静态分区器作为后台进程运行,以全局视图重新调整分区,以避免这些局部最优
  虽然这个实验只涉及添加新边,但我们也进行了一个动态添加和删除边的实验。我们发现,在实验中包含边缘删除相对于仅添加边缘的工作量没有显着差异,因为添加和删除边缘都被视为导致重新分配的“相关”事件。

跳跃

  在3.1节中,我们描述了一种快捷技术,在这种技术中,即使添加了与该顶点相邻的新边,也不会检查具有许多现有邻居(因此不太可能被重新分配)的某些顶点进行重新分配。在我们之前的实验中,没有使用这个快捷方式。我们现在打开它,并更仔细地观察跳过顶点检查如何影响边缘切割比率。
在这里插入图片描述

  结果如图9所示。正如预期的那样,随着跳过阈值的增加(即,更频繁地跳过重新分配检查),切割的质量受到影响。原始切割比越低,跳点检测对切割比的损伤越大。Slashdot图在没有跳过的情况下具有接近80%的比率,而0.9的跳过阈值仅将切割比率提高到略高于80%。另一方面,谷歌Web graph的切割率从20%大幅跃升至60%。然而,对于所有图表来说,跳过低于0.2的阈值对切割率的影响要比跳过更高的阈值小得多。
  尽管会增加边切割比率,但跳过顶点检查可以通过只在检查后可能实际重新分配的顶点上花费时间来节省资源。我们将节省量定义为原始检查顶点数 γ 的一部分,如下所示:
在这里插入图片描述
较高(较低)的γ表示与重新分配检查相关的计算资源的节省较高(较低)。
  图 10 显示了更改跳过阈值如何节省重新分配检查的费用。对于 Orkut 和 Twitter(每个顶点有超过 70 条边)等密集图,低至 0.1 的跳跃阈值可能会导致必须执行的重新分配检查工作减少一个数量级。对于稀疏图,跳过顶点检查的好处不太显着。
在这里插入图片描述
在这里插入图片描述

  图 11 显示了重新分配检查节省如何转化为实际性能节省。该图显示了端到端运行时间与在第 6.2.1 节中进行的相同实验中未跳过分区算法的运行时间的比率。当比较图的最左边和最右边时,过多顶点重新分配的成本是显而易见的。图表的最右侧(跳跃率为 1)导致永远不会发生任何重新分配。Leopard 只是一一加载顶点和边,并且从不将顶点从其初始位置移动。该图的最左侧对应于没有任何跳过的完整重新分配检查政策。与图 10 一致的是,跳跃对于更密集的图更有利。我们将以 Orkut 为例来说明跳过的好处。在没有任何重新分配的情况下通过 Orkut 图的总时间为 215 秒。遍历数据以检查每个可能的重新分配所需的总时间跃升至 9584 秒。这表明,如果不加以控制,动态重新分配和重新检查的成本会很高。然而,0.2 的跳过阈值会使运行时间减少 20 至 571 秒以上。从图 9 中可以看出,Leopard 的大部分边缘切割优势在跳跃率为 0.2 时仍然存在。因此,虽然跳跃率参数明显导致边缘切割与运行时的权衡,但可以通过相当小的跳跃率获得大部分边缘切割的好处,而无需过度显着的性能成本
  总之,对于资源受限的环境,0.1 到 0.2 之间的阈值会导致分区质量略有下降,同时显着提高重新分配过程的效率。更密集的图可以使用更小的阈值,因为跳跃优化的大部分效率优势是在阈值低于 0.1 时实现的。

分区数量的可扩展性

  我们现在研究切割质量如何随着分区数量的变化而变化。在本实验中,我们将数据集中两个最大的图(Twitter 和 Friendster 图)的分区数量从 2 个分区更改为 256 个分区。结果如图 12 所示。Leopard 和 METIS 的分区质量随着分区数量的增加而逐渐变差。这是因为保持分区平衡的根本挑战。分区越多,每个分区的顶点就越少。由于图的连接部分的集群超过了分区的大小,因此必须将它们拆分到多个分区。聚类越密集,通过分裂它切割出的边就越多。
在这里插入图片描述

  尽管随着分区数量的增加,Leopard和METIS的切割比质量都会变差,但Leopard和METIS之间的相对差异仍然接近恒定。这表明它们具有相似的分区可伸缩性。

Leopard与复制

  现在,我们将探索完整的Leopard实现的属性,将复制与分区集成在一起。由于Leopard是第一个将复制与动态分区集成在一起的系统(据我们所知),因此将Leopard与复制与我们上面使用的比较点进行比较是不公平的,因为这些比较点不支持复制作为改进边缘分割的机制。因此,为了理解将复制合并到分区算法中的好处,我们将带复制的Leopard与不带复制的Leopard进行比较。然而,由于我们运行在与上面使用的相同的数据集上,如果需要,读者可以间接地将这些结果与上面使用的比较点(例如METIS, FENNEL等)进行比较。
  对于这些实验,我们发现ρ(平衡)保持在1.00和1.01之间的值。这是因为Leopard同时考虑复制和分区,因此保持相同的平衡来保证是否使用复制。因此,我们只报告如何改变每个顶点的平均副本数影响切边比。这些结果如图13所示。为了生成这个图,我们强制每个顶点至少有2个副本,并将副本的平均数量从3个改变为5个。为了进行比较,图中的第一个点显示了没有复制的边缘切割(可以将其视为最小和平均复制计数为1)。
在这里插入图片描述
  如预期,复制大大降低了切割比率,尽管我们在上文中对于复制存在时“边切割”的保守定义。即使是臭名昭著的难以分割的Twitter社交图,在边缘切割方面也有了一个数量级的改进,平均每个顶点有3个副本。然而,随着平均副本数量的增加,复制的收益显著下降。在Orkut社交图谱中,平均3份拷贝的切割比例降至10%。在Orkut社交图谱中,平均3份拷贝的切割比例降至10%。

添加分区

  在第5节中,我们描述了当添加一个新分区时,Leopard是如何通过用现有顶点播种新分区并检查这些种子的邻居来重新分配数据的。我们提出了三种选择这些种子的机制:(1)从所有分区中随机选择,(2)从最大分区中随机选择,(3)选择高阶顶点。
在这里插入图片描述
  图14显示了这些播种策略(分别标记为“Random”、“Random + Balance”和“High degree”)在向先前实验中已有的40个分区添加一个新分区时如何影响分区质量。添加新分区后,将每个分区中平均顶点数的5%设置为种子数。作为比较基准,我们还测量了如果从一开始就使用了41个分区的分区情况。可以看到,用高阶顶点播种新分区能够最接近地产生与从一开始就使用41个分区时的分区相似的分区。这是因为高阶顶点通常朝向顶点簇的中心,将簇完整地移动到新的分区可以避免对分区质量的严重破坏。

结论

  在本文中,我们提出了一个轻量级且可定制的动态图分区和复制框架,称为Leopard。我们研究了重分配及其时间对分区质量的影响。通过将动态图的分区与复制紧密结合,Leopard能够有效地实现容错和访问局部性。我们评估了我们提出的框架,并发现即使没有复制,Leopard在许多动态更新后仍能产生与完全重新分区整个图相媲美的切割比率。然而,一旦复制与分区集成,边缘切割率就会显着提高。

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值