GeoMesa FSDS

说明

它利用列格式,支持数据压缩和基于列的编码,从而实现高效的OLAP查询。这使用户能够通过使用弹性计算资源来代替专用服务器来实现成本节约。

列存储,支持数据压缩和基于列的编码,实现高效的OLAP查询

GeoMesa FSDS( FileSystem data store)可以运行在任何分布式或本地文件系统之上,包括Amazon 3、Hadoop HDFS、谷歌FileStorage和Azure BlobStore。

文件系统数据存储可以将数据ETL到文件系统中,或者使用GeoMesa转换器包装现有的文件系统存储目录。在这两种模式中,都必须提供一个分区方案来描述目录结构的布局。

架构

GeoMesa文件数据存储系统(GeoMesa FSDS)利用原生云和分布式文件系统来支撑批量分析查询。FSDS使用Spark SQL和MapReduce之类的框架来执行大量查询或大型分析任务。FSDS可以很好地与低延迟ingest 和基于缓存的数据存储系统(如HBase或Kafka)匹配,以提供“热数据”和“温和数据”存储的最佳配对

FSDS由以下组件组成:

1、FileSystem - 一个单独管理的存储系统,它实现了GeoMesa文件系统API

GeoMesa FSDS可以使用任何实现了Hadoop filesystem API的文件系统。
常用的有:
HDFS - Hadoop Distributed File System
S3 - Amazon Simple Storage
GCS - Google Cloud Storage
WASB - Windows Azure Blob Storage
Local - Locally mounted file system (e.g. local disk or NFS)

文件系统的选择看官网(我们使用HDFS)

2、Partition Scheme - 分区方案

分区方案定义数据如何存储在文件系统上,它决定了如何查询数据。在评估查询筛选器时,分区方案用于删除与筛选器不匹配的数据文件。

/3、Storage Format -* 数据在文件中的编码或格式
有以下三种
Apache Parquet— Apache Parquet是Hadoop生态系统中领先的可互操作的柱状格式。它提供了结构化数据的高效压缩、存储和查询。
Apache ORC— Apache ORC是为Hadoop的一种自描述的类型感知列文件格式。它针对大量数据的流式读取进行了优化,并集成了快速查找所需行的支持。
Converter Storage - Converter Storage 是一种综合格式,允许使用自定义的分区方案将一个GeoMesa转换器覆盖在文件系统的顶部。允许使用以JSON、CSV、TSV、Avro或其他格式存储的现有数据。转换器是可扩展的。

4、Query Engine - 查询引擎或客户端,用于执行查询和运行分析作业

Metadata:
FSDS存储分区和数据文件的元数据,以避免重复询问文件系统。默认情况下,元数据信息卸载日志并存储在文件系统中。FSDS还支持使用关系数据库

GeoMesa FileSystem的安装

去看官网 16.2

GeoMesa FileSystem配置

一、配置文件编码

FSDS 支持三种编码: orc, parquet, 和 converter,其中:
ORC和Parquet都支持读写
converter是一种只读格式,支持使用GeoMesa Convert API查询各种数据文件。

文件编码可通过geomesa.fs.scheme指定:

import org.locationtech.geomesa.fs.storage.common.RichSimpleFeatureType

val sft: SimpleFeatureType = ???
// 使用RichSimpleFeatureType中的隐式方法
sft.setScheme("daily", Map("dtg-attribute" -> "dtg"))
//或者直接在数据中设置
sft.getUserData.put("geomesa.fs.scheme",
    """{ "name": "daily", "options": { "dtg-attribute": "dtg" } }""")

二、配置叶级存储(Leaf Storage)

叶级存储控制文件和文件夹的最终布局。当使用叶级存储(默认启用)时,分区路径的最后一个组件用作数据文件名的前缀,而不是作为单独的文件夹。这可以减少文件系统(如S3)的目录开销。

**例如,**yyyy/MM/dd的分区方案会生成类似于2016/01/01的分区路径。
使用叶子存储,该分区的数据文件将是2016/01/01_<datafile>.parquet。如果禁用叶级存储,数据文件将是2016/01/01/<datafile>.parquet,创建额外级别的目录。(2016/01/01这个路径指的是:有一个文件夹叫2016,他里边有一个子文件夹叫01,01这个文件夹里边有一个文件叫01)

叶级存储可通过geomesa.fs.leaf-storage指定

import org.locationtech.geomesa.fs.storage.common.RichSimpleFeatureType

val sft: SimpleFeatureType = ???
//隐式方法
sft.setLeafStorage(false)
// 直接在数据中设置,注意是字符串类型的false
sft.getUserData.put("geomesa.fs.leaf-storage", "false")

三、元数据持久化配置

元数据既可以持久化到文件系统,又可以持久化到数据可,具体细节看我的其他文章

import org.locationtech.geomesa.fs.storage.common.RichSimpleFeatureType

val sft: SimpleFeatureType = ???
// 隐式方法,将元数据持久化到数据库
sft.setMetadata("jdbc", Map("jdbc.url" -> "jdbc:postgresql://localhost/geomesa"))
// 直接设置为json,将元数据持久化到数据库
sft.getUserData.put("geomesa.fs.metadata",
    """{ "name": "jdbc", "options": { "jdbc.url": "jdbc:postgresql://localhost/geomesa" } }""")

分区方案

分区方案定义数据如何存储在文件系统上。这个方案很重要,因为它决定了如何查询数据。在评估查询筛选器时,分区方案用于删除与筛选器不匹配的数据文件。

提供了三种主要类型的分区方案:空间、时间和属性

在创建scheme 时必须提供分区方案。该方案由一个名称和配置选项的映射来定义。

一、组合方案
组合方案是其他方案的组合。组合方案的命名方法是将组成方案的名称串联起来,用逗号分隔,例如hourly,z2-2bits(按小时分区,按z2索引分区)。每个子方案的配置选项应该合并到组合方案的单个配置中。

二、时间分区方案

时间分区方案根据Java 中的日期格式,字符串之间用斜杠分隔,斜杠用于构建目录结构。所有时间分区方案均支持以下通用配置选项:
dtg-attribute - 用于分区的SimpleFeatureType中的日期属性名。如果没有指定,则使用默认日期属性。

1、Date-Time方案:
使用关键字:datetime
配置:
datetime-format - 一个由斜杠分隔的Java DateTime格式字符串,用于构建目录结构。例如:yyyy/MM/dd。
step-unit - 值为一个 java.time.temporal.ChronoUnit类型的类,定义如何增加分区的叶级节点
step - 在分区中要增加叶子的数量。如果没有指定,默认值为1

2、 Hourly方案:
使用关键字:hourly
使用yyyy/MM/dd/HH格式按小时划分数据。

3、 Minute方案:
使用关键字:minute
使用yyyy/MM/dd/HH/MM格式按分钟划分数据。

4、Daily 方案:
使用关键字:daily
使用yyyy/MM/dd格式按天分区数据。

5、Weekly 方案:
使用关键字:weekly
使用yyyy/ww格式布局按周划分数据。

6、Monthly 方案:
使用关键字:monthly
使用yyyy/MM格式按月划分数据。

7、Julian 方案:
使用关键字:julian-minute, julian-hourly, julian-daily
Julian方案按Julian day划分数据,而不是按month/day。分别使用yyyy/DDD/HH/mm、yyyy/DDD/HH和yyyy/DDD格式

三、空间分区方案

空间分区方案根据空间填充曲线来布置数据。所有空间方案均支持以下通用配置选项:

geom-attribute - 用于数据分区的几何类型属性的名称。如果没有指定,则使用默认几何图形。

1、Z2 方案:

使用关键字:z2

配置:
z2-resolution- 用于指定z索引的精度位。一定是2的幂次方。

Z2方案使用Z2空间填充曲线,并且只能用于point类型几何。与其将分辨率指定为配置选项,不如在名称中指定它,比如z2-<n>bits,其中<n>被替换为z2分辨率,例如z2-2bits。

2、XZ2方案:
使用关键字:xz2

配置:
xz2-resolution - 用于指定z索引的精度位。一定是2的幂次方。

XZ2方案使用XZ2空间填充曲线,可以用于任何几何类型。与其将分辨率指定为配置选项,不如在名称中指定它,比如xz2-<n>bits,其中<n>被替换为xz2分辨率,例如xz2-2bits。

四、空间方案

根据属性划分数据

使用关键字:attribute
配置:
partitioned-attribute - 用于分区数据的SimpleFeatureType属性名。

FileSystem Metadata

文件数据存储系统(FSDS)存储分区和数据文件的元数据,以避免重复询问文件系统。当添加或删除新数据文件时,将创建一个关联的元数据。

一、File System持久化(把元数据存入File System)

默认情况下,元数据信息作为更改日志存储在FSDS根路径下的元数据文件夹中。然而,在处理大量分区时,读取元数据所需的初始时间可能是一个限制。

如果元数据文件的数量增长过大,可以使用compact或management-metadata命令行函数或者手动移动到子文件夹中,从而减少元数据文件的数量。

二、Database 持久化(把元数据存入Database )

元数据可以通过JDBC存储在关系数据库中。关系数据库可以使用jdbc名称指定,并支持以下配置选项(所需的选项用*标记):

参数描述
jdbc.url *JDBC连接的URL,例如 jdbc:postgresql://localhost/geomesa
jdbc.driverJDBC驱动程序类的全限定名,例如org.postgresql.Driver
jdbc.user指定user
jdbc.password用户密码
jdbc.pool.min-idle数据库连接池中的保持空闲的最小连接数
jdbc.pool.max-idle数据库连接池中的保持空闲的最大连接数
jdbc.pool.max-size数据库连接池的最大大小
jdbc.pool.fairness在从数据库连接池获取连接时是否启用公平性(true或false)
jdbc.pool.test-on-borrow从数据库连接池获取连接时是否进行测试连接(true或false)
jdbc.pool.test-on-create在最初创建连接时是否进行测试连接(true或false)
jdbc.pool.test-while-idle是否测试数据库连接池中的空闲连接(true或false)

官方支持Postgres和H2。其他数据库可能可以工作,但尚未经过测试。

编程方式使用FSDS

一、创建DataStore

Map<String, String> parameters = new HashMap<>;
parameters.put("fs.path", "hdfs://localhost:9000/fs-root/");
org.geotools.data.DataStore dataStore = org.geotools.data.DataStoreFinder.getDataStore(parameters);

二、FSDS参数

*号为必须

参数描述类型
fs.path *写入和读取数据的根路径String
fs.encoding创建schema时使用的文件编码。如果这里没有指定,则必须在SimpleFeatureType使用geomesa.fs配置它。所提供的实现是parquet and orc.String
fs.read-threads用于查询的线程数Int
fs.writer.partition.timeout写文件的的超时时间,例如“60秒”。这是为了防止在大型写操作期间打开太多文件。String
fs.config配置值格式为Java属性文件,将传递给底层文件系统String

在GeoServer中的使用FSDS

参考HBase或者去看官网

FSDS命令行工具

通过geomesa-fs命令使用。

可使用通用命令,以下仅为FSDS特定命令

compact

压缩一个或多个FS中的分区。这将把多个文件合并到一个文件中,从而提供更好的查询性能。

参数描述
-p, --path *FS路径
-f, --feature-name *schema名
–partitions压缩分区
–mode本地的或分布式的(使用map/reduce)
–temp-path用于工作文件的临时目录的路径 (常用在S3)

get-files

显示一个或多个文件系统分区的文件。

参数描述
-p, --path *FS路径
-f, --feature-name *schema名
–partitions要压缩的分区

get-partitions

获取分区

参数描述
-p, --path *FS路径
-f, --feature-name *schema名

ingest

参数描述
-p, --path *用于存储数据的文件系统根路径
-e, --encoding用于底层文件的编码。parquet 和orc提供了实现。
–partition-scheme常见分区方案名称(例如daily、z2)或包含方案配置的文件的路径
–num-reducersreduce数
–leaf-storage使用叶级存储
–temp-path临时文件路径
–storage-opt附加存储选项,如key=value

如果schame不存在,则必须 --encoding和 --partition-scheme ,否则可能会省略它们。

—number-reducers通常应该设置为分区数量的一半。

manage-metadata

该命令将压缩、添加和删除FSDS的元数据项。它有三个子命令::

compact - 将多个元数据文件压缩为一个文件
register - 为现有数据文件创建新的元数据项
unregister - 删除现有数据文件的元数据项

$ geomesa manage-metadata compact -p /tmp/geomesa ...
参数描述
-p, --path *FS路径
-f, --feature-name *schema名

compact

添加或删除特定文件的元数据,文件必须已经存在于适当的分区路径下。如果通过一些外部批量进程创建了新的数据文件,那么必须使用此命令注册这些文件,然后才能查询它们。

参数描述
–partition *要修改的分区的名称
–files *注册的文件的名称。可以指定多次注册多个文件
–count正在注册的文件中的features 的数量。这不是必需的
–bounds正在注册的数据文件的地理边界,形式为xmin、ymin、xmax、ymax。这不是必需的

FSDS配置

一、写文件

geomesa.fs.writer.partition.timeout:
当向多个分区写入时,每个分区写入器都保持打开状态,直到整个特性写入器关闭为止。当同时写入多个分区时,由于写入器数量太多,这可能会导致内存问题。为了缓解这种情况,可以在可配置超时之后关闭空闲分区。
超时定义为持续时间,例如60秒或100毫秒。

二、FS操作

geomesa.fs.file.cache.duration:
为了避免重复读取磁盘,GeoMesa会将磁盘操作的结果缓存一段时间。这样做的副作用是,外部进程修改的文件可能在缓存超时之后才可见。
属性被定义为持续时间,例如60秒或100毫。默认情况下是10分钟。

FSDS例子

见官网16.10和16.11

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值