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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elasticsearch 8.X Rollup 功能详解及避坑指南

摘要:本文将详细介绍 Elasticsearch Rollup 功能,包括其产生背景、应用场景、应用实例以及实战中的注意事项。通过本文,你将对 Elasticsearch Rollup 功能有一个全面的了解,从而提高你的数据处理能力。

一、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)等。

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

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

4.2 启动 Rollup job。

POST _rollup/job/ecommerce_rollup/_start

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"
      }
    }
  }
}

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

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 索引功能信息

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数据。

推荐阅读

更短时间更快习得更多干货!

和全球 近1900+ Elastic 爱好者一起精进!

比同事抢先一步学习进阶干货!


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
1月前
|
存储 JSON 数据格式
Elasticsearch 8.X 可以按照数组下标取数据吗?
Elasticsearch 8.X 可以按照数组下标取数据吗?
24 0
|
1月前
|
JSON 监控 Java
Elasticsearch 8.X reindex 源码剖析及提速指南
Elasticsearch 8.X reindex 源码剖析及提速指南
34 0
|
1月前
|
存储 监控 Java
视频 | Elasticsearch 8.X 企业内训之最佳实践10 讲
视频 | Elasticsearch 8.X 企业内训之最佳实践10 讲
26 0
|
1月前
|
存储 数据处理 索引
Elasticsearch 8.X 小技巧:使用存储脚本优化数据索引与转换过程
Elasticsearch 8.X 小技巧:使用存储脚本优化数据索引与转换过程
46 6
|
1月前
|
存储 监控 安全
Elasticsearch 8.X 集群 SSL 证书到期了,怎么更换?
Elasticsearch 8.X 集群 SSL 证书到期了,怎么更换?
91 3
|
1月前
|
运维 架构师 搜索推荐
7 年+积累、 Elastic 创始人Shay Banon 等 15 位专家推荐的 Elasticsearch 8.X新书已上线...
7 年+积累、 Elastic 创始人Shay Banon 等 15 位专家推荐的 Elasticsearch 8.X新书已上线...
29 4
|
1月前
|
存储 机器学习/深度学习 搜索推荐
Elasticsearch 8.X 向量检索和普通检索能否实现组合检索?如何实现?
Elasticsearch 8.X 向量检索和普通检索能否实现组合检索?如何实现?
42 3
|
1月前
|
API 索引
近期,几个典型 Elasticsearch 8.X 问题及方案探讨
近期,几个典型 Elasticsearch 8.X 问题及方案探讨
38 3
|
1月前
|
存储 缓存 监控
干货 | Elasticsearch 8.X 性能优化实战
干货 | Elasticsearch 8.X 性能优化实战
57 2
|
1月前
|
搜索推荐 JavaScript Java
Elasticsearch 8.X 如何依据 Nested 嵌套类型的某个字段进行排序?
Elasticsearch 8.X 如何依据 Nested 嵌套类型的某个字段进行排序?
33 0