ワークフローエンジンDigDagのサーバ/クライアント構成を試してみる
ワークフローエンジンというのを知っていますか。
申し訳ないのですが私は全く知りませんでした。
ワークフローエンジンの定義は仕事の流れをツールが回してくれるツールのことが一般的のようです。
幾つかそういったワークフローエンジンがあるようですが今回はTreasure Data社がOSSとして公開し始めたDigDagをご紹介いたします。
DigDagとは
目的は手動でできる仕事をすべて自動化する目的で開発が進められているようです。
そのため用途はタスクを実行した時にエラーが発生した場合にリトライを何回実施するかをyamlに記述しておけば同じタスクを何度も実行できたり、失敗を何度も繰り返したらメールを送信をさせたりなどが実施できるようなことができます。
現在はタスクとして実行できる言語はRuby、ShellScript、Pythonとなりますが拡張性が高いアーキテクチャになっており、プラグインを追加することでさらなる機能の追加が容易で、今後の開発が期待できます。
他にもタスクをグルーピングすることができる機能がありタスクごとのつながりを変更するのをグループ単位で決めることができる機能が利点だと思われます。
また、ローカル実行とサーバ/クライアント実行の2種類の実行方法がありますが、本記事ではサーバ/クライアントのご紹介を行います。
準備
まずはDigDagをインストールします。 インストールは下記のコマンドを実行します。
$ curl -o /usr/local/bin/digdag --create-dirs -L "https://dl.digdag.io/digdag-latest" $ chmod +x /usr/local/bin/digdag
実行ファイルの場所が気に食わない人は変更してください。
これでdigdagコマンドの準備ができました。 それではプロジェクトの作成を行います。 digdagの初期ファイル作成は下記のコマンドで実行できます。
$ digdag init <名前>
これを実行するとフォルダ内に次のフォルダ構成のファイルが自動生成されます。
<名前> ├── <名前>.dig └── tasks ├── __init__.py ├── repeat_hello.sh └── shell_sample.sh
今回はわかりにくくなるため一旦tasksのファイルはすべて削除して利用します。
サーバー
digdagのサーバーを起動してみましょう。
サーバーは次の機能を持っています。
- プロジェクトの保存
- クライアントからの要求の実行
実行自体は非常に簡単で次のコマンドを実行します。
$ digdag server -m
オプション | 概要 |
---|---|
-n |
サーバのポート番号を指定する |
-b | listenするアドレスを指定する |
-m | タスクキュー用のデータベースをメモリで持つ(Storeというのが指すものがあっていれば多分これ) |
-o | タスクキュー用のデータベースファイルの保存先 |
これを実行すると下記のように表示されます。
$ digdag server -m 2016-06-19 19:21:41 +0900: Digdag v0.8.1 2016-06-19 19:21:43 +0900 [INFO] (main): Starting server on 127.0.0.1:65432 2016-06-19 19:21:43 +0900 [INFO] (main): XNIO version 3.3.3.Final 2016-06-19 19:21:43 +0900 [INFO] (main): XNIO NIO Implementation Version 3.3.3.Final
127.0.0.1:65432でサーバがリクエストを待っている状態になります。
クライアント
initで作成されたファイルなどを削除して次の構成で実行してみましょう。
今回はプロジェクト名をdigdag-client-sampleという名前にしてみました。
digdag-client-sample └── digdag-client-sample.dig
このdigdag-client-sample.digを下記のように書きます。
timezone: UTC +task1: sh>: echo "hello task1" +task2: sh>: echo "hello task2"
上記の内容を実行するとtask1を実行した後にtask2が実行されます。
task1はhello task1という文字列をShellScriptでechoを使って表示し、その後task2も同様の実行をするという内容になります。
このタスクをサーバに登録してみましょう。
登録するにはdigファイルが置いているフォルダに移動し下記のコマンドを実行します。
$ digdag push <プロジェクト名>
ここで指定するプロジェクト名はdigdagコマンドを実行したdigファイルがそのプロジェクト名でサーバーに登録するための名前になります。
そのためプロジェクト名をsampleとした場合にはプロジェクト名をsample、ワークフロー名をdigdag-client-sampleとして登録されます。
それでは実行してみましょう。
$ digdag push sample 2016-06-19 19:30:42 +0900: Digdag v0.8.1 Creating /Users/*****/*****/*****/*****/*****/digdag-client-sample/.digdag/tmp/archive-8890014483303325095.tar.gz... Archiving digdag-client-sample.dig Workflows: digdag-client-sample Uploaded: id: 1 name: sample revision: 07b7d3d0-6b77-4aab-88cf-0c66d461dd5d archive type: db project created at: 2016-06-19T10:30:43Z revision updated at: 2016-06-19T10:30:43Z Use `digdag workflows` to show all workflows.
これで登録できました。
登録したプロジェクトは下記のコマンドで確認することができます。
$ digdag workflows 2016-06-19 19:32:33 +0900: Digdag v0.8.1 sample digdag-client-sample Use `digdag workflows <project-name> <name>` to show details.
3行目にsampleと出ている階層がプロジェクト名に当たります。
そして4行目にずれて表示されるdigdag-client-sampleがワークフロー名として登録されていることが確認できます。
それでは登録したdigdag-client-sampleを実行してみましょう。
実行はstartコマンドを実行すると実行されます。
startコマンドは次のような構成になっています。
digdag start <プロジェクト名> <ワークフロー名> --session now
クライアント側からサーバーに登録しているsampleのdigdag-client-sampleを今すぐ実行するには次のように指定します。
sessionはいつ実行するかを指定することができます。
$ digdag start sample digdag-client-sample --session <hourly | daily | now | "yyyy-MM-dd[ HH:mm:ss]">
サーバ側の実行結果は次のようになります。
2016-06-19 19:36:25 +0900 [INFO] (XNIO-1 task-10): Starting a new session project id=1 workflow name=digdag-client-sample session_time=2016-06-19T10:36:25+00:00 2016-06-19 19:36:25 +0900 [INFO] (0039@+digdag-client-sample+task1): sh>: echo "hello task1" hello task1 2016-06-19 19:36:25 +0900 [INFO] (0039@+digdag-client-sample+task2): sh>: echo "hello task2" hello task2
task1、task2がそれぞれ実行されたのが確認できました。
最後に定期実行した場合などに失敗したのが無いか確認するためにクライアント側からログを確認することができます。
次のように実行すると確認することができます。
$ digdag sessions 2016-06-19 19:41:49 +0900: Digdag v0.8.1 Sessions: session id: 1 attempt id: 1 uuid: 4a8d1563-d0b3-43de-94f1-b6e899506e31 project: sample workflow: digdag-client-sample session time: 2016-06-19 10:36:25 +0000 retry attempt name: params: {} created at: 2016-06-19 19:36:25 +0900 kill requested: false status: success
参考
What’s Digdag? — Digdag 0.8 documentation