SpatialHadoop中空间索引系列之(一)空间索引构建

来源:互联网 发布:数据采集程序流程图 编辑:程序博客网 时间:2024/05/16 02:51

   SptialHadoop是基于hadoop扩展的用于处理空间大数据的与计算平台。最近的工作研究一下在大数据环境下空间索引的构建方法。今天就讨论下在spatialhadoop当中,空间索引是如何构建的。文章地址:Spatialhadoop

    1、概述

为了弥补在hadoop中创建索引结构的不足,我们采用了两层索引的方法,包括全局索引和局部索引。全局索引存储在主节点上,主节点通过一个分区集合来对存储在子节点上的数据进行切分,每一个分区都有一个局部索引用来组织自己的数据。这样的组织方式主要解决了两个问题:1)它适合mapreduce编程范式,本地索引能够通过一个mapreduce工作来并行处理;2)本地索引的大小允许每一个被批量加载到内存中和通过扩展的方式写入到一个文件中。用户可以通过下面的spatialhadoop shell命令来对一个输入文件 src file 创建不同类型的索引,最终生成一个输出文件 dst file。这里的索引类型包括grid,rtree,和 r+tree:index <src file> <dst file> sindex:<index-type>。


   2、索引构建


    忽略底层空间索引的构建,在spatialhadoop中构建索引可以分为三个阶段:分区、局部索引和全局索引。不同类型的空间索引在细节上还有所差异。


第一阶段:分区:在这个阶段,系统将输入的文件从空间上分成n个区,在分区的过程中需要满足三个目标:(1)合适的块:每一个分区应该适合HDFS块的大小 64MB;(2)空间位置:相邻的要素被分在同一个区域中;(3)负载均衡:所有的分区应该大小大致相同。我们通过以下三个步骤来实现这三个目标:


步骤1:计算分区的个数。不考虑空间索引的类型,我们计算以下分区的个数 n,计算公式:n=S(1+a)/B,其中S是指数据文件的大小,B是指HDFS中块的大小(64MB),a是指额外开销率,默认值是0.2,主要是指重复的记录和存储局部索引的额外开销。总之,该方程是的平均分区大小比B小。


步骤2:计算分区边界。在这个阶段,每一个单独的分区定义一个矩形,我们确定的空间区域能够覆盖该分区。为了适应分布不均甚至成偏态分布的数据,根据底层索引构建的不同,分区边界的计算方法也不相同。该部分输出的结果是n个分区的矩形的集合,这个集合覆盖了整个空间区域。


步骤3:物理分区。在步骤2中计算了分区边界,我们开始通过一个mapreduce工作来从物理上对输入的文件进行分区。这里的问题主要解决怎么处理具有空间范围的要素,如面,这些要素往往会覆盖多个分区。一些索引方法会给最合适的分区分配一条记录,同时,所有覆盖的分区会复制这条记录。重复的记录会在后期查询过程进行处理,以此来保证结果的准确性。最后,对每一条记录r分配到对应的分区P中,map功能写入一对中间键<p,r>。这些中间键通过p进行分组,然后进行局部索引阶段的reducer工作。


2)第二阶段:构建局部索引。该部分的目的是针对每一个物理分区的数据内容构建所需的局部索引(如Grid或者R-tree)。该部分通过reduce功能将记录分配到每一个分区,在局部索引文件中存储所有记录。每一个分区局部索引必须满足一个HDFS块的大小。因为(1)这样允许所有的空间操作可以通过mapreduce范式来获取局部索引,在局部索引中每一个索引都可以通过一个map任务来完成。(2)能够确保当hadoop重置所有块的时候,局部索引可以被作为一个块。在第一个阶段中,分区已经被实现了,并且保证了每一个分区适合HDFS块的大小。一旦一个分区太大,我们按照64MB将其分为更小的块,这样能够作为一个单独的块写入。为了确保局部索引连接后能够与块保持一致,每一个文件将会附加虚拟数据使其大小正好为64MB。


3)第三阶段:构建全局索引。这个阶段的目的是对所有的分区来构建全局索引。一旦mapreduce分区工作完成,我们将开始一个HDFS concat 命令,通过该命令可以连接所有的局部索引文件生成一个索引文件,这个就是最终的索引文件。然后,主节点通过内存计算来构建全局索引,该索引是将所有文件块的矩形边界作为索引键。全局索引通过批量加载来构建,该过程在主节点内容中一直进行。一旦主节点宕机或者重启,只有在重新要求的情况下,才会重新构建全局索引。

下一节,将从代码上来解析下内部的实现。



0 0
原创粉丝点击