您的位置:首页 > 其它

GeoSpark学习--初识GeoSpark

2018-04-02 12:13 176 查看

背景

传统的不足:

数据存储方面:

1、现有的数据存储主要是多依赖关系型数据库,比如Oracle等,但是关系型数据库在海量数据管理、高并发读写以及扩展性方面有很大的局限

2、传统的空间数据存储方式不但难以扩展,而且随着数据的激增读写性能存在极大瓶颈

3、传统的分布式文件系统虽然可以存放在不同的节点上,但这种分布式文件系统所支持的扩展性有限

数据分析方面:

大数据时代的数据是处处连接的,每个连接都是一个传感器,这些传感器无时无刻都在进行数据的采集,所以说数据的变化很快,在这样的背景下,迫切需要GIS能够做到低延迟的分析处理工作

技术发展

1、存储去结构化

非关系型数据库比如说HBase、Redis、MongoDB、InfoGrid,这些数据库不需要预先定义模式,并且可以在系统运行的时候动态增加或删除节点,避免了停机维护,提高了拓展性和可靠性

另外这些非关系型数据库没有共享架构,数据一般是存储在本地服务器上,可以直接读取数据,提高了数据的读取性能。

2、计算内存化

对于Hadoop来说主要进行离线数据的计算,应对低延迟的应用场景比较困难,另外Hadoop使用MapReduce模型,该模型将复杂模型使用简单的映射规约,对于复杂的算法逻辑支持不充分,并且数据存储在硬盘上,很容易收IO瓶颈的影响,所以对于处理GIS数据乏力。

而新的技术Spark启用了内存分布式数据集,支持更多的范式,而且配有一个数据处理模型,所以在处理GIS数据中性能更好。

3、分析去模型化

传统的GIS空间数据分析需要先建立分析模型,比如说考虑影响因子,权重,最后综合各影响因素进行建模,然而大数据环境下的数据是时刻在变化的,这样就无法满足,所以去模型化是最终的发展方向

GeoSpark

这里主要介绍GeoSpark以及我调试运行过程中遇到的问题

GeoSpark是在Apache Spark第三方项目中的一个子项目,也是一个用于处理大规模空间数据的集群计算系统,目前最新版本更新到v1.1.0(2018年3月13日)。GeoSpark继承自Apache Spark,并拥有一系列具有创造性的空间弹性分布式数据集(SRDDs),借助机器这些数据集可以有效的加载,处理并分析大规模的空间数据。GeoSpark为Apache开发人员提供了API使得他们能够利用SRDDs方便的开发空间分析程序,这些程序为地理空间查询提供了有力的支持。

主要功能

GeoSparkSQL

最新版本的GeoSpark主要是包含了新的SQL功能,新增了四叉树和R树的索引解析并修复了一些bug。这个版本最主要的就是包含了一个完整的GeoSparkSQL版本,GeoSparkSQL完全支持Apache Spark SQL。

SRDDs

支持特殊的SRDDs,包括PointRDD,RectangleRDD,PolygonRDD以及LineStringRDD。

空间分割

支持的空间分割技术有四叉树、KDB树、R树、沃罗诺伊图(Voronoi diagram)、均匀网络(Uniform grids)

空间索引

支持四叉树、R树、以及空间K近邻查询

调试之路

好,开搞,以下内容较
4000
多,纯属个人踩坑记录,想直接运行的跳到文章末尾即可

1、搭建环境

系统IDESparkScalaJdkMavenSbt
Ubuntu16.04IntelliJ IDEA2017.32.2.12.11.121.8.0_1513.5.31.1.1
基本的环境都搭建好了,没遇到什么问题,具体安装教程网上都有,就不多说,不过在我安装过程中也遇到了坑,这里就不一一说明,有遇到问题的可以问我

2、Git Clone

项目地址



这是什么鬼?怎么迁项目还出了问题,应该是权限的问题



稍微等一会儿就Clone好了,这时候在home可以看到



项目的位置的话看个人习惯,开始迁下来以后权限是只读的,这使得后面使用IDEA导入时候会出现权限的问题,所以需要修改权限

修改权限命令
sudo chmod -R 777 <yourfilename>


这里简单说一下这个命令 chmod 修改文件和文件夹读写执行属性,777 指的就是二进制编码,总共有3位111就是可读可写可编译,即拥有全权限,可写 w=4可读 r=2可执行 x=1 ,详细介绍chown和chmod区别

get !

3、Package + Compile

这里说一下,我最开始没有跑GeoSpark,而是调的其中的一个案例,如果只是想简单的在本地IDE运行该项目的话,完全不需要这个步骤,然而……我还是照着做了

这部分基本没什么问题,只要你maven还有Sbt装好了,按照项目说明一步步执行,就都可以编译通过

4、导入项目

import project->GeoSparkTemplateProject/geospark/java->import project from external model->maven

这里需要注意运行Java部分的代码时,导入项目为maven项目,然后一路next即可,选择SDK时候添加你的jdk1.8



5、build+run

/src/main/Example 点击运行,好,报错

Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.()V from class org.apache.hadoop.mapred.FileInputFormat
at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:312)
at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:199)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:250)
at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:250)
at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:252)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:250)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:250)
at org.apache.spark.SparkContext.runJob(SparkContext.scala:2126)
at org.apache.spark.rdd.RDD$$anonfun$aggregate$1.apply(RDD.scala:1115)
at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
at org.apache.spark.rdd.RDD.withScope(RDD.scala:362)
at org.apache.spark.rdd.RDD.aggregate(RDD.scala:1108)
at org.apache.spark.api.java.JavaRDDLike$class.aggregate(JavaRDDLike.scala:426)
at org.apache.spark.api.java.AbstractJavaRDDLike.aggregate(JavaRDDLike.scala:45)
at org.datasyslab.geospark.spatialRDD.SpatialRDD.analyze(SpatialRDD.java:430)
at org.datasyslab.geospark.spatialRDD.SpatialRDD.analyze(SpatialRDD.java:404)
at org.datasyslab.geospark.spatialRDD.PointRDD.(PointRDD.java:300)
at example.Example.testSpatialRangeQuery(Example.java:156)
at example.Example.main(Example.java:128)


仔细看,主要是IllegalAccessError,Google搜索

1、https://blog.csdn.net/superzyl/article/details/53764731

开始解决,一句话就是项目中的依赖出现了问题,guava冲突,但是在我的pom.xml文件中并没有这个依赖啊?


无果。。

2、http://www.bubuko.com/infodetail-1909839.html

还是那个原因,但是给出了一点具体的解决办法

查看jar包,发现有多个版本的guava,这部分后面项目开发者都进行了修改,现在看到的只有一个版本



我当时是有4个,然后我具体不知道是哪个版本需要,就保留了16.0.1,把其余的都删了,再重新进行整合,编译,结果还是同样的错误

到这里为止,我就不清楚该怎么解决,期间删了项目重新下载,删除其他版本的guava还是没用

3、问导师

这个时候我知道问题肯定出在依赖上,应该是版本依赖冲突或者缺少依赖的问题,但是不知道具体在哪里

导师给我添加了GeoSpark还有Babylon的依赖,这里添加的话就是去maven的官网,对应依赖的地方搜索你想要添加的,就会得到对应的代码,然后复制粘贴到项目的pom.xml文件中即可,这部分我是刚接触还不太明白,后面慢慢熟悉。然而添加以后还是不行,我又开始自己琢磨

4、看原项目说明文档

这时候重新仔细的又看了一下原项目的说明,按照说的都做了不知道问题出在哪里

5、问大佬

实在不知道该怎么办,看了issue中也没有这个错误的回答,问了下师兄说需要打包编译吧,我这里比较不确定,索性我直接开了个issue,当时其实抱着问问的心态,压根儿没想着大佬会回复我,因为国内好多博客下面提问,从来没有收到回复=-=



不要嘲笑我蹩脚的英文。。。

没过几分钟就收到了回复,他说根本还是Spark依赖冲突的问题,让我理解dependency scope



Scope几种模式:

1、test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖

2、compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去

3、provided依赖:在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突

4、runtime在运行的时候依赖,在编译的时候不依赖

一般情况下默认是compile

我按照他说的又重新安装了IDEA,把我原来的配置文件删除,再重新导入项目,直接运行,还是报错。。。

没办法了,只能再继续提问



收到回复赶紧试了一下



!!!

总结

最新版的项目只要配置好环境,迁下来运行就可以了

说说这个过程,花了很久的时间,虽然最后还是没能自己解决,但是过程确实学到了很多的东西,这只是本地IDE中运行项目,后面需要在Spark cluster运行,到现在很多东西还是很模糊,慢慢一点点学习积累吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: