techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

ワークフローエンジン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

サンプルコード

github.com