4

Я поддерживаю систему хранения данных, которая включает в себя множество зависимых заданий (импорт, преобразование данных и т.д.). Я использовал crontab в Linux для управления ими, пока зависимость между заданиями не станет сложной.

В основном я ищу замену cron которая поможет мне в следующем сценарии:

  • Выполнить задание А в 00:05 (легко). Обычно это импортная работа.

  • Запланируйте выполнение заданий B, C, D после завершения задания A. Задание D запускается только через 30 минут после завершения задания A (для распределения нагрузки). Это рабочие места преобразования.

  • Задание E запускается, когда все B, C, D заканчиваются. Обычно это работа по переносу агрегированных данных в веб-интерфейсную базу данных.

Все это происходит на одном узле.

Я полагаю, это выглядит как график топологии.

A--> B -------------->---> E
 \-> C -------------/   /
 \-> (delay 30mins) -> D

Существуют ли такие простые инструменты на основе Linux, которые поддерживают это? Я посмотрел на Chronos Airbnb, но это кажется излишним для моей необходимости.

Изменить: приведенный выше сценарий просто упрощенная версия того, что происходит. У нас намного больше ежедневных рабочих мест, и зависимость намного сложнее. Так что я на самом деле ищу несколько "cron на стероидах", а не сценарии bash для каждого сценария.

3 ответа3

5

Как предложил Майкл Кьёрлинг в комментариях, вы сможете сделать это с помощью простого сценария bash. Что-то вроде этого:

#!/usr/bin/env bash

## Log file to which the "echo" commands bellow will write
logfile="/tmp/$$.log"

## Change "ls /etc >/dev/null " to reflect the actual 
## jobs you want to run but keep the  "&& echo job N finished" as is.
jobA="ls /etc >/dev/null"
jobB="ls /etc >/dev/null && echo 'job B finished' >> $logfile"
jobC="ls /etc >/dev/null && echo 'job C finished' >> $logfile"
jobD="ls /etc >/dev/null && echo 'job D finished' >> $logfile"
jobE="ls /etc >/dev/null";

## Run job A, launch jobs B and C as soon as A is finished
## and launch job D 30 minutes after A finishes.
eval $jobA && (sleep 30 && eval $jobD) & eval $jobB & eval $jobC &


## Now, monitor the logfile and run job E when the rest have finished
while true; do
    lines=`wc -l $logfile | cut -f 1 -d ' '`;
    echo "$logfile : $lines"
    ## The logfile will contain 4 lines if all jobs have finished
    if [ "$lines" -eq 3 ];
    then
      ## Run job E
      eval $jobE 
      ## Delete the logfile
      rm $logfile
      ## exit the script
      exit 0;
    fi
    ## Only check if the jobs are finished once a minute
    sleep 60;
done

Если вы используете cron для запуска этого скрипта в 00:05, он должен делать то, что вы хотите. Основным трюком здесь является использование subshels () и && . Подсхемы позволяют запускать несколько фоновых заданий и && запускать задания только после успешного завершения другого задания.

4

Это выглядит интересно:

  • https://airflow.incubator.apache.org/

    не такой простой, но мощный и поддерживаемый apache, настроенный кодом, широко используемый сейчас

  • https://www.digdag.io/

    как воздушный поток Java, проще настроить

  • https://github.com/thieman/dagobah

    Простой планировщик заданий на основе DAG в Python

  • https://github.com/spotify/luigi (по spotify)

    Luigi - это модуль Python, который помогает вам создавать сложные конвейеры пакетных заданий.

Это все проекты Python (за исключением digdag), которые нацелены на замену cron приятным графическим интерфейсом для просмотра графика зависимостей.

Раньше я использовал bash для этого, но он становится уродливым, когда вы превращаетесь в сложные системы.

2

BMC Software делает продукт под названием Control-M, который идеально подходит для вашего описания проблемы. Тем не менее, это не бесплатно :(

Мы используем его для администрирования около 500 рабочих мест на производстве и около 400 в тестовых средах. Вы устанавливаете клиенты на любые машины, которые вам нужны, а затем настраиваете задания на сервере Control-M для запуска на клиентах. Существует множество настраиваемых параметров и критериев планирования, которыми можно управлять через графический интерфейс или командную строку. Наиболее подходящей частью вашей проблемы является то, что она процветает при настройке условий ввода / вывода для заданий, так что вы можете иметь зависимости, просто перетаскивая их между заданиями. Мы используем его для настройки потоков рабочих процессов более 20 заданий одновременно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .