Azkabanを使って依存関係のあるジョブの管理を行う(インストール編)

こんにちは、高橋@SSTDです。 複数のサービス間でデータ連携したりするには、データフローの中に必ずバッチ処理が必要となります。 これは、ビッグデータを扱う際にも同様で、全ての処理をリアルタイムに行うことは残念ながら難しく、Hadoop等の大規模分散処理を得意とするバッチ処理型ツールを用いて、データの正規化等を行う必要がでてきます。 このようなシステムの運用を行うときには、依存関係が複雑になってしまい、バッチ処理のエラーハンドリングやエラー通知、障害発生時のリトライが非常に重要となります。 この問題を解決するために、linkedin社が中心に開発を進めているオープンソースのジョブ管理システムAzkabanについて、今回はご紹介します。

1. Azkabanとは

Azkabanとは、バッチ処理のワークフローをWeb UIでスケジュール管理可能にしたシンプルなツールです。 依存関係のあるJobのフローを管理したり、それらのJobのリトライやエラー通知、実行ログの表示などを標準で提供しています。 元々、Hadoopを対象としたツールのため、HiveやPigへの処理を一連のジョブの中に組み込むことができます。 また、シェルの起動も行えるため、tdコマンドをシェルとして組み込むことで、TreasureData上の処理のワークフロー管理にも利用できます(それがしたいので触っています!)。

2. Azkaban 導入編

今回の記事では、Azkabanをインストールし、二つのジョブを設定するところまでを紹介していきます。

2.1. 動作環境

動作環境は下記になります。
  • Azkaban 2.6.2
  • Amazon Linux
  • OpenJDK 1.7.0

2.2. Azkabanのインストールと起動


  # Gitを使うのでまとめてインストール
  $ yum groupinstall "Development Tools"

  # JDKのインストール
  $ yum install java-1.7.0-openjdk-devel.x86_64

  # azkabanのgitから最新版を取得
  $ git clone https://github.com/azkaban/azkaban.git
  $ cd azkaban/

  # gradleでビルド
  $ ./gradlew distZip

  # azkaban solo serverを展開
  $ cd build/distributions/
  $ unzip azkaban-solo-server-2.6.2.zip

  # azkaban solo serverを起動
  $ cd azkaban-solo-server-2.6.2
  $ ./bin/azkaban-solo-start.sh

また、デフォルトのアクセス用のポートには、Port8081番を開けておきます。

2.3. Web UIへのアクセス

2.2節までで起動ができていますので、AzkabanのWebUIにアクセスします。 下記URLにアクセスしてみましょう。

http://'OWN_IP_ADDRESS':8081/

デフォルトのユーザ名とパスワードは下記になります。

  • ユーザ名: "azkaban"
  • パスワード: "azkaban"

WebUIにアクセスをすることができましたが、この状態では何もすることができません。 Azkabanでは、どんなJobを発行するかをWeb上で編集したりすることができず、 ローカルで作成したジョブの定義ファイルをプロジェクトにアップロードして設定する必要が有ります。

2.4. 新規プロジェクトの作成

Create Projectを押下し、新規でプロジェクトを作成してみます。Create Projectを押下すると、ファイルのアップロードを促されます。 ここでは、Projectに登録する.jobファイルをZipで圧縮したファイルをアップロードします。 そのため、事前に2.5.節で紹介する二つのファイルを作成しておき、zip圧縮で1つのファイルにまとめておきましょう。

参考: http://azkaban.github.io/azkaban/docs/2.5/#create-projects

2.5. Jobのワークフローの作成

プロジェクトを作成するためには、Zipファイルをアップロードする必要が有ります。 そのためにはここで紹介するワークフローを事前にローカルで作成しておきます。

参考: http://azkaban.github.io/azkaban/docs/2.5/#creating-flows

まずは、foo.jobファイルをローカルで作成します。ここでは、Hello Worldをechoで表示させる処理を登録しています。


# foo.job
type=command
command=echo "Hello World"

次に、foo.jobの後に実行されるbar.jobファイルを作成します。 dependenciesを使うことで、foo.jobが実行された後にbarを実行するという依存関係を記述しています。


# bar.job
type=command
dependencies=foo
command=echo bar

foo.jobとbar.jobをzipで圧縮し、アップロードをすると下記の通りに二つのジョブが表示されます。

ジョブ全体のExecute Flowを表示させると下記の通りにfooの後にbarが実行されるという依存関係を可視化させることができます。

個々のジョブ内容を確認します。

foo.jobでは、echo "Hello World"が実行されることが分かります。

bar.jobでは、fooの後にecho barが実行されることが分かります。

2.6. ワークフローの実行

登録したプロジェクトのワークフローを実行します。成功すると個々のジョブが緑色で表示されます。

実行後にはそれぞれのジョブが実行されたタイミングや実行時間などがログとして表示されます。

またその他にも詳細なコマンドの実行履歴も参照することが可能です。

3. おわりに

依存関係のあるジョブをどのように楽に運用するかは、ビッグデータの分析基盤を考える上でも重要な要素となってきます。 ワークフローを管理するソフトウェアは、TalendなどのETLツールなどもありますが、もっと簡便に扱えるようなツールの一つとして、 Azkabanを使うこともできるのではないでしょうか。 今後はメール通知やリトライ方法などについてもまとめていきたいと思います。

以上。

執筆:髙橋@SSTD