原作:Ahmed Eldawy;Mohamed F.Mokbel (UMN)
翻译:Leo(CAU)
注:由于本人翻译水平有限,如有错误,敬请谅解,可以在评论中指出,欢迎交流!
摘要:Hadoop使用了MapReduce编程范式,目前已经被公认为是分布式环境中分析大数据的标准框架。然而,它并不能很好的应用于大规模的计算几何处理。本文介绍的CG_Hadoop是一套可伸缩的和高效的MapReduce算法,用于处理各种基本计算几何问题,例如多边形合并、skyline(轮廓线)、convex hull(凸包)、farthest pair(最远相对)以及最近相对等,这些都是其它几何算法的基础。对于每一个计算几何操作,CG_Hadoop有两个版本,一个基于Apache Hadoop系统,一个基于SpatialHadoop系统。CG_Hadoop更适合空间操作。这些提出的算法形成了一个全面的计算几何操作MapReduce库。大量的实验结果表明CG_Hadoop达到了29倍和260倍,比使用Hadoop和SpatialHadoop都具有更好的性能。试验采用25台机器组成的集群,数据集大小为128GB。
Hadoop[17]是在分布式环境下高效处理大量数据的一个框架,采用了MapReduce编程范式,是通过两个函数,即Map和Reduce,进行的并行程序。Map函数将单一数据记录映射为一组key/Value组对<k,v>,而Reduce函数是将同一Key值的所有Value中取出并产生最终结果。MapReduce范式的简便性和灵活性使得Hadoop能够应用在一些大规模的应用中,如机器学习[13],兆字节文件排序[29]以及图像处理[14]等。
与此同时,随着设备和应用程序的大量出现,也产生了巨量的空间数据,例如智能手机、空间望远镜[6]和社交工具[28,35]等。如此大量的空间数据需要充分利用MapReduce编程范式[11]的优势去解决各种空间操作。在计算几何算法中,最重要的空间操作就是对空间范围内的几何实体进行表达和操作。这些操作包括:多边形合并、skyline(轮廓线)、convex hull(凸包)、farthest pair( 最远相对)以及最近相对等。这对这些问题尽管已经存在了很多优秀的计算几何算法,但是,这些算法并不能很好的处理包含数亿点的现有空间数据集。例如,计算4亿个点数据集的凸多边形,如果采用传统的方法可能需要花费三个小时,计算合并500万个多边形需要花费1个小时,对于更大的数据集可能会出现内存溢出,计算失败。
本文介绍的CG_Hadoop,具有一系列可伸缩而且效率高的MapReduce算法用于解决各种基础计算几何问题,如polygonunion, skyline ,convex hull,farthest pair, and closest pair等,这些算法都是其他几何计算的基础[5,33]。CG_Hadoop与传统的计算地理算法相比,在处理大尺度空间数据时表现更好的性能。针对每一个计算几何算法,本文都介绍了CG_Hadoop的两个版本,一个基于Apache Hadoop系统部署[17],另外一个基于开源的SpatialHadoop进行部署[12]。前者是一个开源的MapReduce项目,已经广泛应用于MapReduce应用[9,13,14,19,20,29]。后者是一个基于Hadoop系统进行了封装,采用了空间索引,使其更适合空间操作。
在CG_Hadoop中所有算法的主要思想是充分利用许多计算几何算法分而治之的思想。分而治之的特性适合MapReduce环境,该环境是在一个计算机器集群中多个节点并行处理。因此,在MapReduce环境中,CG_Hadoop必须适应传统计算算法来更好的工作。例如,不想传统算法那样将输入数据一分为二进行多次计算,而CG_Hadoop将输入划分为更小的组块,确保在每一个MapReduce中都被计算出结果,这样对于Hadoop和SpatialHadoop来说都比较适合。另外,本文采用了SpatialHadoop中分布式空间索引,通过先将输入分块但不会影响计算几何操作的结果,只要有可能,加快计算的速度,。
CG_Hadoop是SpatialHadoop(http://spatialhadoop.cs.umn.edu/)可用代码的一部分,形成了计算几何操作中综合MapReduce的核心部分。CG_Hadoop具有开源性质,将作为一个研究载体供其他研究者建立更多的基于MapReduce编程范式的计算几何算法。实验环境使用25台机器的一个集群,真实数据和合成的数据多达128GB,实验表明基于Hadoop和SpatialHadoop的CG_Hadoop比传统的算法达到了29倍和260倍,都具有更好的性能。
本文剩余内容组织如下。第二节简单介绍了所需环境。从第3节到第7节分别介绍了基于MapReduce的各种算法操作,包括多边形合并,Skyline,凸多边形,最远组对和最近组对。第8节进行了实验评价。第9节进行了讨论。最后一节是本文的结论。
本章节给出了关于Hadoop和SpatialHadoop两个系统的背景信息。CG_Hadoop中一系列的计算几何操作同时在这两个平台上使用。
Hadoop[17]是一个基于大集群进行数据处理的开源框架。一个Hadoop集群包含了一个主节点和几个从节点。主节点存储文件的元信息(如名称和访问权限等),而从几点存储了文件中实际的数据(如记录等)。一个文件在处理之前,一般是被切分为64M(称之为块)的大块,然后加载到Hadoop分布式文件系统(HDFS)上。主节点将跟踪文件如何被分块和每一块存储的位置,而从节点存储数据块。类比普通的文件系统,主节点存储文件配置表和索引节点,从节点存储文件数据。
MapReduce程序配置一个MapReduce工作并将其提交给主节点。一个MapReduce工作包含一系列配置参数,如Map函数和输入文件等。主节点将这个工作分为几个Map任务,然后分解这些任务并在每一个从节点上执行每一个任务。这也将输入的文件分块,然后分配每快给一个从节点去作为一个Map任务去处理。Map任务通过配置的记录读取函数解析配置块,然后生成一系列的Key-value组对<k1,v1>,这些组对会通过Map函数生成一系列中间组对<k2,v2>。中间组对通过K2进行分组,然后reduce函数收集所有同一关键值的中间记录,然后经过处理生成最终记录<k3,v3>集,并将其存储在HDFS文件中。
MapReduce和Hadoop已经被许多主流的公司使用,如Google[11]、Yahoo![9]、微软的Dryad[19],以及Twitter[20]。同时在一些大规模的应用中也很受欢迎,如机器学习[13],兆字节文件排序[29]以及图像处理[14]等。
SpatialHadoop是基于Hadoop的一个全面扩展,能够实现空间操作的高效处理。重要的是,SpatialHadoop在Hadoop存储层提供了两层空间索引,实现了基于格网文件[26]、R-tree[16]索引。丰富了MapReduce层,嵌入了两个新的组件,在该层允许使用空间索引。SpatialHadoop通过建立索引来提高一些空间操作的算法效率。
SpatialHadoop的空间索引包括一个全局索引和多个局部索引。全局索引通过集群节点数据划分数据,而局部索引在每一个节点内部组织数据。在MapReduce层新嵌入的组件通过全局和局部索引来修剪文件的分区和记录,但不会影响操作结果。修剪的标准取决于用于定义的过滤功能,这个可以通过MapReduce程序来提供。
正如上文所述,CG_Hadoop形成了计算几何操作的全面MapReduce库的核心部分。目前,CG_Hadoop包括5个基础的操作,即合并、Skyline、凸多边形、Farthest pair、和closest pair。下面对他们进行简单的定义。
合并:对一组多边形集合S进行合并,就是集合S中至少一个多边形内部所有点集合,仅仅保留所有点中的边界点,删除内部的所有点。图1(a)给出了一个示例对输入的多边形进行合并作为一组压缩代码区域,图1(b)是合并的结果。
Skyline(轮廓):例如图1中的点集合P。如果点Pi的坐标至少在一个维度(纵坐标或横坐标)不小于Pj的坐标,那么Pi在点P集合中就主导点Pj。点集合P的轮廓线是有这些主导点构成的(如图1(d))。在计算几何领域,轮廓线通常被称之为最大点集合[33]。
ConvexHull(凸包):一个点集合P的凸包是指包含这些点的最小凸多边形,如图1(e)所示。凸包操作的输出就是所有点按照顺时针的方向形成凸包(MRB)。
FarthestPair:给定一组点P,最远组对是所有点对中,两点之间的欧几里得距离最大的一对点。如图1(e)所示,最远的一对点在凸包上。
ClosestPair:给定一个组点P,最近组对是所有点对中,两点之间的欧几里得距离最小的一对点。如图1(e)所示。
传统算法为多边形合并操作[33]计算两个多边形的合并通过计算所有边缘交叉,删除所有内部部分,仅留下周边的部分。对于两个以上的多边形合并,首先合并两个多边形,然后与下一个多边形合并直到所有的多边形都合并成一个多边形。PostGIS[32]中,通过以下SQL查询语句来执行这个操作,每一列geom存储了每一个ZIP代码的多边形信息。
SELECT ST_Union(zip_codes.geom)FROM zip_codes;
本节介绍了基于Hadoop和SpatialHadoop的两个多边形合并算法。以图1(a)中的数据集作为输入。为了便于说明,同时保持代表性,实例中的多边形不存在重叠现象。
Hadoop中多边形合并算法核心思想是允许每一台机器累加多边形的子集,然后让一台机器将所有机器的结果都收集起来并计算出最终答案。算法步骤如下:分区、局部分区和全局分区。第一步分区是将输入的多边形分为更小的子集存储在每一台机器上。该步骤由Hadoop加载文件命令执行,可以将文件划分为64MB大小的组块存储在每一个从节点上。第二步是建立局部索引。每一台机器通过传统的内存中多边形合并算法计算该机器上多边形合并。因为每一个数据块最大为64MB,所以内存算法实现跟输入文件的大小无关。这些步骤作为一个联合功能再Hadoop中实现,运行在每一台机器中。当执行完局部合并之后,每一台机器会生成一组多边形作为该机器上分配的所有多边形的合并结果。全局合并在Hadoop中是以reduce功能来实现的,这个过程是在一台机器上计算最终的而结果。Reduce函数取出所有局部计算的合并结果,然后合并成一个,对他们再通过传统的内存计算算法进行合并。每一台机器最终将生成只有几个多边形,这样可以使用内存算法进行多边形合并。
通过充分利用并行机器的优势,而不是在一台机器上完成所有的工作,本文提出的算法与传统的算法相比具有明显的优势。尽管将数据分配到每台机器上,再从每一台机器上搜索结果都会有所开销,这样的开销可以通过并行机器的成本抵消掉,而且也可以用来处理更大尺度的空间数据集。对于更感兴趣,而且也比较熟悉MapReduce编程范式的读者,附件A.1.给出了基于Hadoop的多边形合并算法的源代码。
图2给出了图1(a)的输入数据集通过四个集群计算节点进行分区和局部合并的过程,四个节点每一个多边形分配到一个节点。决定哪个节点属于哪个分区完全取决于Hadoop负载文件组件,基本上是随机分配多边形到每一个节点上。
通过图中的结果,可以发现分配到一个节点的多边形合并后完全保持独立。在这种情况下,素有的多边形都作为输出结果。然后,所有节点的输出结果将通过一个单独的机器进行计算得出最终的答案,如图1(b)所示。
SpatialHadoop中多边形合并算法和Hadoop中的算法具有一样的三个步骤。唯一不同的地方是在SpatialHadoop中进行数据集分块含有一种空间思想的行为,如图3所示,相邻的多边形被分配在了一台机器上。这主要是因为在SpatialHadoop中利用了潜在的空间索引结构去为每个节点分配多边形。尤其是,在SpatialHadoop中采用R-tree索引,每一个R-tree节点的大小为64MB,每一个集群节点存储每一个R-tree节点中的所有条目。因此,根据定义,每一个R-tree节点提供一簇相邻的多边形,特别是,在SpatialHadoop中所有R-trees批量加载也能够保证同一个节点上的所有多边形是相邻的。
尽管局部和全局合并步骤一样,但在SpatialHadoop中变的更加简洁。其局部合并通常生成输出一个多边形,而在Hadoop中往往输出多个多边形。在本文的实例中,通过Hadoop的局部合并后生成了28个多边形,而在SpatialHadoop中仅仅生成了4个多边形,这就使得最终的算法计算的更快。SpatialHadoop中多边形合并算法的源代码完全和Hadoop中一样(附件A.1.)。
传统的内存中二维轮廓算法是采用分而治之的思想,首先将所有点按照X坐标进行排序,并通过一条垂直线将所有点分为两个大小相等的子集。每一半的轮廓通过递归计算,最终的轮廓线通过两者合并计算得到。合并两条轮廓线,左边轮廓线的点按照非递减X顺序进行扫描,也就是按照非递增Y顺序进行扫描,每一个都和右边轮廓线最左边的点进行比较。一旦左边轨迹线的点占优势,那么就删除掉左边轮廓线上的所有后续点,两条轮廓线上剩余的点链接在一起。在数据库管理系统中是不支持轮廓线操作符的。然而,在数据库中这些主要基于磁盘的算法具有非常大的意义(例如[7, 31])通过非标准SQL查询。
SELECT * FROM points SKYLINEOF d1 MAX, d2 MAX;
本节介绍了两种轮廓线算法,一种基于Hadoop,一种基于SpatialHadoop。以图1(c)中的数据为输入数据集。
本文Hadoop中的skyline算法是传统分而治之skyline算法的一种演变[33],是将输入的数据划分为多个(多于两个)部分,每一部分可以通过一台机器来处理。通过这样的方式,输入的数据通过所有机器需要一次被划分,确保结果能够在一次MapReduce迭代过程中得到。类似于Hadoop多边形合并算法,Hadoop轮廓线算法分为三步来执行:划分、局部轮廓线和全局轮廓线。划分步骤将输入的数据集划分为64MB大小的更小组块,并将它们分配到每一台机器上。局部轮廓线步骤是指每一台机器通过传统的算法计算本机器上的数据组块轮廓线,仅输出非主导地位的点。最终通过全局轮廓线步骤,一台机器收集所有局部轮廓线的点,然后计算这些点的最终轮廓线。值得注意的是,不能够通过内存算法来进行合并这些局部轮廓线,因为局部轮廓线不是通过一条垂直线进行分开的,实际上他们之间有可能重叠。通过Hadoop划分数据块是随机划分的,并没有考虑数据之间的空间位置。全局轮廓线步骤计算最终的结果,通过传统的轮廓线算法将局部轮廓线中的所有点合并成一个要素集。熟悉MapReduce编程的用户可以参考附件A.2的源代码。
该算法允许多台机器进行独立并行运算,大大提高了轮廓线计算效率,同时也减少了输入要素集(全局计算时)的大小。对于n个点大小的均匀分布的数据集,大约在轮廓线上的点的数量是O(logn)[4]。在实践中,一个64MB大小的分区大约有7000000个点,轮廓线中真实的和统一生成数据集仅仅包含几十个点。考虑到这些数据量比较小,也适合将所有收集的点再一台机器上进行单独的计算得出最终的结果。
SpatialHadoop中Skyline算法与前面描述的Hadoop算法非常相似,但也有两个主要的变化。首先是在划分阶段,后者采用了SpatialHadoop划分器当数据加载到集群时。这样确保了会根据一个R-tree索引进行划分,而并不是随机划分的,这就意味着每台机器上生成的轮廓线是没有重复的。其次,在局部轮廓步骤之前采用了额外的过滤步骤。过滤步骤在主节点上执行,需要输入所有分区的R-tree索引单元的最小外包矩形(MBRS),并清除这些单元,但并不会影响最终轮廓线的结果。
新过滤步骤的主要思想是如果在Ci中至少有一个点主导Cj中所有的点,那么Cj可以删除,单元Ci主导另外一个单元Cj。如图4所示,由于C5左下角主导了C1中右上角,则C5主导了C1。轮廓线支配关系的传递性意味着在C5中的所有点主导C1中的所有点。同理,C6主导C4,C6的左上角主导了C4的右上角。这就是说C6上边缘的点主导了C4左上角的点,因此主导了C4中所有的点。因为一个单元的边界是最小的(因为R-tree分区),所有每一个边界至少有一个P中的点。类似于C2主导了C3。因此在过滤步骤中删除方法是通过一个嵌套循环一起测试每一对的细胞Ci和Cj。通过对比Cj的右上角和Ci的左下角、右下角以及左上角。如果任何一个角主导了Cj的右上角,就在下一步对比中删除Cj,不发给任何一个节点。因此,对局部skyline不进行计算,也不认为他在全局轮廓线这个步骤中。
值得需要注意的是,在Hadoop中应用过滤步骤不会有多大的影响,因为在Hadoop中使用的分区方案针对不同的单元不会产生如此分割的MBRs。基于SpatialHadoop轮廓线算法比相应的Hadoop算法具有更好的性能,因为过滤步骤减少了许多不需要处理的单元。感兴趣的读者可以参考附件A.2过滤步骤的源代码。
图1(e)中所示的凸包采用Andrew’s Monotone Chain算法对两个链进行合并计算。说先,它将所有点按照x坐标进行排序,并标识最左边和最右边的点。然后,凸包的上链通过检查每三个连续点p,q,r,反过来,从左到右。如果三个点是逆时针反向,然后,当中间点q不是上链的一部分,它是被跳过的,然后算法将考虑P,r,s三个点,r是成功的一个点。否则,算法继续检查下三个连续的点q,r,s。一旦到达最右边的点,算法通过同样的方式继续计算更低的链,来检查P中所有点,从右到左,并做相同的检查。采用PostGIS[32],凸包,可以通过单独的SQL语句ST_ConvexHull功能来实现。由于这个函数需要一个记录作为参数,所以,这些点必须先通过ST_Makeline功能将其组合成一行字符串。
SELECTST_ConvexHull(ST_Makeline(points.coord)) FROM points;
本节中,介绍了两种凸包算法,一种是基于Hadoop,一种是基于SpatialHadoop。图1(c)中的数据集作为案例的实验输入数据。
Hadoop中的凸包算法与其中的轮廓线算法非常相似,首先需要进行分区,将输入的数据划分为更小的数据块,每一块都适合进行内存计算。然后,每一个子集的局部凸包采用传统的方法进行内存算法计算[3],只保留形成凸包的点。这些凸包上的所有点将在一台单机上进行全局凸包计算,通过传统的内存凸包算法生成最终结果。与轮廓线很相似,凸包上点的个数估计为所有的数据的O(logn)[10],使得在计算局部凸包时,删除大多数点算法非常高效,并且允许全局凸包在一个节点上进行计算。
Hadoop中凸包算法没有必要处理更多文件分区。直观地说,文件的中心部分不影响结果。SpatialHadoop中,通过提前删除一些分区从而提高了凸包算法而且也不影响结果。核心的思想是凸包上的任何点都必须是数据集(大大、小大、大小和小小)的四个轮廓线中的至少一个的一部分[33]。一个大/小-大/小轮廓线考虑最大/最小点在x-y维是首选。这个属性允许重用的4.2节中轮廓线过滤步骤。如图5所示,应用轮廓算法四次去选择分区,四个轮廓线所需要的,并将它们素有这些分区作为一个去处理。显然,一个分区,不影响四个轮廓线的任何一个,也不会影响最终的结果。一旦要处理的分区被选择后,算法将通过计算每一个分区的凸包,类似于5.1小节的Hadoop算法,然后在每台机器上计算局部凸包,再计算全局凸包。SpatialHadoop算法的获取来源于空间意识分区方案,这样允许在过滤步骤中进行数据修剪,因此在局部和全局进行凸包计算时可以节约成本。感兴趣的读者可以查看附件A.3中。
最远组对的很好属性是这两个点组成的组对必须落在所有点的凸包上[34]。这个属性可以通过首次计算凸包加速最远组对操作,然后通过旋转卡尺算法扫描凸包来查找最远组对[33]。在本节中,将介绍Hadoop和SpatialHadoop中最远组对算法。
本节首先主要讨论基于Hadoop的旋转持卡方法[33]计算凸包算法。然后通过一台单独的机器对凸包上所有点进行扫描,这在凸包上所有点的个数上可能是个瓶颈。在这种情况下,最好是开发一个基于并行处理的最远组对算法来实现Hadoop算法,这种方法是计算每一个可能的点对中两点之间的距离,并选择其最大值。对于大文件蛮力强迫方法代价较高,然而,如果在旋转卡方法下不适合一台机器从凸包的点中去计算最远组对,这个时候可以使用该方法。总的来说,蛮力强迫和旋转卡尺的方法在Hadoop中实现具有各自的缺点。
SpatialHadoop中的算法工作模式与轮廓线和凸包算法类似,也分为四个步骤,即分区、过滤、局部最远组对和全局最远组对。在分区阶段,主要采用SptialHadoop分区方案。在过滤步骤中,采用了专门的规则过滤。主要的思想如图6所示。对于单元中的每一对组对,Ci和Cj,计算他们之间最小(最大)距离最为pi∈ci和pj∈cj(图6(a))中任意两点之间可能最小(最大)的距离。然后,鉴于两个单元组对C1 =<c1, c2>和 C2 = <c3, c4>,如果C1中的最小距离不小于C2中的最大距离,那么我们就说C1主导C2。在这种情况下,C2的组对将被删除,因为他的数据集中不包含最远的组对。如图6(b)所示,C1中最远的组对必须有一个距离大于C2中最远的组对。在这种情况下,<C3,C4>单元中的组对将不影响最终结果,因此在下步处理过程中将不予考虑。
一旦所有主导的单元组对都处理完毕后,算法将通过寻找局部凸包为每一个备选的单元组对计算局部最远组对,然后应用旋转卡尺算法计算结果[33]。重要的是要注意,当每一个组对的大小是有界单元大小的两倍时,通过内存算法计算局部凸包是可行的。最终,算法通过收集所有局部最远组对并选择出最远距离的组对,计算出全局最远组对。对于感兴趣的读者,最远组对算法如附件A.4所示。
任何数据集中最近组对(图1(e))都可以通过分而治之的算法[25]。这种思想是将所有点按照x坐标进行排序,然后基于中位数,将点分为两个子集,P1和P2,大小大致相当,在每个子集中通过计算最近组对。基于找出的两个最近组对,算法将计算P1中的p1所有点的最近组对和P2中的最近组对,他们之间的距离比两个已经存在的更小。最终,算法返回三个组对中最优组对。本节介绍基于Hadoop和SpatialHadoop的最近组对算法。
在Hadoop中采用以上描述的分而治之的思想是非常珍贵的。首先,它需要整个数据集进行与分类,就其本身而言,它需要两轮MapReduce[29]。此外,合并的要求对经过排序的坐标点进行随机访问,这在Hadoop文件系统中是一个众所周知的瓶颈。一方面,采用Hadoop默认的加载去划分数据,并在每一个分区中计算局部最近组对(类似于最远组对算法)可能导致交叉结果。这是因为数据划分是随机的,这就以为这在在不同分区的两个点可能是最近的组对。最后,在5.1章节提到的最远组问题,蛮力的方法可以解决,但对于大文件还需要更多的计算。
在SpatialHadoop中最近组对算法采用了传统最近组对分而治之算法[25]。算法分为三个步骤,划分、局部最近组对和全局最近组对。在划分阶段,输入数据集是通过SpatialHadoop加载,如图7所示将数据划分为多个单元。每一个分区的大小只有64MB,算法通过传统分而治之的思想对每个单元中局部最近组对计算,然后返回两点形成一个组对。另外,算法也必须返回所有候选点,当加上从邻近的单元点,通过这些候选点可能产生更近的一对。从图7可以看出,假设C1中最近的组对距离为&1,在C1周围做内部缓冲区,半径为&1,然后返回缓冲区内所有点作为候选点,其他的点都可以删除。值得注意的是,形成最近组对的两个点然会的比较早,而且不受删除步骤的影响。例如,每一个单元Ci在单元内部可能具有基于最近组对的不同缓冲区大小&i。对于计算所有缓冲区来说,尽管所有&中最小值可能是最好的值,但它不能够使用,因为MapReduce框架强制所有的Map任务是独立工作,这就使得框架在调度任务的时候更灵活。最终,在全局最近组对计算步骤中,从所有单元返回的所有点将在一台机器上进行计算,通过传统分而治之算法计算最近组对ˆp,ˆq。
为了使得算法正确,单元必须不能够重复,采用SpatialHadoop划分方法得到的单元能够确保。这样确保了点p被移除,没有其他任何点更近比同一单元的距离。否则,如果单元重叠,重叠区域点p可能比其他点离点q更近,因此就会没有点被删掉。对于熟悉MapReduce范式的读者,可以查看附件A.5源代码。
本节将通过实验来研究CG_Hadoop的效率和性能。Hadoop和SpatialHadoop均是采用Apache Hadoop1.2.0和java1.6。所有的实验在拥有25节点的学校内部集群上执行。机器的硬盘大小从50GB到200GB不等,内存是2GB到8GB不等,处理速度范围是2.2GHz到3GHz。单台机器实验室用2TB的硬盘,16GB的随机存取存储器和8核的3.4GHz处理器。
实验数据分为三类:(1)OSM1:从OpenStreetMap上提取的数据集[30]包含164M的多边形(如湖泊和公园),总大小为80GB。(2)OSM2:从OpenStreetMap上提取的数据集包含全球17亿个点数据(如路口和兴趣点),总共大小为52GB。(3)SYNTH:在1M*1M的单元内采用不同分布如均匀、高斯、正相关、负相关和循环等(见图8)随机生成的合成数据集。均匀和高斯是模拟许多真实现实系统应用最广泛的分布。正相关和负相关是用来计算轮廓线最优的案例。循环数据专门用于最远组对操作,产生的凸包是非常大,不容易进行计算。最大的数据集大小有128GB,包含3.8亿个点。
本文采用所有执行时间作为主要的性能指标。有时,如果操作运行出现内存溢出,或数据太大导致不同算法之间的差异不容易区别,单机实验的结果可以不算。对真实数据和合成数据操作的实验结果分别有8.1和8.2节给出。
本节给出了运行OSM真实数据集处理操作的性能结果。多边形合并算法的结果通过多边形来运行,而其他四个操作主要是针对点数据集。
图10(a)给出了不同输入大小的多边形合并操作处理时间。从OSM1数据集中提取出来的不同大小的数据子集为250MB,1GB,4GB,10GB。如图10(a)所示,单机多边形合并算法没有规模,而且对于大的数据集迅速出现了内存溢出异常导致失败。尽管4GB的数据集适合内存计算,但是该算法采用需要更多的内存的内部数据结构,容易导致程序崩溃。CG_Hadoop算法在集群存储计算和内存开销方面拥有更好懂得负载分布。另外,CG_Hadoop基于SpatialHadoop运行时表现更好,因为空间划分可以加速局部和全局合并步骤。如3.2章节描述,空间划分有利于减小中间数据的大小(如局部合并输出结果)这也会影响算法的整个性能。
图10(b)展示了对OSM2数据集进行不同操作的结果。结果表明CG_Hadoop拥有优于传统技术几个数量级。基于SpatialHadoop的CG_Hadoop的运行在图中采用实体柱状图标识,但是很难看出,因为它与单机算法相比处理时间非常少。对于轮廓线和凸包操作,当分别在Hadoop和SpatialHadoop运行CG_Hadoop达到了平均8倍和80倍的加速度。最远组对首先计算出凸包,然后采用循环旋转卡尺方法,该方法更适合凸包大小比较小的情况。这就导致了最远组对运行时间和凸包运行时间非常相似,因为循环旋转卡尺算法针对小的凸包需要非常短的时间。之后,本文给出了最远组对实验,对于该方法来说,凸包太大了。最后,针对最近组对,仅给出了基于SpatialHadoop的CG_Hadoop的结果,因为单机算法出现了内存溢出异常。
本节分别给出了生成数据的每一个操作更多的详细结果。没有针对合成数据进行多边形合并,因为他需要更多先进的生成器,这个超出了本文的范围。本文展示了四个操作,轮廓线、凸包、最远组对和最近组对。数据集大小从4GB到128GB,生成的数据分布如图8所示。
图9是单机算法和CG_Hadoop进行轮廓线操作的性能图。单机算法循环读取输入点,当物理内存缓冲区满时,使用的缓冲区的大小将减少。这使得与算法可以处理任意大小的数据。尽管单机能够完成实验,但是省略了一些结果来调整它的规模。当CG_Hadoop以Hadoop标准来部署,由于采用了集群多台机器并行计算,获得的几个数量级的性能。局部轮廓线步骤在删除大多数点仅仅留下全局所需的点时非常有效。CG_Hadoop能够达到两个数量级的性能,当部署在SpatialHadoop上时。如此好的性能主要是由于过滤步骤能够删除分区而不硬性记过,减少了处理区块的总个数。
凸包算法的处理时间如图11所示。凸包算法通过循环读取输入点,如果内存缓冲满,通过凸包算法的一次迭代和仅保留的结果内存使用有限。CG_Hadoop中凸包算法描述如图5.1所示,由于凸包通过集群中分布式计算所以必单机算法要快很多。CG_Hadoop在SpatialHadoop中运行更有效,因为过滤步骤允许使其最小化修剪的分区处理不会影响结果。尽管不是这里显示的清晰图,部署在SpatialHadoop上的CG_Hadoop达到260倍加速比传统的系统。
在CG_Hadoop中通过两种技术计算最远组对。第一个是通过循环卡尺算法计算凸包[33],这是只适用当凸包的大小是有限的。本文采用这项技术进行单机实验。第二个方法是6.2节中描述的修改蛮力方法。图12(1)不同的输入大小进行比较两种方法的性能。本文通过生成如图8(e)中的循环数据集去获取最大的凸包。如图所示,第一个技术更有效,因为他需要围绕凸包单独扫描。然而,当凸包非常大数据大小超过主存容量时,将会失败。另外一方面,修改后的蛮力的方法在CG_Hadoop中是低效的,因为它需要大量计算点之间的距离选择最远距离的组对。然而,它有一个可伸缩性优势因为它需要相比非常小的内存占用单机算法。只有当旋转卡尺使用方法不适用,建议修改后的蛮力。
如图12(b)是不同输入数据大小的最近组对实验结果。传统的单机算法不能扩展到大文件,因为它已经加载整个数据集内存。如实验所示,当数据量达到16GB时,传统算法将失败。CG_Hadoop由于两个原因达到了最好的性能。第一个,最近组对计算时通过集群并行算法加快了整个算法。第二,每一台机器删除了计算最近组对许多不再需要考虑的点。如图所示,CG_Hadoop具有可伸缩性,因为每一台机器仅仅处理每一个分区,在有限的时间内,需要内存使用的大小,不会有内存问题。
在计算几何领域使用MapReduce从理论的角度讨论了[15]表明模拟MapReduce中Bulk-Synchronous平行(BSP),并应用他解决了一些计算几何问题,如凸包等。然而,没有提供实际的实施,没有给出如何实现其他不依赖BSP模型的算法。
据我们所知,我们在CG_Hadoop工作是第一个针对不同计算几何问题提供详细的MapReduce实现。与此同时,还充分利用了Hadoop的优势去支持空间数据。在MapReduce中目前支持空间数据的方法可以分为两类:(1)解决特定的空间操作和(2)提供一个空间数据框架。
特定的空间操作。现有的这类工作主要集中在Hadoop中的MapReduce上实现特定的空间操作。这些工作实例主要集中在R-tree建立[8]、空间查询点[38]、空间查询轨迹数据[24]、KNN[2,38]、ANN查询[36]、RNN查询[2]、空间链接[38]、精确KNN链接[23]、和模糊KNN链接[37]。
统一的空间操作框架。针对不同的空间操作存在四个相近的系统:(1)Hadoop-GIS[1]是一个空间数据仓库系统,主要集中处理医疗数据。(2)Parallel-Secondo[22]是一个并行空间数据库管理系统,采用Hadoop作为一个分布式任务调度者,当所有的存储和空间查询处理通过运行在集群节点上的空间DBMS实例。(3)MD-HBase[27]扩展了HBase去支持多维索引,允许非常高效的使用范围和字段式查询检索点。(4)通过格网文件和R-Tree索引扩展Hadoop,提供新的MapReduce组件允许在空间MapReduce程序中使用这些索引。
本文的工作,CG_Hadoop,基于以上两个部分。首先,并没有完全集中在一个特定的空间操作上。而是涵盖了5个不同和基础的计算几何空间操作。第二,没有提供一个新的系统。而是提供了一个基于SpatialHadoop的多种计算几何算法的高效实施,这样可以利用提供的空间索引得到更高的性能。总之,CG_Hadoop形成了综合的MapReduce类库的核心,来进行计算几何操作。它的开源特性也使得他能够成为一个研究载体,供研究者去建立更多的计算几何算法,充分发挥MapReduce范式的优势。
本文介绍了CG_Hadoop;一套可伸缩的和高效的MapReduce算法,对各种基本计算几何操作,即,多边形合并、凸包、最远坠和最近组对。对于每一种操作,CG_Hadoop具有两个版本:基于Apache Hadoop系统和基于SpatialHadoop系统。CG_HAdoop中的算法采用了分而治之的方法,利用Hadoop和分布式并行环境SpatialHadoop,从而比相应的传统算法达到更好的性能。同时,SpatialHadoop算法明显优于Hadoop算法,因为他们利用SpatialHadoop之内空间索引和组件。总的来说,CG_Hadoop形式一个全面的MapReduce计算几何类库操作。在一群25台机器集群中的,数据达到了128GB,广泛的实验结果表明使用Hadoop和SpatialHadoop系统的CG_Hadoop比传统算法分别达到了29倍和260倍。