Agendador de tarefas simples baseado em Linux com dependências de tarefas? [fechadas]

4

Estou mantendo um sistema de data warehousing que envolve muitos trabalhos dependentes (importação de dados, transformação, etc). Eu tenho usado o crontab do Linux para gerenciá-los até que a dependência entre os trabalhos seja complicada.

Basicamente estou à procura de uma substituição de cron que me ajude com o seguinte cenário:

  • Execute o trabalho A em 00:05 (fácil). Geralmente este é o trabalho de importação.

  • Agende o trabalho B, C, D para executar depois que o trabalho A terminar. O trabalho D só é executado 30 minutos após o término do trabalho A (para distribuir a carga). Estas são as tarefas de transformação.

  • O trabalho E é executado quando todos os B, C e D terminam. Normalmente, esse é o trabalho que traz dados agregados para um banco de dados front-end da Web.

Tudo isso acontece no mesmo nó.

Eu imagino que parece um gráfico de topologia.

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

Existem ferramentas simples baseadas no Linux que suportam isso? Eu olhei em Chronos do Airbnb mas parece um exagero para minha necessidade.

Editar: o cenário acima é apenas uma versão simplificada do que está acontecendo. Temos muito mais trabalhos diários e a dependência é muito mais complicada. Então, na verdade, estou procurando alguns scripts "cron on steroid" do que case-by-case para atender a cada cenário.

    
por huy 13.05.2013 / 12:24

3 respostas

5

Como Michael Kjörling sugeriu nos comentários, você deve ser capaz de fazer isso com um simples script bash. Algo parecido com isto:

#!/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

Se você usar cron para iniciar este script às 00:05, ele deverá fazer o que quiser. O principal truque aqui é o uso de subshels () and% código%. Os subshels permitem que você execute vários trabalhos em segundo plano e && para executar apenas trabalhos depois que outro trabalho tiver saído com êxito.

    
por 13.05.2013 / 17:38
3

Parece interessante:

  • link

    not so simple but powerful and supported by apache, configured by code, widely used now

  • link

    java airflow like, simpler to configure

  • link

    Simple DAG-based job scheduler in Python

  • link (por spotify)

    Luigi is a Python module that helps you build complex pipelines of batch jobs.

Estes são todos os projetos python (esperados para digdag) que visam substituir o cron com uma boa interface gráfica para ver o gráfico de dependências.

Eu costumava usar bash para essas coisas, mas fica feio quando você se torna um sistema complexo.

    
por 08.07.2015 / 19:52
2

A BMC Software produz um produto chamado Control-M, que seria perfeito para sua descrição do problema. No entanto, não é grátis: (

Nós o usamos para administrar cerca de 500 trabalhos em produção e em algum lugar perto de 400 em ambientes de teste. Você instala os clientes em qualquer máquina que precisar e configura os trabalhos no servidor Control-M para serem executados nos clientes. Há muitos parâmetros configuráveis e critérios de agendamento, os quais podem ser administrados por meio de uma GUI ou linha de comando. A parte mais adequada ao seu problema é que ele se vale da configuração de condições de entrada / saída para tarefas, de modo que você pode ter dependências apenas arrastando e soltando entre tarefas. Usamos isso para configurar fluxos de fluxo de trabalho de mais de 20 tarefas por vez.

    
por 24.01.2014 / 15:05