来源:铭毅天下Elasticsearch
摘要:本文将详细介绍 Elasticsearch Rollup 功能,包括其产生背景、应用场景、应用实例以及实战中的注意事项。通过本文,你将对 Elasticsearch 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数据。