GeoMesa Avro二进制格式示例

本教程介绍如何使用Java将GeoMesa数据序列化和反序列化为avro格式。

关于本教程

本着简单的精神,本教程中的代码只做了几件小事:

  1. 向GeoMesa查询SimpleFeature

  2. 将数据写入avro文件

  3. 从avro文件读回数据

备份存储的选择

本教程将使用几个不同的后端。为简单起见,本教程的其余部分将假定使用HBase。或者,您可以使用Acumulo、Cassandra、Redis或GeoMesa文件系统数据存储区。如果不使用HBase,本教程其余部分中的命令将略有不同。

先决条件

在开始之前,您必须具备以下条件:

  • Java JDK 1.8

  • Apache Maven 3.6 or later

  • GitHub客户端

  • 完成GeoMesa快速入门,供您选择后端

警告

本教程将使用您在最初的快速入门中编写的数据,因此请确保您首先完成了该操作。

下载并构建教程

在您的计算机上选择一个合理的目录,然后运行:

$ git clone https://github.com/geomesa/geomesa-tutorials.git
$ cd geomesa-tutorials

警告

确保下载或检出与您的GeoMesa版本对应的教程项目版本。看见 关于教程版本 了解更多详细信息。

要确保本教程适用于您的环境,请修改 pom.xml 为HBase、Hadoop等设置适当的版本。

为了便于使用,该项目构建了一个捆绑的构件,该构件在单个JAR中包含所有必需的依赖项。要构建,请运行:

$ mvn clean install -pl geomesa-tutorials-hbase/geomesa-tutorials-hbase-avro -am

备注

模块名称将根据后端的选择而有所不同。

运行教程

在命令行上,运行:

$ java -cp geomesa-tutorials-hbase/geomesa-tutorials-hbase-avro/target/geomesa-tutorials-hbase-avro-$VERSION.jar \
    org.geomesa.example.hbase.avro.HBaseAvroTutorial \
    --hbase.zookeepers <zookeepers>                  \
    --hbase.catalog <table>

其中,您可以提供以下参数:

  • <zookeepers> HBase ZooKeeper法定人数。如果您在独立模式下安装了HBase,这将是 localhost 。请注意,对于大多数用例,最好将 hbase-site.xml 从GeoMesa类路径上的集群,而不是指定ZooKeeper。

  • <table> 保存快速入门数据的表的名称

备注

路径、类名和必需的参数将根据后端选择的不同而有所不同。

代码将查询GeoMesa中的数据,将其写入字节数组,然后将其读回:

Loading datastore

Querying data store and writing features to Avro binary format
Wrote 2356 features as 72680 bytes
Reading features back from Avro binary format
01 719024896=719024896|UNITED STATES|USA|SENATE||042|2|1|2|2|Texas, United States|US|2017-12-31T00:00:00.000Z|POINT (-97.6475 31.106)
02 719024892=719024892|UNITED STATES|USA|DEPUTY||010|4|1|4|3|Abbeville, South Carolina, United States|US|2017-12-31T00:00:00.000Z|POINT (-82.379 34.1782)
03 719024891=719024891|UNITED STATES|USA|||010|2|1|2|3|Ninety Six, South Carolina, United States|US|2017-12-31T00:00:00.000Z|POINT (-82.024 34.1751)
04 719024889=719024889|SENATE||UNITED STATES|USA|043|2|1|2|3|Washington, District of Columbia, United States|US|2017-12-31T00:00:00.000Z|POINT (-77.0364 38.8951)
05 719024890=719024890|NIGERIA|NGA|PRESIDENT||020|2|1|2|4|Ibadan, Oyo, Nigeria|NI|2017-12-31T00:00:00.000Z|POINT (3.89639 7.38778)
06 719025151=719025151|ARGENTINE|ARG|DIOCESE||010|3|1|3|4|Corrientes, Corrientes, Argentina|AR|2018-01-01T00:00:00.000Z|POINT (-58.8341 -27.4806)
07 719027031=719027031|UNITED STATES|USA|||193|4|1|4|1|Brazil|BR|2018-01-01T00:00:00.000Z|POINT (-55 -10)
08 719025141=719025141|AFRICA|AFR|DIPLOMAT||040|4|1|4|1|South Africa|SF|2018-01-01T00:00:00.000Z|POINT (26 -30)
09 719025751=719025751|GOVERNMENT||||071|10|1|10|4|Maputo, Maputo, Mozambique|MZ|2018-01-01T00:00:00.000Z|POINT (32.5892 -25.9653)
10 719025053=719025053|||NIGERIAN|NGA|100|1|1|1|1|Angola|AO|2018-01-01T00:00:00.000Z|POINT (18.5 -12.5)

Read back 2356 total features

Done

看《守则》

源代码对于本教程来说是可以访问的。主要逻辑包含在泛型 org.geomesa.example.avro.GeoMesaAvroTutorialgeomesa-tutorials-common 模块,它与数据存储区无关。编码发生在 queryFeatures 方法:

// some code omitted for clarity

try (AvroDataFileWriter writer = new AvroDataFileWriter(out, sft, -1)) {
    while (reader.hasNext()) {
        writer.append(reader.next());
        n++;
    }
    writer.flush();
}

try (AvroDataFileReader reader = new AvroDataFileReader(new ByteArrayInputStream(bytes))) {
    while (reader.hasNext()) {
        SimpleFeature feature = reader.next();
    }
}