Elasticsearch 8.X Rollup 功能详解及避坑指南
一、Elasticsearch Rollup 产生背景
1.1 认知前提
- Elasticsearch 是一个分布式的搜索和分析引擎,能够处理大量的数据并提供实时查询功能。
- 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数据。
推荐阅读
- 全网首发!从 0 到 1 Elasticsearch 8.X 通关视频
- 重磅 | 死磕 Elasticsearch 8.X 方法论认知清单
- 如何系统的学习 Elasticsearch ?
文章转载自公众号: 铭毅天下Elasticsearch