更新时间:2024-10-12 GMT+08:00

配置Elasticsearch集群聚合增强

场景描述

聚合增强在数据聚簇的情况下,利用向量化技术,批量处理数据,从而提升聚合性能,优化可观测性业务的聚合分析能力。

在大规模数据的集聚合分析场景下,耗时主要集中在对数据的分组聚合。

提升分组聚合能力依赖排序键和聚簇键。

  • 排序键:数据按照排序键顺序存储。
  • 聚簇键:是排序键的前缀子集,数据按照聚簇键聚簇在一起。

聚合增强常见的使用场景请参见表1

表1 聚合增强的使用场景

场景

描述

相关文档

低基字段聚合

表示对具有较少不同值的列进行聚合,如对一个存储类别的列进行聚合。

低基字段分组聚合

高基字段聚合

表示对具有较多不同值的列进行聚合,如对一个存储时间的列进行按天的时间聚合。

高基字段直方图聚合

低基字段和高基字段混合聚合

表示对以上两种类型的聚合混合在一起,如先对低基字段做分组聚合,然后再对高基字段做直方图聚合。

低基字段分组聚合混合高基字段直方图聚合

约束限制

仅Elasticsearch 7.10.2集群支持聚合增强。

低基字段分组聚合

低基字段一般采用分组聚合,在排序的情况下具备较好的数据聚簇性,利于向量化批量处理数据。

例如,查询语句如下所示。

POST testindex/_search
{
  "size": 0,
  "aggs": {
    "groupby_region": {
      "terms": {
        "field": "region"
      },
      "aggs": {
        "groupby_host": {
          "terms": {
            "field": "host"
          },
          "aggs": {
            "avg_cpu_usage": {
              "avg": {
                "field": "cpu_usage"
              }
            }
          }
        }
      }
    }
  }
}

当需要对“region”“host”这两个低基字段进行聚合增强,则需要对索引进行如下设置。

// 索引设置
"settings" : {
    "index" : {
        "search" : {
            "turbo" : {
                "enabled" : "true" // 开启优化
            }
        },
        "sort" : { // 指定排序键
            "field" : [
                "region",
                "host",
                "other"
            ]
        },
        "cluster" : {
            "field" : [ // 指定聚簇键
                "region",
                "host"
            ]
        }
    }
}

聚簇键必须是排序键的前缀子集。

高基字段直方图聚合

高基字段一般采用直方图分组聚合,利于处理某个区间内的数据。

例如,查询语句如下所示。这条查询是对时间字段timestamp做直方图分组,然后求score的平均值。

POST testindex/_search?pretty
{
  "size": 0,
  "aggs": {
    "avg_score": {
      "avg": {
        "field": "score"
      },
      "aggs": {
        "groupbytime": {
          "date_histogram": {
            "field": "timestamp",
            "calendar_interval": "day"
          }
        }
      }
    }
  }
}

当需要对典型的高基字段“timestamp”进行聚合增强时,则需要对索引进行如下设置。

// 索引设置
"settings" : {
    "index" : {
        "search" : {
            "turbo" : {
                "enabled" : "true" // 开启优化
            }
        },
        "sort" : { // 指定排序键
            "field" : [
                "timestamp"
            ]
        }
    }
}

低基字段分组聚合混合高基字段直方图聚合

在低基字段和高基字段混合的场景下,一般先对低基字段做分组聚合,然后再对高基字段做直方图聚合。

假如,查询语句如下所示。

POST testindex/_search
{
  "size": 0,
  "aggs": {
    "groupby_region": {
      "terms": {
        "field": "region"
      },
      "aggs": {
        "groupby_host": {
          "terms": {
            "field": "host"
          },
          "aggs": {
            "groupby_timestamp": {
              "date_histogram": {
                "field": "timestamp",
                "interval": "day"
              },
              "aggs": {
                "avg_score": {
                  "avg": {
                    "field": "score"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

当需要先对“region”低基字段进行分组,再对“host”低基字段进行分组,最后对“timestamp”高基字段进行直方图分组时,聚合增强的索引设置如下。

// 索引设置
"settings" : {
    "index" : {
        "search" : {
            "turbo" : {
                "enabled" : "true" // 开启优化
            }
        },
        "sort" : { // 指定排序键
            "field" : [
                "region",
                "host",
                "timestamp",
                "other"
            ]
        },
        "cluster" : {
            "field" : [ // 指定聚簇键
                "region",
                "host"
            ]
        }
    }
}
  • 聚簇键必须是排序键的前缀子集。
  • 高基字段必须在排序键中,且高基字段必须在最后一个低基字段后面。

性能测试对比

测试环境
  • 数据集: esrally nyc_taxis数据集
  • 集群规格: 4U16G 100GB高IO * 3节点
测试步骤
  1. 在集群中创建索引模板,指定排序键和关闭聚合增强。
    PUT /_template/nyc_taxis
    {
      "template": "nyc_taxis*",
      "settings": {
        "index.search.turbo.enabled": false,
        "index.sort.field": "dropoff_datetime",
        "number_of_shards": 3,
        "number_of_replicas": 0
      }
    }
  2. 使用esrally执行nyc_taxis数据集的测试,得到关闭聚合增强时的结果。
  3. 在同一个集群中创建索引模板,指定排序键和开启聚合增强。
    PUT /_template/nyc_taxis
    {
      "template": "nyc_taxis*",
      "settings": {
        "index.search.turbo.enabled": true,
        "index.sort.field": "dropoff_datetime",
        "number_of_shards": 3,
        "number_of_replicas": 0
      }
    }
  4. 使用esrally执行nyc_taxis数据集的测试,得到开启聚合增强时的结果。

测试结果

本次测试仅关注针对“dropoff_datetime”聚合的查询结果,即只关注“autohisto_agg”“date_histogram_agg”两个任务的结果,以下为该任务的测试结果对比。

Metric

Task

Unit

关闭聚合增强

开启聚合增强

关闭聚合增强

开启聚合增强

open/close

结论

测试轮次1

测试轮次2

测试轮次3

测试轮次1

测试轮次2

测试轮次3

均值

均值

Min Throughput

autohisto_agg

ops/s

4.42

4.44

4.43

11.66

11.94

11.96

4.43

11.85

2.68

吞吐量提升2.5倍以上

Mean Throughput

autohisto_agg

ops/s

4.50

4.46

4.44

11.81

11.99

12.00

4.47

11.93

2.67

Median Throughput

autohisto_agg

ops/s

4.51

4.46

4.44

11.83

11.98

12.00

4.47

11.94

2.67

Max Throughput

autohisto_agg

ops/s

4.54

4.48

4.45

11.90

12.07

12.02

4.49

12.00

2.67

100th percentile latency

autohisto_agg

ms

216.30

-

-

-

84.56

80.38

216.30

82.47

0.38

时延下降60%以上

100th percentile service time

autohisto_agg

ms

216.30

-

-

-

84.56

80.38

216.30

82.47

0.38

error rate

autohisto_agg

%

0

0

0

0

0

0

0

0

0

-

Min Throughput

date_histogram_agg

ops/s

4.72

4.67

4.65

12.57

12.40

12.59

4.68

12.52

2.68

吞吐量提升2.5倍以上

Mean Throughput

date_histogram_agg

ops/s

4.73

4.67

4.67

12.61

12.46

12.61

4.69

12.56

2.68

Median Throughput

date_histogram_agg

ops/s

4.73

4.67

4.67

12.62

12.46

12.60

4.69

12.56

2.68

Max Throughput

date_histogram_agg

ops/s

4.74

4.67

4.67

12.64

12.49

12.63

4.69

12.59

2.68

50th percentile latency

date_histogram_agg

ms

202.61

218.09

213.43

77.64

76.02

82.63

211.38

78.77

0.37

时延下降60%以上

100th percentile latency

date_histogram_agg

ms

207.35

223.88

246.63

77.99

-

-

225.95

77.99

0.35

50th percentile service time

date_histogram_agg

ms

202.61

218.09

213.43

77.64

76.02

82.63

211.38

78.77

0.37

100th percentile service time

date_histogram_agg

ms

207.35

223.88

246.63

77.99

-

-

225.95

77.99

0.35

error rate

date_histogram_agg

%

0

0

0

0

0

0

0

0

0

-

测试结论

在集群配置相同的情况下,开启聚合增强后,聚合性能显著提升,查询吞吐量提升2.5倍以上,查询时延下降60%以上。