Облачная платформаAdvanced

Настройка Enhanced Aggregation для Elasticsearch Кластера

Эта статья полезна?
Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Кластеры CSS Elasticsearch повышают производительность агрегации при больших объёмах данных за счёт использования векторизации и оптимизированного кластерирования, обеспечивая более быстрый аналитический процесс и принятие решений в сложных ситуациях.

Как работает функция

Enhanced aggregation работает путём предварительной сортировки и физического кластеризования данных с использованием тщательно подобранных ключей сортировки и кластеризации, тем самым минимизируя сканирование данных и вычислительные нагрузки во время агрегации.

  • Ключ сортировки: Поле (например, метки времени), используемое для физического упорядочения документов на диске, обеспечивая последовательное хранение документов с одинаковыми или схожими значениями ключа сортировки.
  • Ключ кластеризации: Подмножество полей из ключа сортировки, которое группирует связанные документы в непрерывные физические блоки. Таким образом, агрегации могут обрабатывать непрерывные блоки данных, а не разбросанные документы.

Таблица 1 Общие сценарии расширенной агрегации

Сценарий

Описание

Агрегация полей с низкой кардинальностью

Агрегирует поля, в которых небольшое количество уникальных значений. В этом случае используется группировка. Один пример — подсчёт количества заказов по городу. Операция кластеризации может легко достичь этой цели.

Агрегация полей с высокой кардинальностью

Агрегирует поля, в которых большое количество уникальных значений. Обычно используется гистограммная агрегация. Один пример — подсчёт посещений за час. Ключ кластеризации можно использовать для ускорения агрегации данных в пределах заданного диапазона или области.

Гибридная агрегация полей с низкой и высокой кардинальностью

Сначала группирует и агрегирует поля с низкой кардинальностью (например, заказы по городу), а затем создаёт гистограмму, используя поля с высокой кардинальностью (например, метки времени). Многоуровневая кластеризация повышает эффективность гибридных запросов.

Ограничения

Только Elasticsearch 7.10.2 поддерживает расширенную агрегацию.

Агрегация полей с низкой кардинальностью

Обычно поля с низкой кардинальностью используют группировку в качестве способа агрегации. При наличии подходящих ключей сортировки группировка подготавливает данные для пакетной векторизации.

Например, чтобы агрегировать два поля низкой кардинальности city and product, выполните следующие шаги:

  1. Выполните следующую команду, чтобы установить индекс testindex:
    PUT testindex
    {
    "mappings": {
    "properties": {
    "date": {
    "type": "date",
    "format": "yyyy-MM-dd"
    },
    "city": {
    "type": "keyword"
    },
    "product": {
    "type": "keyword"
    },
    "trade": {
    "type": "double"
    }
    }
    },
    "settings": {
    "index": {
    "search": {
    "turbo": {
    "enabled": "true"
    }
    },
    "sort": {
    "field": [
    "city",
    "product"
    ]
    },
    "cluster": {
    "field": [
    "city",
    "product"
    ]
    }
    }
    }
    }
    Таблица 2 Параметры агрегации полей низкой кардинальности

    Параметр

    Тип

    Описание

    index.search.turbo.enabled

    Булево

    Нужно ли включать расширенную агрегацию. Обычно расширенная агрегация должна быть включена там, где используются агрегации.

    Значение может быть:

    • false (по умолчанию): Отключить расширенную агрегацию.
    • true: Включить расширенную агрегацию.

    index.sort.field

    Массив строк

    Укажите ключи сортировки. Ключи сортировки — это поля, используемые для упорядочивания или ранжирования документов.

    Вы можете указать один или несколько полей в качестве ключей сортировки. Если указано несколько полей, они будут применяться в той последовательности, в которой указаны. Сначала документы ранжируются по первому полю, затем начальный набор результатов ранжируется по второму полю и так далее.

    Диапазон значений: Значение должно быть полями, содержащимися в индексе.

    index.cluster.field

    Массив строк

    Укажите ключи кластеризации. Ключи кластеризации определяют, какие документы собираются в одни и те же кластеры.

    Во время операции агрегации документы в одном кластере могут обрабатываться пакетами, что существенно повышает производительность агрегации.

    Ограничение: Ключи кластеризации должны быть подмножеством ключей сортировки.

    Диапазон значений: Значение должно быть полями, содержащимися в индексе.

  2. Выполните следующую команду для импорта образца данных.
    PUT /_bulk
    { "index": { "_index": "testindex", "_id": "1" } }
    { "date": "2025-01-01", "city": "cityA", "product": "books", "trade": 3000.0}
    { "index": { "_index": "testindex", "_id": "2" } }
    { "date": "2025-01-02", "city": "cityA", "product": "books", "trade": 1000.0}
    { "index": { "_index": "testindex", "_id": "3" } }
    { "date": "2025-01-01", "city": "cityA", "product": "bottles", "trade": 100.0}
    { "index": { "_index": "testindex", "_id": "4" } }
    { "date": "2025-01-02", "city": "cityA", "product": "bottles", "trade": 300.0}
    { "index": { "_index": "testindex", "_id": "5" } }
    { "date": "2025-01-01", "city": "cityB", "product": "books", "trade": 7000.0}
    { "index": { "_index": "testindex", "_id": "6" } }
    { "date": "2025-01-02", "city": "cityB", "product": "books", "trade": 1000.0}
  3. Выполните следующую команду запроса для агрегирования полей с низкой кардинальностью.

    Например, запросите среднее торговля значение для каждого продукта в разных городах.

    POST testindex/_search
    {
    "size": 0,
    "aggs": {
    "groupby_city": {
    "terms": {
    "field": "city"
    },
    "aggs": {
    "groupby_product": {
    "terms": {
    "field": "product"
    },
    "aggs": {
    "avg_trade": {
    "avg": {
    "field": "trade"
    }
    }
    }
    }
    }
    }
    }
    }

Агрегация полей с высокой кардинальностью

Поля с высокой кардинальностью обычно используют гистограммную агрегацию, что облегчает обработку данных по диапазону или области.

Например, чтобы агрегировать типичное поле с высокой кардинальностью дата, выполните следующие шаги:

  1. Выполните следующую команду для установки индекса testindex:
    PUT testindex
    {
    "mappings": {
    "properties": {
    "date": {
    "type": "date",
    "format": "yyyy-MM-dd"
    },
    "score": {
    "type": "double"
    }
    }
    },
    "settings": {
    "index": {
    "search": {
    "turbo": {
    "enabled": "true"
    }
    },
    "sort": {
    "field": [
    "date"
    ]
    }
    }
    }
    }
    Таблица 3 Параметры агрегации поля с высокой кардинальностью

    Параметр

    Тип

    Описание

    index.search.turbo.enabled

    Boolean

    Нужно ли включать расширенную агрегацию. Обычно расширенная агрегация должна быть включена там, где используются агрегации.

    Значение может быть:

    • false (default): Отключить расширенную агрегацию.
    • true: Включить расширенную агрегацию.

    index.sort.field

    Массив строк

    Укажите ключи сортировки. Ключи сортировки — это поля, используемые для упорядочения или ранжирования документов.

    Вы можете указать один или несколько полей в качестве ключей сортировки. Когда указано несколько полей, они применяются в той последовательности, в которой указаны. Документы сначала ранжируются по первому полю, затем начальный набор результатов ранжируется по второму полю и так далее.

    Диапазон значений: Значение должно быть полями, содержащимися в индексе.

  2. Выполните следующую команду, чтобы импортировать образцы данных.
    PUT /_bulk
    { "index": { "_index": "testindex", "_id": "1" } }
    { "date": "2025-01-01", "score": "12.0"}
    { "index": { "_index": "testindex", "_id": "2" } }
    { "date": "2025-01-02","score": "24.0"}
    { "index": { "_index": "testindex", "_id": "3" } }
    { "date": "2025-01-01","score": "53.0"}
    { "index": { "_index": "testindex", "_id": "4" } }
    { "date": "2025-01-02", "score": "22.0"}
    { "index": { "_index": "testindex", "_id": "5" } }
    { "date": "2025-01-01", "score": "99.0"}
    { "index": { "_index": "testindex", "_id": "6" } }
    { "date": "2025-01-02","score": "26.0"}
  3. Выполните следующую команду запроса для агрегирования полей высокой кардинальности.

    Этот запрос группирует date поле с использованием гистограммы, а затем вычисляет средний балл.

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

Гибридная агрегация полей низкой и высокой кардинальности

Когда поля низкой и высокой кардинальности смешаны, сначала группируются и агрегируются поля низкой кардинальности, а затем агрегируются поля высокой кардинальности с использованием гистограмм.

Например, чтобы сначала сгруппировать поле низкой кардинальности city, затем сгруппировать поле низкой кардинальности product, а затем сгруппировать поле высокой кардинальности date в гистограмму, выполните следующие шаги:

  1. Выполните следующую команду для установки индекса testindex:
    PUT testindex
    {
    "mappings": {
    "properties": {
    "date": {
    "type": "date",
    "format": "yyyy-MM-dd"
    },
    "city": {
    "type": "keyword"
    },
    "product": {
    "type": "keyword"
    },
    "trade": {
    "type": "double"
    }
    }
    },
    "settings": {
    "index": {
    "search": {
    "turbo": {
    "enabled": "true"
    }
    },
    "sort": {
    "field": [
    "city",
    "product",
    "date"
    ]
    },
    "cluster": {
    "field": [
    "city",
    "product"
    ]
    }
    }
    }
    }
    Таблица 4 Параметры гибридной агрегации полей с низкой и высокой кардинальностью

    Параметр

    Тип

    Описание

    index.search.turbo.enabled

    Boolean

    Включить улучшенную агрегацию. Обычно улучшенная агрегация должна быть включена там, где используются агрегации.

    Значение может быть:

    • false (default): Отключить улучшенную агрегацию.
    • true: Включить улучшенную агрегацию.

    index.sort.field

    Массив строк

    Укажите ключи сортировки. Ключи сортировки — это поля, используемые для упорядочения или ранжирования документов.

    Вы можете указать одно или несколько полей в качестве ключей сортировки. Когда указано несколько полей, они применяются в том порядке, в котором указаны. Документы сначала ранжируются по первому полю, затем начальный набор результатов ранжируется по второму полю и так далее.

    Ограничение: Поля с высокой кардинальностью должны быть среди ключей сортировки и должны следовать за последним полем с низкой кардинальностью.

    Диапазон значений: Значение должно быть полями, содержащимися в индексе.

    index.cluster.field

    Массив строк

    Укажите ключи кластеризации. Ключи кластеризации определяют, какие документы собираются в одни и те же кластеры.

    Во время операции агрегации документы в одном кластере могут обрабатываться пакетами, что значительно повышает производительность агрегации.

    Ограничение: Ключи кластеризации должны быть подмножеством ключей сортировки.

    Диапазон значений: Значение должно быть полями, содержащимися в индексе.

  2. Выполните следующую команду, чтобы импортировать образцовые данные.
    PUT /_bulk
    { "index": { "_index": "testindex", "_id": "1" } }
    { "date": "2025-01-01", "city": "cityA", "product": "books", "trade": 3000.0}
    { "index": { "_index": "testindex", "_id": "2" } }
    { "date": "2025-01-02", "city": "cityA", "product": "books", "trade": 1000.0}
    { "index": { "_index": "testindex", "_id": "3" } }
    { "date": "2025-01-01", "city": "cityA", "product": "bottles", "trade": 100.0}
    { "index": { "_index": "testindex", "_id": "4" } }
    { "date": "2025-01-02", "city": "cityA", "product": "bottles", "trade": 300.0}
    { "index": { "_index": "testindex", "_id": "5" } }
    { "date": "2025-01-01", "city": "cityB", "product": "books", "trade": 7000.0}
    { "index": { "_index": "testindex", "_id": "6" } }
    { "date": "2025-01-02", "city": "cityB", "product": "books", "trade": 1000.0}
  3. Выполните следующую команду запросa, чтобы выполнить гибридную агрегацию полей с низкой и высокой кардинальностью.

    Например, запросите среднее торговля значение каждого продукта в разных городах за каждый день, указанное дата поле.

    POST testindex/_search
    {
    "size": 0,
    "aggs": {
    "groupby_region": {
    "terms": {
    "field": "city"
    },
    "aggs": {
    "groupby_host": {
    "terms": {
    "field": "product"
    },
    "aggs": {
    "groupby_timestamp": {
    "date_histogram": {
    "field": "date",
    "interval": "day"
    },
    "aggs": {
    "avg_score": {
    "avg": {
    "field": "trade"
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }

Performance Testing

Test environment

  • Датасет: esrally nyc_taxis
  • Кластер спецификации: 4U16G, 100 GB, high I/O x 3 nodes

Test Procedure

  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 и получите результат при включенной улучшенной агрегации.

Test Result

Этот тест сосредоточен на результате запроса dropoff_datetime агрегация, то есть результаты задач autohisto_agg и date_histogram_agg. Следующая таблица сравнивает результаты тестов между случаями, когда расширенная агрегация отключена, и когда она включена.

Метрика

Задача

Единица

Расширенная агрегация отключена

Расширенная агрегация включена

Расширенная агрегация отключена

Расширенная агрегация включена

открыть/закрыть

Вывод

Тестовый раунд 1

Тестовый раунд 2

Тестовый раунд 3

Тестовый раунд 1

Тестовый раунд 2

Тестовый раунд 3

Среднее значение

Среднее значение

Минимальная пропускная способность

autohisto_agg

ops/s

4.42

4.44

4.43

11.66

11.94

11.96

4.43

11.85

2.68

Пропускная способность улучшилась более чем в 2,5 раза.

Средняя пропускная способность

autohisto_agg

ops/s

4.50

4.46

4.44

11.81

11.99

12.00

4.47

11.93

2.67

Медианная Пропускная способность

autohisto_agg

ops/s

4.51

4.46

4.44

11.83

11.98

12.00

4.47

11.94

2.67

Максимальная Пропускная способность

autohisto_agg

ops/s

4.54

4.48

4.45

11.90

12.07

12.02

4.49

12.00

2.67

100‑й процентиль задержки

autohisto_agg

ms

216.30

-

-

-

84.56

80.38

216.30

82.47

0.38

Задержка уменьшается более чем на 60%.

100‑й процентиль времени обслуживания

autohisto_agg

ms

216.30

-

-

-

84.56

80.38

216.30

82.47

0.38

Уровень ошибок

autohisto_agg

%

0

0

0

0

0

0

0

0

0

-

Мин Пропускная способность

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 раза.

Средняя пропускная способность

date_histogram_agg

ops/s

4.73

4.67

4.67

12.61

12.46

12.61

4.69

12.56

2.68

Медианная пропускная способность

date_histogram_agg

ops/s

4.73

4.67

4.67

12.62

12.46

12.60

4.69

12.56

2.68

Максимальная пропускная способность

date_histogram_agg

операций/с

4.74

4.67

4.67

12.64

12.49

12.63

4.69

12.59

2.68

задержка 50‑го процентиля

date_histogram_agg

мс

202.61

218.09

213.43

77.64

76.02

82.63

211.38

78.77

0.37

Задержка уменьшается более чем на 60%.

Задержка на 100‑м процентиле

date_histogram_agg

ms

207.35

223.88

246.63

77.99

-

-

225.95

77.99

0.35

Время обслуживания на 50‑м процентиле

date_histogram_agg

ms

202.61

218.09

213.43

77.64

76.02

82.63

211.38

78.77

0.37

Время обслуживания в 100‑м процентиле

date_histogram_agg

мс

207.35

223.88

246.63

77.99

-

-

225.95

77.99

0.35

уровень ошибок

date_histogram_agg

%

0

0

0

0

0

0

0

0

0

-

Заключение теста

При одинаковой конфигурации кластера производительность агрегации значительно улучшается, когда включена расширенная агрегация. Пропускная способность запросов увеличивается более чем в 2.5 раза, а задержка снижается более чем на 60%.