GeoSpark是一个用于处理大规模空间数据的开源内存集群计算系统。是传统GIS与Spark的结合。GeoSpark由三层组成:Apache Spark层、Spatial RDD层和空间查询处理层。
GeoSpark是一个成熟的集群计算框架,可以在Apache Spark中加载、处理和分析大型空间数据。
一组开箱即用的空间弹性分布式数据集(SRDD)类型,为几何和距离操作提供内部支持。SRDDS为Apache Spark程序员提供了一个应用程序编程接口(API),以便轻松地开发他们的空间分析程序。
空间数据索引策略,使用网格结构对输入空间RDD进行分区,并将网格分配给机器进行并行执行。GeoSpark还自适应地决定是否需要在空间RDD分区上本地创建空间索引,以便在集群中的运行时性能和内存、cpu利用率之间取得平衡。
支持各种空间数据输入格式(如逗号分隔值、制表符分隔值和wkt文本)。与用户花时间自己解析输入格式不同,GeoSpark用户只需要指定格式名称和空间数据的开始列,GeoSpark将自动进行数据转换并将处理后的数据存储在SpatialRDDs中。在存储层,GeoSpark利用JTS拓扑套件来支持空间对象。每个空间对象存储为点、矩形或多边形类型。根据空间对象的类型,将空间RDDs (Spatial RDDs, SRDDs)定义为:
GeoSpark为SRDDs提供内置几何操作。一旦初始化了SRDD,用户就可以使用这个SRDD的内置几何操作。从实现的角度来看,这些几何操作通过Map、Sort、Filter、Reduce等RDD算子与Apache Spark Layer交互。在这个透明的过程中,用户只需要专注于空间分析程序细节,而不需要关注底层过程。
GeoSpark提供了一组几何操作,称为几何操作库。该库为几何操作提供了原生支持,且遵循开放地理空间协会(OGC)的标准。几何操作示例:
通过创建一个用于数据分区的全局网格文件,GeoSpark自动对所有加载的空间RDDs进行分区。主要思想:将空间分割为若干个相同地理大小的网格单元(目前的版本支持不同大小的网格单元),这些网格单元组成一个全局网格文件。然后遍历SRDD中的每个元素,如果元素与网格单元重叠,则将网格单元ID分配给该元素。当某个元素与多个网格单元重叠时,则复制该元素,将多个网格ID分配给该元素以及副本。
网格分区优点:SRDD数据按网格划分后,只需要计算同一网格内的元素的空间关系。集群不需要花费时间在那些保证不会相交的不同网格单元中的空间对象上。
GeoSpark自适应地决定是否应该为某个SRDD分区创建本地空间索引,这是基于索引开销(内存和时间)和查询选择性以及空间对象数量之间的权衡。由于索引构建是一个额外的开销,所以对于一些只有很少空间对象的SRDD分区,GeoSpark执行一个完整的空间对象扫描或嵌套循环。
分区索引优点:对于同一网格(分区)中的元素,GeoSpark可以创建局部空间索引,如动态四叉树或R-Tree。与基于扫描或嵌套循环的算法相比,基于索引的空间查询可能表现出更高的效率。
GeoSpark通过以下步骤实现了空间范围查询算法:
将查询窗口广播到集群中的每台机器,并在必要时在每个SRDD分区上创建空间索引。
对于每个SRDD分区,如果创建了空间索引,则使用query窗口来查询空间索引。否则,请检查查询窗口和SRDD分区中的每个空间对象之间的空间谓词。如果空间谓词为真,则算法将空间对象添加到结果集中。
删除由于全局网格分区阶段而存在的空间对象副本。
将结果返回到spark程序的下一阶段(如果需要),或者将结果集保存到磁盘。
为了加快空间连接查询的速度,几乎所有的算法都创建了空间索引或网格文件。连接算法步骤:
首先遍历两个输入SRDDS中的空间对象,进行SRDD分区操作,并判断是否需要建立分区空间索引。
然后,算法通过它们的键(网格id)连接这两个数据集。如果目标数据集有分区空间索引,则循环遍历连接数据集的要素,通过分区空间索引查询符合连接关系的目标数据。
如果没有索引,则进行嵌套循环,判断同一网格中连接数据集和目标数据集两两要素之间是否符合连接关系。最终得到符合连接关系的结果集。
以连接要素为Key,目标要素为Value,对结果集进行分组聚合,除去重复目标数据,得到最终的结果集。
源码Github地址:https://github.com/DataSystemsLab/GeoSpark 文档地址: http://datasystemslab.github.io/GeoSpark/