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

Настройка улучшенной агрегации

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

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

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

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

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

Для примера, для индекса, содержащего поля region, host и value, документы могут быть отсортированы по этим трём полям при загрузке, а затем кластеризованы и сохранены на основе полей region и host. В этом случае документы с одинаковым region или host хранятся вместе и затем сортируются по полю value внутри каждого кластера.

Когда выполняется запрос агрегации, данные запрашиваются по ключу кластеризации (region и host) или по полю value внутри каждого кластера. Это повышает эффективность запросов.

Рисунок 1 Пример улучшенной агрегации


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

Сценарий

Описание

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

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

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

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

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

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

Ограничения

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

Вход в Kibana

Войдите в Kibana и перейдите на страницу выполнения команд. Кластеры Elasticsearch поддерживают несколько методов доступа. В этой теме Kibana используется в качестве примера для описания процедур выполнения.

  1. Войдите в консоль управления CSS.
  2. В панели навигации слева выберите Clusters > Elasticsearch.
  3. В списке кластеров найдите целевой кластер и нажмите Kibana в столбце Operation, чтобы войти в консоль Kibana.
  4. В левой панели навигации выберите Dev Tools.

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

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

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

Например, чтобы агрегировать два поля с низкой кардинальностью city и 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"
    ]
    }
    }
    }
    }
    Table 2 Параметры агрегации полей с низкой кардинальностью

    Параметр

    Тип

    Значение по умолчанию

    Описание

    index.search.turbo.enabled

    Boolean

    false

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

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

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

    index.sort.field

    Массив строк

    N/A

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

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

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

    index.cluster.field

    Массив строк

    N/A

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

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

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

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

  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. Выполните следующую команду запроса для агрегации полей с низкой кардинальностью.

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

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

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

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

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

  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"
    ]
    }
    }
    }
    }
    Table 3 Параметры агрегации поля с высокой кардинальностью

    Параметр

    Тип

    Значение по умолчанию

    Описание

    index.search.turbo.enabled

    Boolean

    false

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

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

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

    index.sort.field

    Массив строк

    N/A

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

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

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

  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"
    ]
    }
    }
    }
    }
    Table 4 Параметры гибридной агрегации полей с низкой и высокой кардинальностью

    Параметр

    Тип

    Значение по умолчанию

    Описание

    index.search.turbo.enabled

    Boolean

    false

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

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

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

    index.sort.field

    Массив строк

    N/A

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

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

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

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

    index.cluster.field

    Массив строк

    N/A

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

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

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

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

  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. Выполните следующую команду запроса для выполнения гибридной агрегации полей с низкой и высокой кардинальностью.

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

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

Тестирование производительности

Тестовая среда

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

Процедура тестирования

  1. Создайте шаблон индекса в кластере, укажите ключи сортировки и отключите enhanced aggregation.
    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 и получите результат при отключённом enhanced aggregation.
  3. Создайте ещё один шаблон индекса в том же кластере, укажите ключи сортировки и включите enhanced aggregation.
    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 и получите результат при включённом enhanced aggregation.

Результат теста

Этот тест сосредоточен на результате запроса агрегирования dropoff_datetime, то есть на результатах задач autohisto_agg и date_histogram_agg. В следующей таблице сравниваются результаты теста при отключённом и включённом enhanced aggregation.

Метрика

Задача

Единица

Enhanced Aggregation Disabled

Enhanced Aggregation Enabled

Enhanced Aggregation Disabled

Enhanced Aggregation Enabled

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

Заключение

Тестовый раунд 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

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

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

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

ops/s

4.74

4.67

4.67

12.64

12.49

12.63

4.69

12.59

2.68

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

date_histogram_agg

ms

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

ms

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%.