19.11. 文件系统数据存储示例

在这个简单的例子中,我们将把一个小的CSV摄取到一个本地文件系统数据存储中,该数据存储由每日Z2-2位方案分区。首先,从解压geomesa-fs发行版开始。在这个发行版中,您会发现一个Examples文件夹,其中包含一个我们将摄取的示例CSV文件。首先设置您要使用的版本:

$ export TAG="4.0.2"
$ export VERSION="2.12-${TAG}" # note: 2.12 is the Scala build version

然后下载并解压缩二进制发行版:

# download and unpackage the most recent distribution:
$ wget "https://github.com/locationtech/geomesa/releases/download/geomesa-${TAG}/geomesa-fs_${VERSION}-bin.tar.gz"
$ tar xvf geomesa-fs_${VERSION}-bin.tar.gz
$ cd geomesa-fs_${VERSION}
$ cat examples/ingest/csv/example.csv

输出应如下所示:

ID,Name,Age,LastSeen,Friends,Lon,Lat,Vis
23623,Harry,20,2015-05-06,"Will, Mark, Suzan","patronus->10,expelliarmus->9",-100.236523,23,user
26236,Hermione,25,2015-06-07,"Edward, Bill, Harry","accio->10",40.232,-53.2356,user
3233,Severus,30,2015-10-23,"Tom, Riddle, Voldemort","potions->10",3,-62.23,user&admin

如您所见,文件中有3条记录。对于此示例文件,GeoMesa附带了预安装的SimpleFeatureType和转换器,可在 conf/application.conf 文件。正在运行 bin/geomesa-fs env 将表明存在一个 example-csv 类型和转换器与许多其他类型一起安装,包括Twitter、GDELT、OSM等:

$ bin/geomesa-fs env

输出应如下所示:

Simple Feature Types:
example-avro
example-csv
example-csv-complex
...

Simple Feature Type Converters:
example-avro-header
example-avro-no-header
example-csv
...

在本例中,我们将把这三行存储到一个本地文件系统中。请注意,这些记录都是在不同的日期:

2015-05-06
2015-06-07
2015-10-23

几何图形分为世界的两个象限。第一条记录位于左上象限,第二条和第三条记录位于右下象限::

Lon          Lat
-100.236523  23
40.232      -53.2356
3           -62.23

现在让我们来摄取。

$ bin/geomesa-fs ingest -p /tmp/dstest -e parquet -s example-csv -C example-csv \
--partition-scheme daily,z2-2bit examples/ingest/csv/example.csv

输出应如下所示:

INFO  Creating schema example-csv
INFO  Running ingestion in local mode
INFO  Ingesting 1 file with 1 thread
[============================================================] 100% complete 3 ingested 0 failed in 00:00:01
INFO  Local ingestion complete in 00:00:01
INFO  Ingested 3 features with no failures.

我们可以通过运行导出来验证我们的接收:

$ bin/geomesa-fs export -p /tmp/dstest -f example-csv

输出应如下所示:

id,fid:Integer:index=false,name:String:index=true,age:Integer:index=false,lastseen:Date:default=true:index=false,*geom:Point:srid=4326
26236,26236,Hermione,25,2015-06-07T00:00:00.000Z,POINT (40.232 -53.2356)
3233,3233,Severus,30,2015-10-23T00:00:00.000Z,POINT (3 -62.23)
23623,23623,Harry,20,2015-05-06T00:00:00.000Z,POINT (-100.236523 23)
INFO  Feature export complete to standard out in 1676ms for 3 features

现在,让我们检查文件系统:

$ find /tmp/dstest | sort

输出应如下所示:

/tmp/dstest/
/tmp/dstest/example-csv
/tmp/dstest/example-csv/2015
/tmp/dstest/example-csv/2015/05
/tmp/dstest/example-csv/2015/05/06
/tmp/dstest/example-csv/2015/05/06/2_Wcec6a2ec594a4a2eb7c7980a1baf4ab3.parquet
/tmp/dstest/example-csv/2015/05/06/.2_Wcec6a2ec594a4a2eb7c7980a1baf4ab3.parquet.crc
/tmp/dstest/example-csv/2015/06
/tmp/dstest/example-csv/2015/06/07
/tmp/dstest/example-csv/2015/06/07/1_Wcc082b9cf9bc4965b4cbf64741fee5b6.parquet
/tmp/dstest/example-csv/2015/06/07/.1_Wcc082b9cf9bc4965b4cbf64741fee5b6.parquet.crc
/tmp/dstest/example-csv/2015/10
/tmp/dstest/example-csv/2015/10/23
/tmp/dstest/example-csv/2015/10/23/1_W741f2151a4ed4eec97461a174a8588b7.parquet
/tmp/dstest/example-csv/2015/10/23/.1_W741f2151a4ed4eec97461a174a8588b7.parquet.crc
/tmp/dstest/example-csv/metadata
/tmp/dstest/example-csv/metadata/storage.json
/tmp/dstest/example-csv/metadata/.storage.json.crc
/tmp/dstest/example-csv/metadata/update-2015-05-06-2-12240906-4171-4ab0-acfe-d2ce9c5fff76.json
/tmp/dstest/example-csv/metadata/.update-2015-05-06-2-12240906-4171-4ab0-acfe-d2ce9c5fff76.json.crc
/tmp/dstest/example-csv/metadata/update-2015-06-07-1-ecd68700-88e3-4f04-9438-84b6ab935907.json
/tmp/dstest/example-csv/metadata/.update-2015-06-07-1-ecd68700-88e3-4f04-9438-84b6ab935907.json.crc
/tmp/dstest/example-csv/metadata/update-2015-10-23-1-667f27a7-4f64-472a-80ed-82e8f1e65575.json
/tmp/dstest/example-csv/metadata/.update-2015-10-23-1-667f27a7-4f64-472a-80ed-82e8f1e65575.json.crc

请注意,我们有一个基于我们的 daily,z2-2bit 计划。请注意,第一个地块文件路径由日期路径组成 2016/05/06 然后是Z2坐标 2 ,它是文件名的一部分::

/tmp/dstest/example-csv/2015/05/06/2/2_Wcec6a2ec594a4a2eb7c7980a1baf4ab3.parquet

拼图文件名的其余部分是UUID,它允许多个线程同时写入不同的文件,而不会发生冲突。如果我们摄取额外的数据,将在该分区下创建另一个文件,并且GeoMesa将在查询时扫描这两个文件。

每个新文件(或文件删除)将创建一个单独的元数据文件,其中包含有关该文件的详细信息:

$ cat /tmp/dstest/example-csv/metadata/update-2015-05-06-629788a4-6a70-4009-ae20-c45602a88483.json

输出应如下所示:

{
    "action" : "Add",
    "count" : 1,
    "envelope" : {
        "xmax" : -100.2365,
        "xmin" : -100.2365,
        "ymax" : 23.0,
        "ymin" : 23.0
    },
    "files" : [
        "2_Wcec6a2ec594a4a2eb7c7980a1baf4ab3.parquet"
    ],
    "name" : "2015/05/06/2",
    "timestamp" : 1538148168948
}