很多大数据都具有空间位置信息,这些空间大数据可以通过大数据gis技术进行高效存储、索引、处理和分析。另一方面,经典gis所需面对和处理的数据规模也在快速膨胀,对于经典gis中超大规模数据的处理与分析,同样需要大数据gis技术作为支撑。经典gis中常用的缓冲区分析、叠加分析、空间查询等算法都可以通过大数据gis技术进行分布式重构,用以面向不断膨胀的超大规模数据。
一、经典gis数据存储方案
在各种gis项目应用当中,首要设计的就是数据存储方案。在经典gis当中,典型数据类型包括矢量的点线面数据、影像和栅格数据、地图缓存瓦片数据等类型。在存储引擎类型方面,使用较多的类型包括以postgresql为代表的sql数据库型存储,以及众多nosql型数据库,包括以mongodb为代表的文档型数据库,以hbase为代表的列存储数据库,以redis为代表的key-value型数据库等。随着互联网应用的深入,各种nosql型数据库得到了快速发展,并具有支持分布式可扩展部署,高性能读写等特征,因此在大数据gis技术中,有必要对其进行吸收和融合。
在大数据应用中,由于涉及的数据体量巨大,存储和计算环境的部署强调二者的一体化,或者通过计算向数据靠拢来实现高效的数据读写。在海量空间数据场景下,需要通过空间索引技术将节点内的数据尽可能的保持完整性和独立性,尽量避免节点间的数据交换,从而实现高效的分布式计算。
1、postgresql
postgresql是一个功能强大的开源关系型数据库系统。可以支持各种主流操作系统,它完全兼容acid,完全支持外键,连接,视图,触发器和存储过程(使用多种语言)。在gis应用当中,可以使用它进行矢量点线面数据,栅格数据的高效存储和查询,由于它完全支持ansi-sql:2008标准,因此可以基于其上定制各种业务化的查询和存储过程。另一方面,基于其上的postgis数据库可以直接进行空间对象的存储和索引,并支持高效的查询,以openstreetmap为代表的很多gis应用直接基于postgresql引擎之上构建存储层。
2、mongodb
mongodb是一个基于分布式存储的nosql文档型数据库,它是一个介于关系型数据库和非关系型数据库之间的产品。大多数nosql都提供较少的关系型数据库特征,但mongodb是个例外,其对于sql查询支持较为丰富。其bson形式的数据结构非常适合进行缓存瓦片的存储,而缓存瓦片的使用往往也不要求过多的sql查询语法支持。另一方面,它也同样可以进行矢量点线面的存储,并且内置了spatial扩展可以支持空间索引和空间查询。
3、hdfs
hdfs是一种分布式文件系统,它虽然不是一种数据库产品,但由于其是hadoop生态体系的基石,且与spark技术无缝结合,因此在大数据实施时,经常被用来作为一种通用型存储方案。在大数据gis当中,其使用方式主要有两类,一种是直接作为文件系统,将csv、json格式的大文件放置其上进行直接存储,另一种是作为spark计算引擎的存储方案,使用自定义的二进制格式存储空间数据,并进行空间二级索引设计和实现,以高效对接spark分布式计算。
二、经典gis数据处理方案
由于各种存储引擎特点不一,因此在项目实施中,如何选择最适合的存储和计算方案,需要与项目的具体使用背景相结合。我们建议从数据规模(千万级、亿级、十亿级还是更大)、数据更新频率(年、月、日还是更小)、数据处理复杂性(sql查询、空间查询还是复杂空间运算)等几个维度进行综合考量。我们选择了几个较为典型的应用场景,进行具体说明。
1、千万级实时更新
该应用的典型客户为政府各单位的分中心,虽然全国范围内的汇总数据规模庞大,但省市分中心单位维护的子库数据规模在千万级左右。虽然数据规模不大,但是具有业务逻辑复杂,要求实时更新的特点,因此推荐根据业务场景,灵活使用oracle或udb数据库型引擎。可以进行实时更新,也可以根据复杂业务进行较复杂的sql查询检索。并且可以对接spark计算引擎,进行大规模数据的复杂计算。
2、亿级准实时更新
该应用的典型客户是部委的全国级主中心,从各省市分中心汇总的数据规模可以达到亿级到十亿级规模,更新频率低于分中心的实时业务系统,但也需要具备一些sql查询能力。此时推荐使用postgresql或mongodb进行分布式存储,一方面可以支持数据的动态扩展,另一方面也可以支持一定的sql查询。当然也可以对接spark计算引擎,进行业务计算。
3、十亿级低频更新
该应用的典型客户也是部委的全国级主中心,可能需要对汇总的多年份历史数据进行时间序列分析或者综合性分析。此时的数据更新频率较低,可能是以年为单位,但总体的数据规模非常庞大,可能达到十亿甚至百亿规模。此时推荐使用hdfs进行数据存储,再对接spark技术进行分布式计算,对这种超大规模的空间数据进行处理和综合分析。
三、经典gis应用案例
矢量数据的空间叠加赋值算法,是国土测绘领域这样的大规模矢量数据分析常用功能。supermapiobjectsjavaforspark以该算法为例,讲解大数据技术如何提升经典gis数据处理和分析性能。矢量数据分析的基础是高效的空间索引,而分布式矢量分析同样需要基于空间索引进行加速。
1、分布式构建空间索引
分布式构建空间索引根据整体流程,又可以细分为索引对象构建,数据集重分区,索引后数据缓存等几个子过程。较常使用的索引类型有均匀格网索引和四叉树索引两种。索引对象构建后可以广播到集群各节点,数据集重分区过程各节点可以获取该对象进行空间对象处理。由于后续的叠加赋值计算需要基于索引后数据进行,所以supermapiobjectsjavaforspark需要把重分区后的数据缓存下来,以kryo序列化的方式将数据缓存到hdfs上。
2、分布式叠加赋值计算
由于在前面的分布式构建索引过程中,supermap iobjects java for spark把按照索引重分区后的数据缓存到了hdfs上,因此在进行叠加赋值计算之前,supermap iobjects java for spark首先需要将数据从hdfs上读取到spark的rdd中。在读取之后,就可以基于索引后的featurerdd进行两图层间的叠加计算了。由于叠加赋值一般涉及被更新数据和更新数据两个数据集,所以supermap iobjects java for spark使用rdd的zippartitions接口来将两个rdd进行组合。
四、经典gis性能提升测试
supermap iobjects java for spark使用的测试环境的单节点操作系统为64位ubuntu 16.04 linux系统,cpu为英特尔酷睿i7-6700k,四核处理器,主频为4 ghz,硬盘为1 tb,内存为16 gb。spark集群配置为一个master节点,四个woker节点,即五台同配置的pc机环境。使用的hadoop版本为2.7.3,spark版本为2.1.0。
测试数据局部放大图
为了保证测试的有效性,supermap iobjects java for spark设计了规模不等的三组矢量数据进行分析计算。a组数据被 更新图层图斑对象数目为10万,更新图层(即提供属性值的图层) 图斑对象数目为80。
两图层数据分布特征为:更新图层的单个矢量面对象面积显著大于被更新图层对象,但二者的总体图斑覆盖范围相近。b组数据被更新图层图斑对象数目为100万,更新图层图斑对象数目为800,两图层数据分布特征与a组数据类似。c组数据被更新图层图斑对象数目为1000万,更新图层图斑对象数目为1万,两图层数据分布特征与a组数据类似。supermap iobjects java for spark将分布式改进后的方法与传统gis软件的单节点叠加赋值功能进行了性能对比,结果如表1所示。
表1性能测试结果
从测试结果可以看出,基于大数据技术的矢量数据叠加赋值方法,在不同级别的实验数据下,相比传统gis单节点功能都有更好的性能表现。在小规模数据量(数据a)场景下性能有约33%的提升,在中等规模数据量(数据b)场景下性能有约71%的提升,在大规模数据量(数据c)场景下性能有约90%的提升,图2使用柱状图来更为直观的进行结果展示。
在对常用的gis核心算法进行分析之后,我们认为:大多数的经典gis核心算法都可以进行分布式算法改进,即使用大数据技术进行海量空间数据处理和分析的性能提升。目前supermap iobjects java for spark已经完成的算法包括空间查询、叠加分 析、缓冲区分析、属性更新、矢量裁剪等功能,后面还计划针对矢量数据处理,拓扑检查等经典gis常用功能进行进一步的升级改进。
内容来源:超图