项目一直有空间大数据的需求,之前使用的是spatial-framework-for-hadoop项目来处理,由于缺少空间索引,因此处理速度一直不太理想,所以一直在找合适的框架来处理空间数据。
Apache Sedona™(incubating)就是一个专门处理大规模空间数据的spark框架,原为GeoSpark,后被Apache收录孵化,更名为Sedona,相比于传统的ArcGIS、QGIS等分析工具,Sedona可以提供更好分布式空间分析。
GraalVM 是 Oracle 发布的下世代 Java 虚拟机,分别有社区版和企业版。Facebook团队使用了GraalVM作为OpenJDK的替代品。在这个场景中,迁移到GraalVM非常简单——只需要切换运行环境,不需要更改应用程序代码。这种转换使得应用程序运行得更快,这得益于GraalVM的高级性能优化,无需任何手动调优。
本文就使用GraalVM和Apache Sedona对一千多万的面和一千多万的点进行相交分析。
框架采用的Spark(3.1.2),Hadoop(3.2),Sedona(1.1.1-incubating)
数据准备
数据还是取自微软开源建筑物数据,处理出id和wkt的csv,(wkt不能用单引号,血泪经验)
处理流程
初始化代码,要设置序列化,设置分区,设置使用rtree为空间索引
SparkSession spark = SparkSession.builder().
config("spark.serializer","org.apache.spark.serializer.KryoSerializer").
config("sedona.join.numpartition",900).config("sedona.globel.indextype","rtree").
config("spark.kryo.registrator","org.apache.sedona.core.serde.SedonaKryoRegistrator").
master("local[*]").appName("cn.dev.Learn04").getOrCreate();
SedonaSQLRegistrator.registerAll(spark);
加载点面数据,生成点面数据集
String inputCSVPath = Learn042.class.getResource("/capnt.csv").toString();
Dataset pointDF = spark.read().format("csv").
option("delimiter", ",").
option("header", "true").
load(inputCSVPath);
pointDF.createOrReplaceTempView("pointdf");
String inputBuildingCSVPath = Learn042.class.getResource("/california20191107.csv").toString();
Dataset buildingDF = spark.read().format("csv").
option("delimiter", ",").
option("header", "true").
load(inputBuildingCSVPath);
buildingDF.createOrReplaceTempView("buildingdf");
点面相交分析
sqlText = "select a.id,b.id from point as a,building as b where ST_contains(b.shape, a.shape)";
spatialDf = spark.sql(sqlText);
spatialDf.createOrReplaceTempView("re");
结果优化
全部结果需要五分钟左右,借助Graalvm虚拟机和给数据集加缓存,可以优化到四分钟。
Sedona还是一个效率极高的空间大数据框架,值得多多研究。
spatialDf.cache();
spatialDf.count();
[图片上传失败...(image-8c5e97-1642044059262)]
参考资料:
https://github.com/apache/incubator-sedona/
https://zhuanlan.zhihu.com/p/106555993
https://blog.csdn.net/huangmingleiluo/article/details/119321222
https://www.jianshu.com/p/e1d262ac3df8
网友评论