Digdag server を Supervisor で管理する

Posted on

最近 Treasure Data のワークフローエンジン「Digdag」をさわり始めました。

Digdag server はフォアグラウンドで起動するだけなので、Supervisor で管理できるようにしてみました。 Supervisor を使うことで、自動起動やログの取得などプロセス管理が楽になります。

検証した環境は Ubuntu 14.04 LTS です。

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.3 LTS"

Supervisor のインストール

まず Supervisor をインストールします。 Ubuntu だとパッケージが用意されています。

$ sudo apt-get install supervisor

インストールすると自動的に立ち上がっていました。

$ ps aux | grep supervisor
root      1430  0.0  1.1  53656 11252 ?        Ss   21:35   0:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf

Oracle Java のインストール

Digdag は Java で書かれているので、先に JRE をインストールします。 Java 8u72 以降のバージョンが必要なので Oracle Java をインストールします(Ubuntu 14.04 の場合、apt-get でインストールできる OpenJDK は Java 7 です)。

$ cd /opt
$ sudo tar xvf ~/jre-8u102-linux-x64.tar.gz
$ sudo chown -R root:root jre1.8.0_102
$ sudo ln -s jre1.8.0_102 jre

/opt/jre/bin に PATH を通しておきます。

$ export PATH=$PATH:/opt/jre/bin
$ java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

Digdag のインストール

Digdag のインストールは公式ドキュメントの通りです。ダウンロードしているのは digdag-<VERSION>.jar という jar ファイルです。

$ sudo curl -o /usr/local/bin/digdag --create-dirs -L https://dl.digdag.io/digdag-latest
$ sudo chmod +x /usr/local/bin/digdag

digdag server で起動してみます。

$ digdag server --memory
2016-08-17 12:19:39 +0000: Digdag v0.8.8
2016-08-17 12:19:41 +0000 [INFO] (main): Starting server on 127.0.0.1:65432
2016-08-17 12:19:41 +0000 [INFO] (main): XNIO version 3.3.3.Final
2016-08-17 12:19:41 +0000 [INFO] (main): XNIO NIO Implementation Version 3.3.3.Final
2016-08-17 12:19:41 +0000 [INFO] (main): Bound on /127.0.0.1:65432

フォアグラウンドで立ち上がりました。これを Supervisor で管理できるようにします。

Supervisor の設定

Supervisor の設定をします。パッケージでインストールした場合は /etc/supervisor/conf.d が作られているので、その下にサービス単位の conf ファイルを作ると良いでしょう。

$ cat /etc/supervisor/conf.d/digdag.conf
[program:digdag]
command=/usr/local/bin/exec-digdag.sh
stdout_logfile=/var/log/supervisor/digdag-stdout.log
stderr_logfile=/var/log/supervisor/digdag-stderr.log

commanddigdag server と書いてもいいのですが、今回は PATH を通したいので起動用のシェルスクリプトを用意します。

$ cat /usr/local/bin/exec-digdag.sh
#!/bin/sh
export PATH=$PATH:/opt/jre/bin
exec /usr/local/bin/digdag server --memory

最後の exec コマンドを忘れると Supervisor で Java プロセスが制御できなくなります。これで数時間ハマりました…。

この起動用スクリプトにも忘れずに実行権限を付けておきます。

$ sudo chmod +x /usr/local/bin/exec-digdag.sh

これで準備完了です。 Supervisor を再起動すれば Digdag も立ち上がります。

$ sudo service supervisor restart
$ sudo supervisorctl
digdag                           RUNNING    pid 1571, uptime 0:11:56

pstree で確認すればプロセスの親子関係がよくわかります。

$ pstree -p 1570 --ascii
supervisord(1570)---java(1571)-+-{java}(1572)
                               |-{java}(1573)
                               |-{java}(1574)
                               |-{java}(1575)
                               |-{java}(1576)
                               |-{java}(1577)
                               |-{java}(1578)
                               |-{java}(1579)
                               |-{java}(1580)
                               |-{java}(1582)
                               |-{java}(1583)
                               |-{java}(1584)
                               |-{java}(1585)
                               |-{java}(1586)
                               |-{java}(1587)
                               |-{java}(1588)
                               |-{java}(1589)
                               `-{java}(1590)

Digdag を停止するときは supervisorctl を使います。

$ sudo supervisorctl stop digdag
digdag: stopped

まとめ

Digdag を本格的に使い始める前に Supervisor を導入するのが良さそうです。