Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Сворачивание или преобразование данных ›Сворачивание исторических данных

Начало работы со сворачиванием

Эта функциональность находится в техническом предварительном просмотре и может быть изменена или удалена в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции в техническом предварительном просмотре не подпадают под SLA поддержки официальных функций GA.

Для использования функции Сворачивания необходимо создать одну или несколько «Задач свертывания». Эти задачи работают непрерывно в фоновом режиме и сворачивают указанный индекс или индексы, помещая свёрнутые документы во вторичный индекс (также по вашему выбору).

Представьте, что у вас есть ряд ежедневных индексов, которые содержат данные датчиков (sensor-2017-01-01, sensor-2017-01-02 и т.д.). Пример документа может выглядеть так:

{
  "timestamp": 1516729294000,
  "temperature": 200,
  "voltage": 5.2,
  "node": "a"
}

Создание задачи свертывания

Мы хотели бы свернуть эти документы в почасовые сводки, что позволит нам генерировать отчеты и панели мониторинга с любым интервалом времени в один час или больше. Задача свертывания может выглядеть так:

PUT _rollup/job/sensor
{
  "index_pattern": "sensor-*",
  "rollup_index": "sensor_rollup",
  "cron": "*/30 * * * * ?",
  "page_size": 1000,
  "groups": {
    "date_histogram": {
      "field": "timestamp",
      "fixed_interval": "60m"
    },
    "terms": {
      "fields": [ "node" ]
    }
  },
  "metrics": [
    {
      "field": "temperature",
      "metrics": [ "min", "max", "sum" ]
    },
    {
      "field": "voltage",
      "metrics": [ "avg" ]
    }
  ]
}

Мы даём задаче идентификатор «sensor» (в URL: PUT _rollup/job/sensor) и говорим ей свернуть шаблон индекса "sensor-*". Эта задача найдет и свернет любой индекс, соответствующий этому шаблону. Сводки свертывания затем сохраняются в индексе "sensor_rollup".

Параметр cron контролирует, когда и как часто активируется задача. Когда плановое задание задачи свертывания срабатывает, оно начинает свертывать данные с места, где оно остановилось после последней активации. Так что, если вы настроите задание на выполнение каждые 30 секунд, задача будет обрабатывать последние 30 секунд данных, которые были проиндексированы в индексах sensor-*.

Если вместо этого задание было настроено на выполнение один раз в сутки в полночь, задача обработает данные за последние 24 часа. Выбор во многом зависит от того, насколько «реальным временем» вы хотите свертывания и хотите ли вы непрерывно обрабатывать данные или переместить их на непиковые часы.

Далее мы определяем набор groups. По сути, мы определяем измерения, на которых мы хотим сортировать данные в будущем при запросе данных. Группировка в этой задаче позволяет нам использовать date_histogram агрегации по полю timestamp, свёрнутые с почасовыми интервалами. Она также позволяет выполнять агрегации по типу node по полю node.

Интервал гистограммы дат vs расписание cron

Вы заметите, что cron задачи задан на выполнение каждые 30 секунд, но date_histogram задан на свертывание с 60-минутными интервалами. Как они связаны?

date_histogram управляет зернистостью сохраняемых данных. Данные будут сворачиваться в почасовые интервалы, и вы не сможете запрашивать данные с более высокой зернистостью. Расписание cron просто контролирует, когда процесс ищет новые данные для свертывания. Каждые 30 секунд он будет проверять, есть ли новые данные за час, и сворачивать их. Если нет, задача возвращается в спящий режим.

Часто не имеет смысла задавать такое маленькое cron (30 сек) при большом интервале (1 час), потому что большая часть активаций просто вернётся в спящий режим. Но в этом нет ничего плохого, задача сделает всё правильно.

После определения групп, которые должны быть сгенерированы для данных, вы затем настраиваете метрики, которые должны быть собраны. По умолчанию собираются только doc_counts для каждой группы. Чтобы свертывание было полезным, вы часто добавляете метрики, такие как средние значения, минимальные и максимальные значения и т. д. В этом примере метрики довольно просты: мы хотим сохранить минимальное/максимальное/суммарное значение поля temperature и среднее значение поля voltage.

Средние значения не являются композиционными?!

Если вы раньше работали со свертыванием, вы можете быть осторожны в отношении средних значений. Если среднее значение сохраняется для 10-минутного интервала, оно обычно не имеет пользы для больших интервалов. Вы не можете усреднить шесть 10-минутных средних значений, чтобы найти среднее значение за час; среднее значение средних значений не равно общему среднему значению.

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

Вместо этого функция свертывания данных сохраняет count и sum для определенного интервала времени. Это позволяет нам восстановить среднее значение на любом интервале, большем или равном заданному интервалу. Это обеспечивает максимальную гибкость при минимальных затратах на хранение… и вам не нужно беспокоиться об точности средних значений (здесь нет среднего от средних значений!).

Дополнительную информацию о синтаксисе задания см. в разделе Создание задач свертывания.

После выполнения вышеуказанной команды и создания задачи вы получите следующий ответ:

{
  "acknowledged": true
}

Запуск задачи

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

Чтобы запустить задачу, выполните эту команду:

POST _rollup/job/sensor/_start

Поиск свёрнутых результатов

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

Например, рассмотрим этот запрос:

GET /sensor_rollup/_rollup_search
{
  "size": 0,
  "aggregations": {
    "max_temperature": {
      "max": {
        "field": "temperature"
      }
    }
  }
}

Это простая агрегация, которая вычисляет максимальное значение поля temperature. Но вы заметите, что она отправляется в индекс sensor_rollup, а не в исходные индексы sensor-*. И вы также заметите, что она использует конечную точку _rollup_search. В остальном синтаксис точно такой же, как вы ожидаете.

Если вы выполните этот запрос, вы получите результат, похожий на обычный ответ агрегации:

{
  "took" : 102,
  "timed_out" : false,
  "terminated_early" : false,
  "_shards" : ... ,
  "hits" : {
    "total" : {
        "value": 0,
        "relation": "eq"
    },
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "max_temperature" : {
      "value" : 202.0
    }
  }
}

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

Здесь есть несколько интересных выводов. Во-первых, даже если данные были свёрнуты с почасовыми интервалами и разделены по имени узла, запрос, который мы выполнили, просто вычисляет максимальную температуру по всем документам. groups, которые были настроены в задаче, не являются обязательными элементами запроса, они просто дополнительные измерения, по которым можно разделить данные. Во-вторых, синтаксис запроса и ответа почти идентичен обычному синтаксису DSL, что облегчает интеграцию в панели мониторинга и приложения.

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

GET /sensor_rollup/_rollup_search
{
  "size": 0,
  "aggregations": {
    "timeline": {
      "date_histogram": {
        "field": "timestamp",
        "fixed_interval": "7d"
      },
      "aggs": {
        "nodes": {
          "terms": {
            "field": "node"
          },
          "aggs": {
            "max_temperature": {
              "max": {
                "field": "temperature"
              }
            },
            "avg_voltage": {
              "avg": {
                "field": "voltage"
              }
            }
          }
        }
      }
    }
  }
}

Что возвращает соответствующий ответ:

{
   "took" : 93,
   "timed_out" : false,
   "terminated_early" : false,
   "_shards" : ... ,
   "hits" : {
     "total" : {
        "value": 0,
        "relation": "eq"
     },
     "max_score" : 0.0,
     "hits" : [ ]
   },
   "aggregations" : {
     "timeline" : {
       "meta" : { },
       "buckets" : [
         {
           "key_as_string" : "2018-01-18T00:00:00.000Z",
           "key" : 1516233600000,
           "doc_count" : 6,
           "nodes" : {
             "doc_count_error_upper_bound" : 0,
             "sum_other_doc_count" : 0,
             "buckets" : [
               {
                 "key" : "a",
                 "doc_count" : 2,
                 "max_temperature" : {
                   "value" : 202.0
                 },
                 "avg_voltage" : {
                   "value" : 5.1499998569488525
                 }
               },
               {
                 "key" : "b",
                 "doc_count" : 2,
                 "max_temperature" : {
                   "value" : 201.0
                 },
                 "avg_voltage" : {
                   "value" : 5.700000047683716
                 }
               },
               {
                 "key" : "c",
                 "doc_count" : 2,
                 "max_temperature" : {
                   "value" : 202.0
                 },
                 "avg_voltage" : {
                   "value" : 4.099999904632568
                 }
               }
             ]
           }
         }
       ]
     }
   }
}

Помимо того, что он более сложный (гистограмма дат и агрегация по типу, а также дополнительная метрика среднего значения), вы заметите, что date_histogram использует интервал 7d вместо 60m.

Заключение

Это краткое руководство должно было дать краткое представление о базовой функциональности, которую предоставляет Сворачивание. Более подробные советы и моменты, которые необходимо учитывать при настройке Сворачивания, можно найти в других разделах. Вы также можете ознакомиться с кратким справочником по API для обзора доступных возможностей.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/rollup-getting-started.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API