文章目录
1、GeoSpark简介
GeoSpark是一个用于处理大规模空间数据的开源内存集群计算系统。是传统GIS与Spark的结合。GeoSpark由三层组成:Apache Spark层、Spatial RDD层和空间查询处理层。
Apache Spark Layer:Apache Spark层由Apache Spark本地支持的常规操作组成。它包括将数据加载、存储到磁盘 (例如,存储在本地磁盘或Hadoop文件系统HDFS上) 以及常规的RDD操作。
Spatial RDDs Layer:这一层扩展了Spark的RDD,生成Spatial RDDs (SRDDs),可以有效地跨机器分割SRDD数据元素,并引入了新的并行的空间转换和动作操作,为用户编写空间数据分析程序提供了更直观的接口。SRDD层由三个新的RDD组成 :PointRDD、RectangleRDD和PolygonRDD,并为SRDD提供了一个有用的几何操作库,来执行基本的几何操作(例如,重叠、相交),遵循Open Geosptial Consortium(OGC)标准。
Spatial Query Processing Layer:空间查询处理层基于空Spatial
RDDs Layer,支持大规模空间数据集的空间查询(如范围查询和连接查询)。几何对象在SRDD层存储和处理后,用户可以调用空间查询处理层提供的空间查询,geospark在内存集群中处理该查询,并将最终结果返回给用户。
2、Geospark的特点
GeoSpark是一个成熟的集群计算框架,可以在Apache Spark中加载、处理和分析大型空间数据。
一组开箱即用的空间弹性分布式数据集(SRDD)类型,为几何和距离操作提供内部支持。SRDDS为Apache Spark程序员提供了一个应用程序编程接口(API),以便轻松地开发他们的空间分析程序。
空间数据索引策略,使用网格结构对输入空间RDD进行分区,并将网格分配给机器进行并行执行。GeoSpark还自适应地决定是否需要在空间RDD分区上本地创建空间索引,以便在集群中的运行时性能和内存、cpu利用率之间取得平衡。
3、SPATIAL RDD (SRDD) LAYER
3.1 SRDD
支持各种空间数据输入格式(如逗号分隔值、制表符分隔值和wkt文本)。与用户花时间自己解析输入格式不同,GeoSpark用户只需要指定格式名称和空间数据的开始列,GeoSpark将自动进行数据转换并将处理后的数据存储在SpatialRDDs中。在存储层,GeoSpark利用JTS拓扑套件来支持空间对象。每个空间对象存储为点、矩形或多边形类型。根据空间对象的类型,将空间RDDs (Spatial RDDs, SRDDs)定义为:
- PointRDD:PointRDD支持所有的2D Point对象(表示地球表面的点),它们的格式如下:<Longitude, Latitude >。PointRDD中的所有点都被Apache Spark层自动分区,并分配给相应的机器。
- RectangleRDD:RectangleRDD支持以下格式的矩形对象:<PointA(Longitute,Latitude),PointB(Longitute,Latitude)>。点A和点B是一个矩形对角线上的一对顶点。RectangleRDD中的矩形还通过Apache Spark层分布到不同的机器上。
- PolygonRDD:所有随机多边形对象都由PolygonRDD支持。需要的PolygonRDD格式如下: <PointA(Longitute,Latitude),PointB(Longitute,Latitude),PointC…>,列数没有上限。底层Apache Spark层将PolygonRDDs分区到分布式集群。
3.2 SRDDs 内置集合操作
GeoSpark为SRDDs提供内置几何操作。一旦初始化了SRDD,用户就可以使用这个SRDD的内置几何操作。从实现的角度来看,这些几何操作通过Map、Sort、Filter、Reduce等RDD算子与Apache Spark Layer交互。在这个透明的过程中,用户只需要专注于空间分析程序细节,而不需要关注底层过程。
GeoSpark提供了一组几何操作,称为几何操作库。该库为几何操作提供了原生支持,且遵循开放地理空间协会(OGC)的标准。几何操作示例:
- Initialize():此操作的功能是初始化一个Spatial PointRDD、RectangleRDD或PolygonRDD,支持三个常见的几何对象:点、矩形和多边形,以及相关的操作。该操作解析输入数据并将其存储为空间对象类型。
- Oerlap():在一个SRDD中,这个操作的目标是找到所有与其他几何对象相交的内部对象。
- Inside():在一个SRDD中,该操作可以找到其他几何对象包含的所有内部对象。
- mumBoundingRectangle():此操作为SRDD中的每个对象查找最小边界矩形,或返回一个包含SRDD中所有内部对象的最小边界矩形。
3.3 SRDD 分区
通过创建一个用于数据分区的全局网格文件,GeoSpark自动对所有加载的空间RDDs进行分区。主要思想:将空间分割为若干个相同地理大小的网格单元(目前的版本支持不同大小的网格单元),这些网格单元组成一个全局网格文件。然后遍历SRDD中的每个元素,如果元素与网格单元重叠,则将网格单元ID分配给该元素。当某个元素与多个网格单元重叠时,则复制该元素,将多个网格ID分配给该元素以及副本。
网格分区优点:SRDD数据按网格划分后,只需要计算同一网格内的元素的空间关系。集群不需要花费时间在那些保证不会相交的不同网格单元中的空间对象上。
4、SPATIAL QUERY PROCESSING LAYER
4.1 分区索引
GeoSpark自适应地决定是否应该为某个SRDD分区创建本地空间索引,这是基于索引开销(内存和时间)和查询选择性以及空间对象数量之间的权衡。由于索引构建是一个额外的开销,所以对于一些只有很少空间对象的SRDD分区,GeoSpark执行一个完整的空间对象扫描或嵌套循环。
分区索引优点:对于同一网格(分区)中的元素,GeoSpark可以创建局部空间索引,如动态四叉树或R-Tree。与基于扫描或嵌套循环的算法相比,基于索引的空间查询可能表现出更高的效率。
4.2 空间范围查询
GeoSpark通过以下步骤实现了空间范围查询算法:
-
将查询窗口广播到集群中的每台机器,并在必要时在每个SRDD分区上创建空间索引。
-
对于每个SRDD分区,如果创建了空间索引,则使用query窗口来查询空间索引。否则,请检查查询窗口和SRDD分区中的每个空间对象之间的空间谓词。如果空间谓词为真,则算法将空间对象添加到结果集中。
-
删除由于全局网格分区阶段而存在的空间对象副本。
-
将结果返回到spark程序的下一阶段(如果需要),或者将结果集保存到磁盘。
4.3 空间连接查询
为了加快空间连接查询的速度,几乎所有的算法都创建了空间索引或网格文件。连接算法步骤:
-
首先遍历两个输入SRDDS中的空间对象,进行SRDD分区操作,并判断是否需要建立分区空间索引。
-
然后,算法通过它们的键(网格id)连接这两个数据集。如果目标数据集有分区空间索引,则循环遍历连接数据集的要素,通过分区空间索引查询符合连接关系的目标数据。
-
如果没有索引,则进行嵌套循环,判断同一网格中连接数据集和目标数据集两两要素之间是否符合连接关系。最终得到符合连接关系的结果集。
-
以连接要素为Key,目标要素为Value,对结果集进行分组聚合,除去重复目标数据,得到最终的结果集。
相关网址
源码Github地址:https://github.com/DataSystemsLab/GeoSpark
文档地址: http://datasystemslab.github.io/GeoSpark/
参考文献
[1] Yu J, Wu J, Sarwat M. GeoSpark: A Cluster Computing Framework for Processing Spatial Data[J].
[2] Yu J, Wu J, Sarwat M. A demonstration of GeoSpark: A cluster computing framework for processing big spatial data[C]//2016 IEEE 32nd International Conference on Data Engineering (ICDE). IEEE, 2016: 1410-1413.
[3] Huang Z, Chen Y, Wan L, et al. GeoSpark SQL: An effective framework enabling spatial queries on spark[J]. ISPRS International Journal of Geo-Information, 2017, 6(9): 285.
相关博客
https://www.jianshu.com/u/922878a44beb
https://blog.csdn.net/yabosun/article/details/79437632