22. 组合数据存储区视图

GeoMesa提供了两个通用选项,用于将多个数据存储合并到单个视图中。第一个选项是“合并”视图,其中每个数据存储包含一组不同的要素,并对它们进行查询。例如,这可用于保持最新数据的快速、小缓存,或将较旧的数据归档到成本较低的存储中。第二种选择是“路由”视图,其中每个数据存储包含相同的要素集,并且每个查询仅发送到一个数据存储。例如,这可用于支持二级索引。

为了通过数据存储视图使用层,SimpleFeatureType必须存在(并匹配)在所有底层存储中。如果架构存在于某些存储中,但不存在于所有存储中,则它将不会显示在组合视图中。

22.1. 安装

中提供了GeoMesa数据存储视图 geomesa-index-api JAR,默认情况下与所有GeoMesa数据存储捆绑在一起。要合并的底层存储必须单独安装;请参阅每个存储的相关文档。根据存储区的不同,您可能需要解决其依赖项之间的类路径冲突。

22.2. 合并的数据存储视图

GeoMesa合并数据存储视图提供了一种同时查询多个数据存储的统一方式。例如,您可能希望将较新的数据存储在HBase数据存储实例中,而将较旧的数据存储在文件系统数据存储实例中,以降低存储成本,但仍然提供单个层来查询这两个数据。

与之相比 Lambda数据存储区 合并后的数据存储区视图不提供任何用于在数据存储区之间转换功能的管理。所有写入必须直接通过底层存储完成,如果多个存储中存在相同的功能,则它们可能会在单个查询响应中多次返回。

22.2.1. 用法

合并的数据存储视图可通过标准的GeoTool实例化 DataStoreFinder 或者地球服务器 New Data Source 佩奇。它只需要一个参数: geomesa.merged.stores

geomesa.merged.stores 应该是一个 TypeSafe Config 定义每个合并存储的参数的字符串。配置应该有一个顶级密钥 stores 这是一个对象列表,其中每个对象都是一组键-值对,对应于单个数据存储的参数。

例如,要将GeoMesa Acumulo数据存储与PostGis数据存储合并,可以使用以下配置:

{
  "stores": [
    {
      "accumulo.zookeepers": "localhost",
      "accumulo.instance.name": "test",
      "accumulo.catalog": "test",
      "accumulo.user": "test",
      "accumulo.password": "test"
    },
    {
      "dbtype": "postgis",
      "host": "localhost",
      "port": "5432",
      "database": "test",
      "user": "test",
      "passwd": "test"
    }
  ]
}

如果存储可能包含重复要素,则可通过设置参数将其过滤掉 geomesa.merged.deduplicatetrue 。功能由其功能ID标识。商店列表应按优先级顺序定义,因为具有给定功能ID的第一个功能将被返回,而任何其他功能将被过滤掉。如果在列表中首先定义功能较少的商店,则重复数据消除将更加高效。

该参数 geomesa.merged.scan.parallel 可以设置为 true 并行扫描所有底层存储,而不是顺序扫描。

22.2.2. 查询过滤

如果要合并的商店具有已知特征,则可以有选择地对每个商店应用过滤器,以加快查询速度。筛选器与其他存储参数一起在注册表项下指定 geomesa.merged.store.filter ,并且应为ECQL筛选器字符串。

除查询筛选器外,该筛选器还将应用于任何查询。这可用于缩短与特定商店无关的查询。例如,如果一个商店包含过去24小时内的要素,而另一个商店包含超过24小时的要素,则可以使用基于时间的过滤器对其进行配置:

{
  "stores": [
    {
      "other.store.params": "go here...",
      "geomesa.merged.store.filter": "dtg >= currentDate('-P1D')"
    },
    {
      "other.store.params": "go here...",
      "geomesa.merged.store.filter": "dtg < currentDate('-P1D')"
    }
  ]
}

22.2.3. 存储配置提供程序

作为指定 geomesa.merged.stores, config loading can be delegated to a provider interface: org.locationtech.geomesa.index.view.MergedViewConfigLoader. Implementations of this class must be made available via Java SPI loading 中定义的特殊描述符 META-INF/services 。要使用配置提供程序,请使用参数 geomesa.merged.loader 设置为提供程序类的完整类名。在Geoserver中,可用的提供者将显示在选择列表中。

请注意,您可以将显式配置 geomesa.merged.stores 使用委托配置 geomesa.merged.loader ,在这种情况下,这两个配置将被合并。

22.3. 路由数据存储视图

GeoMesa Routed Data Store视图提供了一种将查询路由到多个数据存储的统一方法。例如,您可能希望将地理空间索引存储在HBase数据存储实例中,将属性索引存储在文件系统数据存储实例中以降低存储成本,但仍然提供单个层来查询两者。

所有写入必须直接通过底层存储完成。虽然不是必需的,但通常每个商店都应该有相同的功能。如果不同商店的功能不同,则在查询时可能会出现不一致。

22.3.1. 用法

可通过标准GeoTool实例化路径数据存储视图 DataStoreFinder 或者地球服务器 New Data Source 佩奇。它只需要一个参数: geomesa.routed.stores

geomesa.routed.stores 应该是一个 TypeSafe Config 定义每个基础存储区的参数的字符串。配置应该有一个顶级密钥 stores 这是一个对象列表,其中每个对象都是一组键-值对,对应于单个数据存储的参数。

例如,要将GeoMesa Acumulo数据存储与PostGis数据存储相结合,可以使用以下配置:

{
  "stores": [
    {
      "accumulo.zookeepers": "localhost",
      "accumulo.instance.name": "test",
      "accumulo.catalog": "test",
      "accumulo.user": "test",
      "accumulo.password": "test"
    },
    {
      "dbtype": "postgis",
      "host": "localhost",
      "port": "5432",
      "database": "test",
      "user": "test",
      "passwd": "test"
    }
  ]
}

22.3.2. 查询路由

路由视图需要一种将任何传入查询路由到特定数据存储的方法。默认情况下,可以根据查询过滤器属性来路由查询。有关更高级的用例,请参见下文。

要根据属性进行路由,可以为每个商店配置它可以有效处理的属性组合。属性在注册表项下指定 geomesa.route.attributes ,以及其他数据存储参数。属性应该是可以一起查询的名称组的数组。空属性数组对应于 Filter.INCLUDE ,如果没有其他匹配的东西,它将被用作后备。特殊的字符串 "id" 可用于匹配要素ID查询。如果查询与任何已配置的属性都不匹配,则不会返回任何结果。

下面的示例将路由查询,例如 INCLUDE, IN ('1', '2'), bbox(geom,...) and bbox(geom, ...) and dtg during ... 添加到第一个存储区,而诸如 name = ...age > ... 将被路由到第二个存储:

{
  "stores": [
    {
      "other.store.params": "go here...",
      "geomesa.route.attributes": [ [], [ "id" ], [ "geom" ], [ "dtg", "geom" ] ]
    },
    {
      "other.store.params": "go here...",
      "geomesa.route.attributes": [ [ "name" ], [ "age" ] ]
    }
  ]
}

22.3.2.1. 自定义路线

作为按属性路由的替代方案,可以将路由委托给提供程序接口: org.locationtech.geomesa.index.view.RouteSelector. Implementations of this class must be made available via Java SPI loading 中定义的特殊描述符 META-INF/services 。要使用配置提供程序,请使用参数 geomesa.route.selector 设置为提供程序类的完整类名。在Geoserver中,可用的提供者将显示在选择列表中。