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

Миграция со свертки на сжатие данных

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

Следующие аспекты сжатия данных более просты или надёжны:

  • Нет необходимости планировать задачи. Сжатие интегрировано с Управлением жизненным циклом индексов (ILM) и Управлением жизненным циклом потоков данных (DSL).
  • Нет отдельного API для поиска. К индексам, сжатым с помощью сжатия данных, можно получить доступ через API поиска и es|ql.
  • Нет отдельной конфигурации для свертки. Сжатие данных использует временную размерность и конфигурацию метрик из схемы.

Не все случаи использования свертки можно перенести на сжатие данных. Основное требование состоит в том, что данные должны храниться в Elasticsearch в виде потока данных временных рядов (TSDS). Случаи использования свертки, в основном сворачивающие данные по времени и всем измерениям, можно перенести на сжатие.

Пример использования свертки, который можно перенести на сжатие:

resp = client.rollup.put_job(
    id="sensor",
    index_pattern="sensor-*",
    rollup_index="sensor_rollup",
    cron="0 0 * * * *",
    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"
            ]
        }
    ],
)
print(resp)
const response = await client.rollup.putJob({
  id: "sensor",
  index_pattern: "sensor-*",
  rollup_index: "sensor_rollup",
  cron: "0 0 * * * *",
  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"],
    },
  ],
});
console.log(response);
PUT _rollup/job/sensor
{
  "index_pattern": "sensor-*",
  "rollup_index": "sensor_rollup",
  "cron": "0 0 * * * *", 
  "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" ] 
    }
  ]
}

Эквивалентная настройка потока данных временных рядов (TSDS), использующая сжатие данных через DSL:

resp = client.indices.put_index_template(
    name="sensor-template",
    index_patterns=[
        "sensor-*"
    ],
    data_stream={},
    template={
        "lifecycle": {
            "downsampling": [
                {
                    "after": "1d",
                    "fixed_interval": "1h"
                }
            ]
        },
        "settings": {
            "index.mode": "time_series"
        },
        "mappings": {
            "properties": {
                "node": {
                    "type": "keyword",
                    "time_series_dimension": True
                },
                "temperature": {
                    "type": "half_float",
                    "time_series_metric": "gauge"
                },
                "voltage": {
                    "type": "half_float",
                    "time_series_metric": "gauge"
                },
                "@timestamp": {
                    "type": "date"
                }
            }
        }
    },
)
print(resp)
response = client.indices.put_index_template(
  name: 'sensor-template',
  body: {
    index_patterns: [
      'sensor-*'
    ],
    data_stream: {},
    template: {
      lifecycle: {
        downsampling: [
          {
            after: '1d',
            fixed_interval: '1h'
          }
        ]
      },
      settings: {
        'index.mode' => 'time_series'
      },
      mappings: {
        properties: {
          node: {
            type: 'keyword',
            time_series_dimension: true
          },
          temperature: {
            type: 'half_float',
            time_series_metric: 'gauge'
          },
          voltage: {
            type: 'half_float',
            time_series_metric: 'gauge'
          },
          "@timestamp": {
            type: 'date'
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.putIndexTemplate({
  name: "sensor-template",
  index_patterns: ["sensor-*"],
  data_stream: {},
  template: {
    lifecycle: {
      downsampling: [
        {
          after: "1d",
          fixed_interval: "1h",
        },
      ],
    },
    settings: {
      "index.mode": "time_series",
    },
    mappings: {
      properties: {
        node: {
          type: "keyword",
          time_series_dimension: true,
        },
        temperature: {
          type: "half_float",
          time_series_metric: "gauge",
        },
        voltage: {
          type: "half_float",
          time_series_metric: "gauge",
        },
        "@timestamp": {
          type: "date",
        },
      },
    },
  },
});
console.log(response);
PUT _index_template/sensor-template
{
  "index_patterns": ["sensor-*"],
  "data_stream": { },
  "template": {
    "lifecycle": {
        "downsampling": [
            {
                "after": "1d", 
                "fixed_interval": "1h" 
            }
        ]
    },
    "settings": {
      "index.mode": "time_series"
    },
    "mappings": {
      "properties": {
        "node": {
          "type": "keyword",
          "time_series_dimension": true 
        },
        "temperature": {
          "type": "half_float",
          "time_series_metric": "gauge" 
        },
        "voltage": {
          "type": "half_float",
          "time_series_metric": "gauge" 
        },
        "@timestamp": { 
          "type": "date"
        }
      }
    }
  }
}

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

В задаче свертки поле cron определяет, когда свертываются документы. В шаблоне индекса поле after определяет, когда произойдёт свертка документов при сжатии (обратите внимание, что это время после выполнения переключения).

В задаче свертки поле groups определяет, по каким измерениям группируются документы. В шаблоне индекса поля с установленным time_series_dimension true и поле @timestamp определяют группировку.

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

В задаче свертки поле metrics определяет метрики и способ их хранения. В шаблоне индекса все поля с time_series_metric являются метриками. Если поле имеет gauge в качестве атрибута time_series_metric, то для этого поля в индексе сжатия хранятся значения min, max, sum и счёт значений. Если поле имеет counter в качестве атрибута time_series_metric, то в индексе сжатия сохраняется только последнее значение для этого поля.

© 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/8.17/rollup-migrating-to-downsampling.html

Spec-Zone.ru

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