Elasticsearch 8.X Rollup 功能详解及避坑指南

love374
发布于 2023-5-19 17:34
浏览
0收藏

一、Elasticsearch Rollup 产生背景

1.1 认知前提

  1. Elasticsearch 是一个分布式的搜索和分析引擎,能够处理大量的数据并提供实时查询功能。
  2. Elasticsearch 传统的聚合操作都是实时聚合,就是执行聚合的那一刻,实时根据检索+聚合语句进行聚合操作。

传统的聚合,当文档数据量非常大时进行多重聚合、嵌套聚合的性能会受到很大影响。因为聚合操作需要搜索整个索引,并处理大量数据,这会导致查询变慢,甚至可能使 Elasticsearch 集群崩溃。

1.2 那么能不能离线聚合呢?

为了解决这个问题,Elasticsearch Rollup 提供了一种有效的方式来处理大规模数据。

Rollup 允许用户在实时运行时间之外预先定义聚合任务,这些任务将执行后的聚合结果数据写入到新创建的特定索引中。在这个新的索引中,数据已经被预先聚合,这使得查询和分析操作更加快速和高效。

在早期的产品开发中,我们还真构思过离线非实时聚合功能,由于当时ES (5.X版本)尚未发布 Rollup 功能,只能写定时任务实现。

1.3 一句话小结

Elasticsearch Rollup是为了解决Elasticsearch在处理海量数据时性能和资源消耗的问题而产生的,Rollup 功能允许将原始数据聚合为更小的、摘要形式的数据,从而减少存储空间和计算资源的消耗。Rollup 提供了不降低查询速度的情况下处理海量数据的解决方案。

二、Elasticsearch Rollup 最早发布版本

自 Elasticsearch 6.3 版本发布以来,Rollup 已经成为 Elasticsearch 的核心功能之一。在随后的版本中,Elasticsearch不断增强和完善了 Rollup 的功能,如支持更多的聚合函数、更灵活的 Rollup 配置选项等。

Rollup 是一种轻量级的聚合工具,可以将原始数据聚合成摘要数据,并将其存储在新的 Rollup 索引中。这个过程类似于数据仓库的聚合操作,可以大大减少 Elasticsearch 在处理大量数据时的资源消耗,提高查询速度和响应时间。

三、Elasticsearch Rollup 功能应用场景

Elasticsearch 的 rollup 功能可以将原始数据按照一定的规则进行聚合,生成预先计算的摘要数据(即 rollup 数据)。这种摘要数据可以用于各种场景,例如:

  • 场景1:大量历史数据的存储与查询。

当数据量庞大且增长迅速时,通过 Rollup 功能可以降低存储成本和查询延迟。

  • 场景2:时间序列数据分析。

Rollup 功能特别适用于时间序列数据,可以将数据聚合成不同的时间粒度,方便进行各种时间范围的分析。

  • 场景3:数据归档。

通过 Rollup 功能,可以将不再需要实时查询的数据归档,从而降低存储和计算资源的消耗。

在电商场景下,可以使用Rollup API来进行如下操作:

  • 电商场景1:统计销售数据

电商网站可以使用Rollup API来聚合销售数据,如订单量、销售额、商品销售量等,以便于分析和报告。

  • 电商场景2:聚合用户数据

通过Rollup API可以统计用户行为数据,如用户浏览商品数量、购买行为、退货情况等,以便于进行用户画像、用户行为分析等。

  • 电商场景3:聚合库存数据

通过Rollup API可以聚合库存数据,如库存量、商品入库量、出库量等,以便于管理库存、优化进销存等。

  • 电商场景4:聚合搜索数据

通过Rollup API可以聚合搜索数据,如用户搜索关键字、搜索次数等,以便于进行搜索引擎优化、推荐算法优化等。

四、Elasticsearch Rollup 应用举例

4.1 步骤1:创建 Rollup 任务

PUT _rollup/job/ecommerce_rollup
{
  "index_pattern": "kibana_sample_data_ecommerce",
  "rollup_index": "kibana_sample_data_ecommerce_rollup",
  "cron": "* */2 * * * ?",
  "page_size": 1000,
  "groups": {
    "date_histogram": {
      "field": "order_date",
      "fixed_interval": "1d",
      "delay": "1m",
      "time_zone": "UTC"
    },
    "terms": {
      "fields": [
        "products.product_name.keyword"
      ]
    }
  },
  "metrics": [
    {
      "field": "taxless_total_price",
      "metrics": [
        "min",
        "max",
        "sum"
      ]
    },
    {
      "field": "products.price",
      "metrics": [
        "sum"
      ]
    },
    {
      "field": "products.quantity",
      "metrics": [
        "sum"
      ]
    }
  ]
}

以下是核心参数的简明扼要解释:

  • index_pattern:指定要对哪个原始数据索引进行汇总。
  • rollup_index:存储汇总数据的新索引名称。
  • cron:定义 Rollup 作业执行的时间表,本例中表示每两小时执行一次。
  • page_size:定义每次处理的文档数量,用于控制内存占用和批处理速度。
  • groups:定义聚合和分组设置。
  • date_histogram:基于时间字段的固定间隔分组设置。
  • field:要进行时间分组的字段。
  • fixed_interval:时间分组的固定间隔,本例中为 1 天。
  • delay:允许一定的延迟以处理潜在的延迟数据,本例中为 1 分钟。
  • time_zone:时间字段的时区。
  • terms:基于词条的分组设置。
  • -fields:要进行词条分组的字段列表。
  • metrics:定义要计算的度量。
  • field:要进行度量计算的字段。
  • metrics:应用于该字段的聚合操作列表,如最小值(min)、最大值(max)和求和(sum)等。

Elasticsearch 8.X Rollup 功能详解及避坑指南-鸿蒙开发者社区

创建完毕后,Kibana 呈现如下图所示,我想说明的是,创建了不代表启动了,所以上面的 status 是 stopped 状态。

Elasticsearch 8.X Rollup 功能详解及避坑指南-鸿蒙开发者社区

需要咱们手动启动才可以。

4.2 启动 Rollup job。

POST _rollup/job/ecommerce_rollup/_start

Elasticsearch 8.X Rollup 功能详解及避坑指南-鸿蒙开发者社区

Elasticsearch 8.X Rollup 功能详解及避坑指南-鸿蒙开发者社区

4.3 查询 Rollup 检索和聚合数据

GET kibana_sample_data_ecommerce_rollup/_search
{
  "size":0,
  "aggs": {
    "max_aggs": {
      "max": {
        "field": "taxless_total_price.max.value"
      }
    },
    "sum_aggs":{
      "sum": {
        "field": "products.price.sum.value"
      }
    }
  }
}

上述聚合的结果如下图所示。

Elasticsearch 8.X Rollup 功能详解及避坑指南-鸿蒙开发者社区

ps:关于聚合字段的写法,建议先query 查一下,我第一次写的时候,还不大适应这么长的“连环”字段名

五、Elasticsearch rollup 常见API

常用的 Rollup API包括:

  • job 层面


PUT /_rollup/job/<job_id>:创建一个 rollup 作业
GET /_rollup/job:列出所有 rollup 作业
GET /_rollup/job/<job_id>:获取 rollup 作业详情
POST /_rollup/job/<job_id>/_start:启动一个 rollup 作业
POST /_rollup/job/<job_id>/_stop:停止一个 rollup 作业
DELETE /_rollup/job/<job_id>:删除一个 rollup 作业
  • data 层面

GET /_rollup/data/<index_pattern>/_rollup_caps:获取 Rollup 功能信息
GET /<index_name>/_rollup/data/:获取 Rollup 索引功能信息

Elasticsearch 8.X Rollup 功能详解及避坑指南-鸿蒙开发者社区

index_name 层面

GET /<index_name>/_rollup_search:搜索 rollup 数据

六、Elasticsearch rollup 实战避坑

  • 避免过度聚合。

在创建 Rollup 任务时,要确保聚合的粒度适中,以免丢失过多的原始数据信息。选择​​合适的​​聚合字段和时间间隔,以满足业务需求。

  • 留意数据延迟

Rollup 任务通常会配置一定的延迟时间,以防止正在写入的数据被立即聚合。因此,在查询 Rollup 数据时,请注意可能存在的数据延迟。

  • 指标类型兼容性

在 Rollup 任务中,不同类型的指标(如 count、sum、avg、max、min 等)可以应用于相应的字段。在查询 Rollup 数据时,务必确保使用兼容的指标类型。注意权限控制。

  • 创建和管理 Rollup 任务需要特定的权限

请确保您的用户具有足够的权限来创建、修改、删除和执行 Rollup 任务。

  • 监控 Rollup 任务。

创建 Rollup 任务后,需要定期监控其运行状态,确保数据正常聚合。可以使用 Elasticsearch 监控功能来查看任务的运行状况。

七、总结

Elasticsearch Rollup 功能为大数据处理提供了有效的解决方案,降低了存储和计算资源的消耗。

本文详细介绍了 Rollup 功能的产生背景、应用场景、应用实例以及实战中的注意事项。希望本文能帮助你更好地理解和使用 Elasticsearch Rollup 功能,为你的数据处理带来更多便利。

ps:本文内容基于Elasticsearch 8.6 验证,样例数据来自Kibana自带的sample数据。

推荐阅读

  1. ​全网首发!从 0 到 1 Elasticsearch 8.X 通关视频​
  2. ​重磅 | 死磕 Elasticsearch 8.X 方法论认知清单​
  3. ​如何系统的学习 Elasticsearch ?​


文章转载自公众号: 铭毅天下Elasticsearch

分类
已于2023-5-23 15:25:28修改
收藏
回复
举报
回复
    相关推荐