Перейти к содержимому
Последнее обновление

CREATE JOB

Описание​

Doris Job представляет собой задание, которое выполняется по заданному расписанию. Оно запускает предопределённые операции в определённое время или с указанным интервалом, позволяя автоматизировать выполнение задач. По своим функциям оно аналогично заданиям, выполняемым по расписанию в операционной системе, например cron в Linux и планировщику заданий в Windows.

Существует два типа заданий: ONE_TIME и RECURRING. Задание типа ONE_TIME запускается в указанный момент времени и предназначено главным образом для однократного выполнения. Задание типа RECURRING запускается циклически с указанным интервалом. Этот тип предназначен главным образом для периодических задач. Для задания типа RECURRING можно указать время начала и окончания с помощью STARTS/ENDS. Если время начала не задано, по умолчанию первое выполнение происходит в момент, равный текущему времени плюс один цикл планирования. Если указано время окончания, выполнение задания завершается по его достижении. Когда время окончания достигнуто или превышено либо следующий цикл выполнения выйдет за его пределы, состояние задания изменяется на FINISHED, и новые задачи больше не создаются.

У задания есть 4 состояния (RUNNING, STOPPED, PAUSED, FINISHED).

Начальное состояние задания: RUNNING. Задание в состоянии RUNNING создаёт TASK для выполнения в соответствии с заданным циклом планирования. Когда задание завершено и достигнуто время окончания, состояние меняется на FINISHED.

Задание в состоянии PAUSED можно возобновить операцией RESUME, переведя его в состояние RUNNING.

Переход задания в состояние STOPPED инициирует пользователь. При этом выполняемое задание отменяется и удаляется.

Задание в состоянии FINISHED хранится в системе 24 часа и удаляется через 24 часа.

JOB содержит только информацию о задании. При выполнении создаётся TASK. Для TASK предусмотрены состояния PENDING, RUNNING, SUCCEESS, FAILED, CANCELED. PENDING означает, что время запуска наступило, но задача ожидает выделения ресурсов. После выделения ресурсов состояние меняется на RUNNING. При успешном выполнении или сбое состояние меняется на SUCCESS/FAILED. CANCELED означает отмену. TASK сохраняет конечное состояние, то есть SUCCESS/FAILED. Остальные состояния можно просмотреть во время работы, но после перезапуска они будут недоступны.

Синтаксис​

CREATE
JOB
<job_name>
ON SCHEDULE <schedule>
[ COMMENT <string> ]
DO <sql_body>

Где:

schedule:
{ AT <at_timestamp> | EVERY <interval> [STARTS <start_timestamp> ] [ENDS <end_timestamp> ] }

Где:

interval:
quantity { WEEK | DAY | HOUR | MINUTE }

Обязательные параметры​

1. <job_name>

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

2. <schedule>

Предложение ON SCHEDULE задаёт тип, время запуска и частоту выполнения задания. Оно позволяет задать однократное или периодическое задание.

3. <sql_body>

Предложение DO задаёт операцию, выполняемую при запуске задания, то есть оператор SQL.

Необязательные параметры​

1. AT <at_timestamp>

Формат: 'YYYY-MM-DD HH:MM:SS'. Используется для однократных событий и указывает, что событие выполняется только один раз в заданные дату и время. После завершения выполнения состояние задания меняется на FINISHED.

2. EVERY <interval>

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

3. STARTS <start_timestamp>

Формат: 'YYYY-MM-DD HH:MM:SS'. Задаёт время начала выполнения задания. Если оно не указано, выполнение начнётся в следующий момент запуска после текущего времени. Время начала должно быть позже текущего времени.

4. ENDS <end_timestamp>

Формат: 'YYYY-MM-DD HH:MM:SS'. Задаёт время окончания выполнения задания. Если оно не указано, задание выполняется бессрочно. Указанные дата и время должны быть позже текущего момента. Если задано время начала, то есть STARTS, время окончания должно быть позже времени начала.

Требования к управлению доступом​

Пользователь, выполняющий эту команду SQL, должен иметь как минимум следующие права:

ПравоОбъектПримечания
ADMIN_PRIVБаза данныхВ настоящее время для выполнения этой операции поддерживаются только права ADMIN

Примечания по использованию​

  • Для TASK сохраняются только последние 100 записей.

  • В настоящее время поддерживаются только операции INSERT во внутреннюю таблицу. В будущем будет добавлена поддержка других операций.

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

Примеры​

  • Создание задания с именем my_job, которое выполняется раз в минуту. Выполняемая операция импортирует данные из db2.tbl2 в db1.tbl1.

    CREATE JOB my_job ON SCHEDULE EVERY 1 MINUTE DO INSERT INTO db1.tbl1 SELECT * FROM db2.tbl2;
  • Создание однократного задания, которое выполнится один раз в 2020-01-01 00:00:00 и импортирует данные из db2.tbl2 в db1.tbl1.

    CREATE JOB my_job ON SCHEDULE AT '2020-01-01 00:00:00' DO INSERT INTO db1.tbl1 SELECT * FROM db2.tbl2;
  • Создание периодического задания, которое начнёт выполняться в 2020-01-01 00:00:00 и будет запускаться раз в день. Выполняемая операция импортирует данные из db2.tbl2 в db1.tbl1.

    CREATE JOB my_job ON SCHEDULE EVERY 1 DAY STARTS '2020-01-01 00:00:00' DO INSERT INTO db1.tbl1 SELECT * FROM db2.tbl2 WHERE create_time >= days_add(now(),-1);
  • Создание периодического задания, которое начнёт выполняться в 2020-01-01 00:00:00 и будет запускаться раз в день. Операция импортирует данные из db2.tbl2 в db1.tbl1. Задание завершится в 2020-01-01 00:10:00.

    CREATE JOB my_job ON SCHEDULE EVERY 1 DAY STARTS '2020-01-01 00:00:00' ENDS '2020-01-01 00:10:00' DO INSERT INTO db1.tbl1 SELECT * FROM db2.tbl2 create_time >= days_add(now(),-1);

Рекомендации​

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

Конфигурация​

fe.conf

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

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

  • finished_job_cleanup_threshold_time_hour, порог времени для очистки завершённых задач, в часах. Значение по умолчанию: 24 часа.

  • job_insert_task_consumer_thread_num = 10; количество потоков для выполнения задач Insert. Значение должно быть больше 0, иначе используется значение по умолчанию 5.