多くの依存ジョブ(データのインポート、変換など)を伴うデータウェアハウスシステムを維持しています。私は、ジョブ間の依存関係が複雑になるまで、Linuxのcrontab
を使用してそれらを管理してきました。
基本的に、次のシナリオで役立つcron
の代替品を探しています。
00:05
でジョブAを実行します(簡単)。通常、これはインポートジョブです。
ジョブAが終了した後に実行するようにジョブB、C、Dをスケジュールします。ジョブDは、ジョブAが終了してから30分後にのみ実行されます(負荷を分散するため)。これらは変換ジョブです。
ジョブEは、すべてのB、C、Dが終了したときに実行されます。通常、これは集約されたデータをWebフロントエンドデータベースに取り込むジョブです。
これらはすべて同じノードで発生します。
トポロジーグラフのように見えると思います。
A--> B -------------->---> E
\-> C -------------/ /
\-> (delay 30mins) -> D
これをサポートするような単純なLinuxベースのツールはありますか? Airbnbのクロノス を調べましたが、私の必要性にはやり過ぎのようです。
編集:上記のシナリオは、起こっていることの単純化されたバージョンです。私たちは毎日の仕事がもっとたくさんあり、依存関係はもっと複雑です。そのため、実際には、各シナリオに対応するために、ケースバイケースのbashスクリプトよりも「ステロイド上のcron」を探しています。
MichaelKjörlingがコメントで示唆しているように、これは簡単な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()
および&&
の使用です。サブシェルを使用すると、複数のバックグラウンドジョブを実行でき、&&
を使用すると、別のジョブが正常に終了した場合にのみジョブを実行できます。
これらは面白そうです:
それほど単純ではありませんが、強力で、Apacheによってサポートされ、コードによって構成され、現在広く使用されています
Javaの気流のように、設定が簡単
PythonのシンプルなDAGベースのジョブスケジューラ
LuigiはPythonモジュールで、バッチジョブの複雑なパイプラインを構築するのに役立ちます。
これらはすべてpythonプロジェクト(digdagを期待)であり、依存関係グラフを表示するためにcronをNiceGUIに置き換えることを目的としています。
以前はこのようなものにbashを使用していましたが、複雑なシステムに成長すると醜くなります。
BMC Softwareは、Control-Mと呼ばれる製品を製造しています。これは、問題の説明に最適です。ただし、無料ではありません:(
これを使用して、本番環境では約500のジョブを管理し、テスト環境では400近くのジョブを管理します。必要なマシンにクライアントをインストールしてから、Control-Mサーバーでジョブをセットアップしてクライアントで実行します。構成可能なパラメーターとスケジューリング基準はたくさんあり、それらはすべてGUIまたはコマンドラインから管理できます。問題に最も適しているのは、ジョブの入出力条件を設定することで成功するため、ジョブ間でドラッグアンドドロップするだけで依存関係を持つことができるということです。これを使用して、一度に20以上のジョブのワークフローストリームを設定します。