【OSSワークフローシステム】Digdagについてまとめる

Digdagの概要

OSSのワークフローシステムの一つ。Airflow同様、スケジューリングやモニタリングのプラットフォームとして、データ基盤のETL処理で使われることが多い。

AirflowほどUIは作り込まれておらず、結構シンプルな構造になっている。

【OSSワークフローシステム】Airflowについてまとめる

主に以下の用途で使われることが多い。

  • ジョブの分散処理、依存関係処理
  • yamlでの処理定義ができる
  • ログ管理が可能

メリット

  • yamlでの定義のため人によっては楽(好みの問題)
  • 機能的にはAirflowでできることは大体できる印象
  • Airflowよりシンプルな記述ができる

デメリット

  • yamlファイルが量産されて、管理が大変
  • javaのバージョンに指定あり(8or11)
  • AirflowほどUIは作り込まれていない
  • フルマネージドにしたいときには、GCPの他のツール(cloud runやRDS等)を組み合わせて構築する必要があり、工数がかかる

 

環境構築して動かしてみる

環境

  • MacOS
  • java 8
  • Digdag 0.10.3

※Digdagはjavaのバージョンが8か11じゃないと動かない。ほとんどの人がバージョンを切り替えないといけない且つ躓きやすいポイントなので、その方法も記載する。

現状ダウンロードされているjavaのバージョン確認

/usr/libexec/java_home -V
※openjdk 17 18がダウンロードされている

javaのバージョン管理できるモジュールをインストール

brew install homebrew/cask-versions/java-beta --cask

jdk8をインストール

brew install --cask adoptopenjdk8 

javaのPATHをjdk8に変更する

./zshrcもしくは./bashrcに追記する

export JAVA_HOME=`/usr/libexec/java_home -v "1.8"`
export PATH="$PATH:${JAVA_HOME}/bin"

javaのバージョンを確認する

java -version

以下より公式ドキュメントを参照して進める。

http://docs.digdag.io/getting_started.html#downloading-the-latest-version

digdagをインストール

curl -o ~/bin/digdag --create-dirs -L "https://dl.digdag.io/digdag-latest"
chmod +x ~/bin/digdag

サンプルのワークフローを作成する

mkdir digdag
digdag init mydag
cd mydag
digdag run mydag.dig

ブラウザから動かしてみる

digdag server -o ./ -n 8081

※カレントディレクトリ(/digdag/をdatabaseに指定)

http://localhost:8081/

にアクセスし、digdagのブラウザを表示。最初はプロジェクトが何もない状態になっているはず。

GUIから操作することも可能だが、面倒なのでコマンドでmydag.digをpushする。

digdag push mydag -e localhost:8081

「mydag」という名前でプロジェクトとワークフローが作成される。右上の「RUN」をクリックすると、yaml定義のワークフローが実行され、sessionsに追加される。

サンプルのyamlファイルの中身

  1. 開始のsession_timeの表示
  2. 時刻表示
  3. 配列[first, second, third]と配列[dog, cat]の二つをランダムに組み合わせてループで表示
  4. 終了のsession_timeの表示
timezone: UTC

+setup:
  echo>: start ${session_time}

+disp_current_date:
  echo>: ${moment(session_time).utc().format('YYYY-MM-DD HH:mm:ss Z')}

+repeat:
  for_each>:
    order: [first, second, third]
    animal: [dog, cat]
  _do:
    echo>: ${order} ${animal}
  _parallel: true

+teardown:
  echo>: finish ${session_time}