Open liujiusheng opened 5 years ago
我用geomesa-redis 导入面数据也报错,有人找到解决方法了吗
我现在估计geomesa-fs工具在导入polygon,mutilpolygon的时候会有问题,不管是官方示例还是自己的示例都导入不进去,但是在导入point类型的时候是可以的,后续再继续尝试。
我用geomesa-redis 导入面数据也报错,有人找到解决方法了吗 可能是你的数据中有自相交的问题,建议处理了再导。
这个确定是没有的,我自己用arcgis新建的polygon,都是是不相交的面,坐标是WGS84
预备知识:
geomesa-tutorials是geomesa快速上手的一个工具,让我们知道geomesa是可以导入数据和查询数据的,同时也提供了一些代码供我们开发时参考,跟我们正式使用的geomesa没有太大关系。 下载地址: https://github.com/geomesa/geomesa-tutorials/releases
文档地址: https://www.geomesa.org/documentation/tutorials/index.html#quick-starts
实际项目中我们使用的是geomesa的命令行工具包,它与geomesa-tutorials没有任何关系,该工具包支持本地文件夹存储(fs),HBase存储,Redis存储等多种存储方式,不过目前我只试通了HBase的模式。 各种模式的工具包下载地址: https://github.com/locationtech/geomesa/releases
命令行工具help提示内的 星号 表示必填,而不是sql中的 *
JAVA_HOME配置
FS模式:
geomesa在fsds模式下运行不一定需要安装hadoop,因为我没有在运行hadoop的时候geomesa也一样能查询。
geomesa安装教程可参照:
https://www.geomesa.org/documentation/tutorials/geomesa-quickstart-fsds.html
工具的安装可从github直接下载对应版本解压后在bin目录找到geomesa-fs文件运行就行了,不用按照官方文档里那样操作,下载地址为:
https://github.com/locationtech/geomesa/releases
解压好后要先运行一遍bin/install-hadoop.sh安装相应的包(测试发现不一定需要安装)
实际查询过程中总是容易报未知错误,重复尝试两到三次却能成功,经测试发现,fsds模式下不依赖于hadoop,所以可以放心地不安装hadoop,不稳定的情况也是由hadoop引起的,删除hadoop后就稳定了。
执行快速指南中的初始化脚本:
java -cp geomesa-tutorials-fsds/geomesa-tutorials-fsds-quickstart/target/geomesa-tutorials-fsds-quickstart-2.4.0-SNAPSHOT.jar org.geomesa.example.fsds.FileSystemQuickStart --fs.path /tmp/fsds/ --fs.encoding parquet
注意:按官方教程clone下来的版本号为2.4.0-SNAPSHOT,测试的时候建议选择稳定版进行测试。
导入数据:
支持
shp, csv, tsv, avro, etc
文件格式./geomesa-fs ingest -p /tmp/fsds -e parquet -s example-csv -C example-csv --partition-scheme daily,z2-2bit ../examples/ingest/csv/example.csv
daily,z2-2bit是指文件存储时的文件命名规则,这个导入了之后应该是在/tmp/fsds目录下新建了一个表,不是原来那个表了。
导入shp文件:
./geomesa-fs ingest -p /tmp/fsds -e parquet -s senstive -C senstive --partition-scheme xz2-2bits /root/data/double_evaluation_senstive.shp
坐标系只支持4326,不支持4490。 shp文件中的ID等字段必须移除,因为geomesa有一些内置的关键词,ID是其中之一。 shp文件中的Shape字段在导数据时系统默认以the_geom代替。 我现在估计geomesa-fs工具在导入polygon,mutilpolygon的时候会有问题,不管是官方示例还是自己的示例都导入不进去,但是在导入point类型的时候是可以的,后续再继续尝试。
所有不是单点的都可以叫做:non-point
规则:
查询或导出数据:
要注意参数的顺序,顺序错误有可能会出错。
查询某个表中的数据所有数据: ./geomesa-fs export -f gdelt-quickstart -p /tmp/fsds/
查询表中ActionGeo_CountryCode 字段为AS的数据,且只返回ActionGeo_CountryCode,Actor2Name这两个字段:
添加一些查询条件:
./geomesa-fs export -f gdelt-quickstart --path /tmp/fsds -q "ActionGeo_CountryCode = 'AS'" -m 10 -a "ActionGeo_CountryCode,Actor2Name"
-f的参数为表名称, -p参数为数据在服务器上的地址。若要增加查询条件可使用-q。 -q的参数为cql,即sql一样的代码。其参数必须用双引号包起来,参数里面的字符串要用单引号括起来,否则会出错。
支持的所有查询函数: https://docs.geoserver.org/stable/en/user/filter/function_reference.html#filter-function-reference
-a的参数内也可以使用函数进行计算
只统计数量:
./geomesa-fs stats-count -f gdelt -p /tmp/fsds --no-cache
一定要有--no-cache,可能是框架的bug吧。
HBase模式:
HBase的安装并非一定要hadoop,hadoop只是提供一个文件的存储路径而已,我们简单安装时使用linux原来有的文件系统路径作为HBase的存储位置也是可以的。
HBase启动不成功?报错日志中有220.250.64.228:0?
配置文件里把ip和端口都配置一下吧。官方文档里没有要求配置这两项。 主要原因还是/etc/hostname文件中主机的别名叫localhost.localdomain HBase默认取的地址错了,对不上就找不到HBase服务的地址。 亲测可通过/etc/hosts文件内必须加上一行本机ip的内容,即192.168网段的配置,来解决。 也可以通过断网启动的方式解决。 配置hbase.master为ip地址?配置hbase.master.port?这两个我不太清楚要不要修改,但是我估计开发过程中要用代码连接时是需要配置这两项的。
hbase的conf/hbase-site.xml配置文件示例:
导入hbase示例数据:
java -cp geomesa-tutorials-hbase/geomesa-tutorials-hbase-quickstart/target/geomesa-tutorials-hbase-quickstart-2.3.0.jar org.geomesa.example.hbase.HBaseQuickStart --hbase.zookeepers localhost --hbase.catalog test
此时直接运行示例会报一个错误, 设置hbase.table.sanity.checks为false就好了,虽然在文档中并不能找到这个配置。
需要复制/root/geomesa-hbase_2.11-2.3.0/dist/hbase/geomesa-hbase-distributed-runtime_2.11-2.3.0.jar到/root/hbase-1.3.3/lib目录中。
导入shp文件到hbase中:
./geomesa-hbase ingest -c sensitive_polygon --feature-name sensitive_polygon --input-format shp -z localhost /root/data/double_evaluation_senstive_polygon.shp
导入时会报类似于下图的错误:
原因是java包的版本不对,查看/root/geomesa-hbase_2.11-2.1.0/lib目录下的包的情况,可以找到 /root/geomesa-hbase_2.11-2.1.0/bin/htrace-core4-4.1.0-incubating.jar包,这个包是通过/root/geomesa-hbase_2.11-2.1.0/bin/install-hadoop.sh安装进来的,所以可以检查这个文件,打开文件发现安装的hadoop版本为2.8.4,htrace_core_version版本为4.1.0-incubating,修改hadoop版本为2.5.6,htrace_core_version版本为3.1.0-incubating。再重新安装就可以了。然后再试一下导入数据就成功了。
之所以会怀疑到这里是因为geomesa命令行工具的日志里面有一行:
Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
可以猜测到我们自己安装的hadoop版本并没有被geomesa使用,而是使用了/bin/install-hadoop.sh命令安装的包。
javahome等变量的配置,/etc/profile文件后面加上。可使用系统自带的openjdk。最后一行是配置的java运行最大内存,这个值要根据我们要读取的最大文件大小来设置,否则某些大文件不能完全导入。
查询:
大区域导出:
./geomesa-hbase export -f sensitive_polygon -z localhost -c sensitive_polygon -q "intersects(the_geom, 'POLYGON((110.143 31.008,110.133 29.191,107.993 23.078,108.351 30.911,110.143 31.008))')"
小区域导出:
./geomesa-hbase export -f sensitive_polygon -z localhost -c sensitive_polygon -q "intersects(the_geom, 'POLYGON((108.02 31.346, 108.873 31.362, 108.884 31.264, 108.73 31.28,108.02 31.346))')"
只统计数量:
./geomesa-hbase stats-count -f sensitive_polygon -z localhost -c sensitive_polygon --no-cache -q "intersects(the_geom, 'POLYGON((110.143 31.008,110.133 29.191,107.993 23.078,108.351 30.911,110.143 31.008))')"`
其它:
查看centos磁盘空间:df -h
lvextend -L +10G /dev/mapper/centos-root 磁盘扩容的时候如果剩余空间实在太小了可能会报错: Couldn't create temporary archive name。删除一些 文件空出一些空间就可以了。