Перейти к основному содержимому
Версия: 2.0.x

Понимание выполнения задач материализованного представления

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

Обзор

Когда система обновляет материализованное представление, она создает выполнение задачи, которое содержит подробную информацию об операции обновления. Эта информация хранится в объекте MVTaskRunExtraMessage и может быть получена путем запроса поля EXTRA_MESSAGE в системном представлении information_schema.task_runs.

Дополнительное сообщение выполнения задач

В этом разделе описываются поля, предоставляемые в MVTaskRunExtraMessage.

forceRefresh

  • Тип: Boolean
  • Описание: Указывает, является ли это принудительным обновлением, которое обходит нормальные условия обновления. true возвращается, когда принудительное полное обновление запускается вручную с помощью REFRESH MATERIALIZED VIEW ... FORCE.

partitionStart

  • Тип: String
  • Описание: Начальная граница партиции для этой операции обновления. Она определяет нижнюю границу диапазона партиций для обновления.
  • Формат: Значение ключа партиции (например, "2024-01-01" для партиций на основе дат)
  • Пример: Когда обновляются данные с января 2024 года и далее, это поле будет "2024-01-01".

partitionEnd

  • Тип: String
  • Описание: Конечная граница партиции для этой операции обновления. Она определяет верхнюю границу диапазона партиций для обновления.
  • Формат: Значение ключа партиции (например, "2024-01-31" для партиций на основе дат)
  • Пример: Когда обновляются данные до января 2024 года, это поле будет "2024-01-31".

mvPartitionsToRefresh

  • Тип: Set of Strings
  • Описание: Список партиций материализованного представления, которые запланированы для обновления в выполнении задачи. Этот элемент помогает отслеживать, какие партиции материализованного представления будут обновлены.
  • Ограничение размера: Система автоматически обрезает количество партиций до max_mv_task_run_meta_message_values_length (По умолчанию: 100), чтобы предотвратить чрезмерное хранение метаданных, если фактическое количество превышает значение.
  • Пример: ["p20240101", "p20240102", "p20240103"]
  • Примечание: Это представляет собственные партиции материализованного представления, а не партиции базовой таблицы.

refBasePartitionsToRefreshMap

  • Тип: Map of String to Set of Strings

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

  • Использование: Значение устанавливается на этапе планировщика плана материализованного представления. Оно может использоваться для отслеживания того, какие партиции базовой таблицы необходимо просканировать.

  • Формат: {tableName -> Set<partitionName>}

  • Ограничение размера: Система автоматически обрезает количество партиций до max_mv_task_run_meta_message_values_length (По умолчанию: 100), чтобы предотвратить чрезмерное хранение метаданных, если фактическое количество превышает значение.

  • Пример:

    {
    "orders": ["p20240101", "p20240102"],
    "customers": ["p202401"]
    }
  • Примечание: Это запланированный набор партиций до оптимизации.

basePartitionsToRefreshMap

  • Тип: Map of String to Set of Strings

  • Описание: Отображение между справочными базовыми таблицами и набором их партиций, которые были обновлены во время выполнения.

  • Использование: Значение устанавливается после фиксации карты версий материализованного представления. Оно отражает реальные партиции, используемые оптимизатором.

  • Формат: {tableName -> Set<partitionName>}

  • Ограничение размера: Система автоматически обрезает количество партиций до max_mv_task_run_meta_message_values_length (По умолчанию: 100), чтобы предотвратить чрезмерное хранение метаданных, если фактическое количество превышает значение.

  • Пример:

    {
    "orders": ["p20240101", "p20240102"],
    "line_items": ["p20240101_batch1", "p20240101_batch2"]
    }
  • Примечание: Это фактический набор партиций после оптимизации и выполнения запроса.

примечание

Разница между refBasePartitionsToRefreshMap и basePartitionsToRefreshMap:

  • refBasePartitionsToRefreshMap: Запланированные партиции до оптимизации (обычно для основной справочной таблицы)
  • basePartitionsToRefreshMap: Фактические партиции после оптимизации (включает все таблицы и оптимизированные наборы партиций)

nextPartitionStart

  • Тип: String
  • Описание: Начальная граница партиции для следующего инкрементного обновления. Это значение определяет нижнюю границу диапазона партиций, которые будут обновлены в следующем выполнении задачи, когда операция обновления разделена на несколько выполнений задач из-за ограничений ресурсов или больших объемов данных.
  • Пример: Если текущее выполнение задачи обновляет данные до "2024-01-15", значение этого поля может быть "2024-01-16".

nextPartitionEnd

  • Тип: String
  • Описание: Конечная граница партиции для следующего инкрементного обновления. Это значение определяет верхнюю границу диапазона партиций, которые будут обновлены в следующем выполнении задачи, когда операция обновления разделена на несколько выполнений задач из-за ограничений ресурсов или больших объемов данных.
  • Пример: "2024-01-31" для следующего пакета партиций для обработки.

nextPartitionValues

  • Тип: String
  • Описание: Сериализованные значения партиций для следующего обновления (используется для list-партиционирования или сложных схем партиционирования). Он хранит конкретные значения партиций, когда простых диапазонов начала/конца недостаточно.
  • Пример: "('US', 'ACTIVE'), ('UK', 'ACTIVE')" для многостолбцовых list-партиций.

processStartTime

  • Тип: Integer (временная метка в миллисекундах)
  • Описание: Временная метка, когда выполнение задачи фактически начало обработку (время ожидания исключено). Она может использоваться для вычисления фактического времени обработки по формуле Время обработки = Время завершения - Время начала процесса (время ожидания в очереди исключено).
  • Пример: 1704067200000 (2024-01-01 00:00:00 UTC)

executeOption

  • Тип: ExecuteOption object
  • Описание: Параметры конфигурации для выполнения задачи.
  • По умолчанию: Priority = LOWEST, isMergeRedundant = false
  • Поля:
    • priority: Приоритет выполнения задачи (значения из Constants.TaskRunPriority)
      • HIGHEST: 0
      • HIGH: 32
      • NORMAL: 64
      • LOW: 96
      • LOWEST: 127
    • isMergeRedundant: Объединять ли избыточные операции обновления.
    • properties: Дополнительные свойства выполнения в формате Map<String, String>.

planBuilderMessage

  • Тип: Map of String to String
  • Описание: Диагностические сообщения и метаданные от построителя плана запроса. Он содержит информацию о планировании запроса, решениях оптимизации и возможных проблемах.
  • Ограничение размера: Система автоматически обрезает количество партиций до max_mv_task_run_meta_message_values_length (По умолчанию: 100), чтобы предотвратить чрезмерное хранение метаданных, если фактическое количество превышает значение.

refreshMode

  • Тип: String
  • Описание: Режим обновления этого выполнения задачи. Он указывает, как было обновлено материализованное представление.
  • Допустимые значения:
    • "COMPLETE": Полное обновление всех партиций
    • "PARTIAL": Инкрементное обновление конкретных партиций
    • "FORCE": Принудительное обновление, обходящее проверки устаревания
    • "" (пусто): По умолчанию или не указано

adaptivePartitionRefreshNumber

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

Запрос деталей выполнения задачи

Вы можете запрашивать информацию о выполнении задач материализованного представления через системное представление information_schema.task_runs.

SELECT
TASK_NAME,
CREATE_TIME,
FINISH_TIME,
STATE,
EXTRA_MESSAGE
FROM information_schema.task_runs
WHERE TASK_NAME LIKE 'mv-%'
ORDER BY CREATE_TIME DESC
LIMIT 10;

Столбец EXTRA_MESSAGE содержит JSON-представление MVTaskRunExtraMessage.

Вы можете дополнительно разобрать JSON-строку EXTRA_MESSAGE для лучшей читаемости.

SELECT
TASK_NAME,
CREATE_TIME,
get_json_string(EXTRA_MESSAGE, '$.refreshMode') AS refresh_mode,
get_json_string(EXTRA_MESSAGE, '$.forceRefresh') AS force_refresh,
get_json_string(EXTRA_MESSAGE, '$.mvPartitionsToRefresh') AS mv_partitions,
get_json_int(EXTRA_MESSAGE, '$.processStartTime') AS process_start_ms,
get_json_int(EXTRA_MESSAGE, '$.adaptivePartitionRefreshNumber') AS adaptive_batch_size
FROM information_schema.task_runs
WHERE TASK_NAME = 'mv-12345'
ORDER BY CREATE_TIME DESC;

Понимание производительности обновления

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

SELECT
TASK_NAME,
FINISH_TIME,
get_json_bigint(EXTRA_MESSAGE, '$.processStartTime') AS process_start_time,
(unix_timestamp(FINISH_TIME) * 1000 -
get_json_bigint(EXTRA_MESSAGE, '$.processStartTime')) / 1000 AS processing_seconds
FROM information_schema.task_runs
WHERE TASK_NAME LIKE 'mv-%' AND STATE = 'SUCCESS';

Анализ шаблонов обновления партиций

SELECT
TASK_NAME,
CREATE_TIME,
get_json_string(EXTRA_MESSAGE, '$.partitionStart') AS start_partition,
get_json_string(EXTRA_MESSAGE, '$.partitionEnd') AS end_partition,
get_json_string(EXTRA_MESSAGE, '$.nextPartitionStart') AS next_start,
get_json_string(EXTRA_MESSAGE, '$.nextPartitionEnd') AS next_end
FROM information_schema.task_runs
WHERE TASK_NAME = 'mv-12345'
ORDER BY CREATE_TIME DESC;

Элементы конфигурации

max_mv_task_run_meta_message_values_length

  • Тип: Integer
  • По умолчанию: 100
  • Область действия: Конфигурация FE
  • Описание: Максимальное количество элементов для хранения в полях set или MAP, чтобы предотвратить чрезмерный рост метаданных. Он ограничивает размер mvPartitionsToRefresh, refBasePartitionsToRefreshMap, basePartitionsToRefreshMap и planBuilderMessage.

Лучшие практики

Мониторинг производительности обновления

  • Сравните processStartTime с фактическим временем завершения, чтобы выявить проблемы с очередью.
  • Используйте adaptivePartitionRefreshNumber для оптимизации размеров пакетов.

Отладка неудачных обновлений

  • Проверьте planBuilderMessage на наличие проблем с оптимизатором.
  • Сравните refBasePartitionsToRefreshMap с basePartitionsToRefreshMap на предмет проблем с обрезкой партиций.

Оптимизация инкрементных обновлений

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

Понимание покрытия партиций

  • Сравните mvPartitionsToRefresh с basePartitionsToRefreshMap, чтобы проверить отображение партиций материализованного представления на базовую таблицу.
  • Убедитесь, что партиции базовой таблицы соответствуют ожидаемым диапазонам обновления.

Устранение неполадок

Проблема: Обновление занимает слишком много времени

Проверьте:

  1. processStartTime - Значительная разница со временем создания указывает, что выполнение задачи находилось в очереди.
  2. basePartitionsToRefreshMap - Значительное значение указывает на слишком много партиций, которые сканируются.
  3. adaptivePartitionRefreshNumber - Возможно, вам нужно настроить рабочую нагрузку.

Проблема: Обновлены неожиданные партиции

Проверьте:

  1. forceRefresh - Если возвращается true, это указывает, что выполняется принудительное полное обновление.
  2. refBasePartitionsToRefreshMap - Это поле показывает запланированные партиции.
  3. basePartitionsToRefreshMap - Это поле показывает фактические партиции после оптимизации.
  4. Сравните две вышеуказанные карты, чтобы увидеть, изменил ли оптимизатор план.

Проблема: Обновление застряло в нескольких итерациях

Проверьте:

  1. nextPartitionStart и nextPartitionEnd - Это поле показывает неполное состояние обновления.
  2. adaptivePartitionRefreshNumber - Возможно, вам нужно настроить рабочую нагрузку.
  3. Рассмотрите возможность увеличения размера пакета или уменьшения детализации партиций.

См. также