liujiusheng / blog

个人博客,blog
19 stars 0 forks source link

GEOMESA空间分析中间件使用(一)环境安装 #149

Open liujiusheng opened 5 years ago

liujiusheng commented 5 years ago

预备知识:

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 {
  sfts {
    "senstive" = {
      attributes = [
        { name = "GRIDCODE", type = "Integer" }
        { name = "the_geom", type = "MultiPolygon"}
      ]
    }
  }
  converters = {
    "senstive" = {
      "fields" : [
          {
              "name" : "the_geom",
              "transform" : "$1"
          },
          {
              "name" : "GRIDCODE",
              "transform" : "$3"
          }
      ],
      "id-field" : "$0",
      "type" : "shp"
    }   
  }
}

查询或导出数据:

要注意参数的顺序,顺序错误有可能会出错。

查询某个表中的数据所有数据: ./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配置文件示例:

<configuration>
  <property>
   <name>hbase.master</name>
   <value>localhost</value>
  </property>
  <property>
   <name>hbase.master.port</name>
   <value>16000</value>
  </property>
  <property>
    <name>hbase.rootdir</name>
    <value>file:///home/root/hbase</value>
  </property>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>localhost</value>
  </property>
  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/home/root/zookeeper</value>
  </property>
  <property>
    <name>hbase.table.sanity.checks</name>
    <value>false</value>
  </property>
  <property>
    <name>hbase.unsafe.stream.capability.enforce</name>
    <value>false</value>
    <description>
      Controls whether HBase will check for stream capabilities (hflush/hsync).

      Disable this if you intend to run on LocalFileSystem, denoted by a rootdir
      with the 'file://' scheme, but be mindful of the NOTE below.

      WARNING: Setting this to false blinds you to potential data loss and
      inconsistent system state in the event of process and/or node failures. If
      HBase is complaining of an inability to use hsync or hflush it's most
      likely not a false positive.
    </description>
  </property>
</configuration>

导入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

导入时会报类似于下图的错误:

image

原因是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运行最大内存,这个值要根据我们要读取的最大文件大小来设置,否则某些大文件不能完全导入。

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64
export JRE_HOME=$JAVA_HOME/jre
export HADOOP_HOME=/usr/local/hadoop
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
export JAVA_OPTS="-Xmx1024m"

查询:

大区域导出:

./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。删除一些 文件空出一些空间就可以了。

llsshh1985 commented 3 years ago

我现在估计geomesa-fs工具在导入polygon,mutilpolygon的时候会有问题,不管是官方示例还是自己的示例都导入不进去,但是在导入point类型的时候是可以的,后续再继续尝试。

我用geomesa-redis 导入面数据也报错,有人找到解决方法了吗

liujiusheng commented 3 years ago

我现在估计geomesa-fs工具在导入polygon,mutilpolygon的时候会有问题,不管是官方示例还是自己的示例都导入不进去,但是在导入point类型的时候是可以的,后续再继续尝试。

我用geomesa-redis 导入面数据也报错,有人找到解决方法了吗 可能是你的数据中有自相交的问题,建议处理了再导。

llsshh1985 commented 3 years ago

这个确定是没有的,我自己用arcgis新建的polygon,都是是不相交的面,坐标是WGS84