文/彭旭
随着数据采集设备的井喷式增长,对海量的采集数据进行处理的需求日益增长,大数据技术为海量数据处理提供了合适的解决方案。从Hadoop 的MapReduce 到Spark 内存计算,大数据计算的性能得到了很大的提高。而GIS 行业的关注重点则是带有位置信息的时空大数据的计算处理,时空大数据是最重要的大数据之一,它的价值在于时间、空间、对象之间的关联关系,对时空大数据的处理、分析和挖掘是建设智慧城市必不可少的一环。主流的大数据框架如Hadoop、Spark 等并不支持空间计算,GeoSpark 在Spark 的基础上提供了空间大数据计算能力的支持。本文主要研究基于GeoSpark 的空间大数据计算优化问题。
Spark 是一个基于内存计算的支持大规模数据处理的统一分析引擎,由Spark Core 核心模块以及在核心模块上针对不同应用场景分别构建的Spark SQL、Spark Streaming、MLlib、GraphX 四个模块构成,分别用于支持SQL 交互查询、实时数据流处理、机器学习和图计算。其中Spark Core 提供了分布式任务调度和I/O功能,其基础的程序抽象称为弹性分布式数据集(Resilient Distributed Dataset,RDD),是一个可以并行操作、支持容错的数据结构。
Spark 本身不支持空间数据结构和空间计算,GeoSpark 在Spark 的基础上对空间大数据计算的功能进行了扩展。其实现架构主要分为两层,分别是空间数据结构层和空间查询处理层。
空间数据结构层的内容包括基本的分布式空间数据结构、空间数据分区以及各个分区内构建局部空间索引等内容。其中对于分布式空间数据结构,GeoSpark 通过结合Spark RDD 和JTS 工具,提供了Spatial RDD 这一具体实现方案,支持点、线、面、圆等空间数据结构;对于空间数据分区,GeoSpark 支持规则格网、R 树、四叉树等分区方式,通过对空间数据按照空间近邻的方式划分分区,在单个分区内进行空间比较计算,来实现Filter And Refine 模型以提高查询计算的效率;在各个分区内,GeoSpark 还支持R 树、四叉树两种类型的空间索引,提高空间比较运算的执行效率。
空间查询处理层的内容包括标准的空间查询SQL 和SpatialRDD 的API。SQL 语法支持空间对象的构造函数、空间计算函数和空间关系推断函数如包含、相交等。
JTS(Java Topology Suite)工具是一个用Java 语言开发的支持拓扑几何计算的开源软件库,GeoSpark 的空间计算部分的功能均基于JTS 提供的API 进行实现。其中,在实现空间相交运算时,GeoSpark 通过JTS 的Geometry API 来判断两个空间对象是否相交。但对于批量空间相交运算,即判断一个目标空间对象与一批待匹配空间对象的相交比较运算,考虑到目标空间对象在计算过程中的不变性,包括索引在内的许多中间数据被大量的重复计算,造成了计算性能的浪费。JTS 提供的PreparedGeometry API 对中间数据进行缓存,避免了重复计算,在实际情景中计算性能的提升能达到40 倍。本文基于JTS 提供的PreparedGeometry 的API,重写了GeoSpark的空间相交运算,并与GeoSpark 原生的实现方式进行对比,发现计算效率有显著的提升。
本文实验采用的计算模型为计算城市出租车最常行驶的道路,具体计算逻辑为将生成缓冲区后的道路数据与轨迹点数据做空间相交运算并统计与每条道路相交的轨迹点位的总数量,按照轨迹点位数量对道路数据进行排序,从而得到行驶车辆最多的道路。
实验中的Spark 应用程序运行在由四台服务器构建的集群上,几台服务器在同一个局域网内。实验使用的Hadoop 版本是2.7.3,Spark 版本是2.2.0,GeoSpark 的版本是1.0.1。
参与计算的数据量大小分别是一亿条轨迹点位数据和1437 条道路数据,平均每条轨迹点数据大小为23 个字节(Spark 只读取参与计算的字段)。Spark 应用程序分配的资源为:4 个Executor,每个Executor 分配了8 核8GB内存,Driver 分配了4 核1GB 内存,分区数设置为1000。
实验结果为使用Geometry API 执行时间为2048 秒,而使用PreparedGeometry API执行时间只需要319 秒。可以看出,相比基于Geometry API 进行空间相交计算,基于PreparedGeometry API 的计算效率有显著的提升。
大数据技术已经越来越广泛的应用到各个行业当中,时空大数据则是GIS 行业与大数据技术结合的重要研究方向。GeoSpark 在Spark 的基础上提供了对空间大数据进行处理计算的支持,本文则对GeoSpark 空间计算的性能优化进行了研究。未来大数据技术还将进一步发展,如何扩展大数据计算的应用领域、提高数据计算处理的能力还需要更进一步的研究。