CentOS上でのAzkaban構築手順


CentOS上で動かすことを目標に設定を行います。
Azukaban 3.0系の構築を行います。
solo構成ではなく、Azkaban Executor ServerとAzkaban Web Serverの構成で構築います。
Azkaban Executor Serverを構築するサーバは、3G以上メモリがあるサーバを使用する必要があります。

<img width="573" alt="f553e9e6e60338cc95a2c0287594faeb.png" src="https://qiita-image-store.s3.amazonaws.com/0/17814/c6cb9355-9324-1672-0508-41529befdd1a.png">

Azkaban Web ServerはWeb UIを提供するサーバです。Jobの登録やスケジュール登録ができます。
Azkaban Executor Serverが、実際にジョブを実行するサーバです。



### 基本設定

最新版のバイナリは提供されていないため、ソースコードをビルドする必要が有ります。

#### JDKのインストール

OpenJDKのインストールのインストールを実施します。

```
sudo yum groupinstall -y "Development Tools"
sudo yum install -y java-1.7.0-openjdk.x86_64 java-1.7.0-openjdk-devel.x86_64 git-core mysql-connector-java
```

#### ビルド

gradlewを使って、ソースコードをbuildします。

```
git clone https://github.com/azkaban/azkaban.git
cd azkaban
./gradlew distZip
```

### MySQLをインストール

適当なサーバにデータストアとしてMySQLを構築します。
Azkaban Web ServerやAzkaban Executor Serverと同一のサーバに構築しなければいけないということはありません。

#### インストール

MySQLをインストールします。

```
yum install -y mysql-server
```

#### 設定

MySQLにAzukabanユーザの作成します。

```
/etc/init.d/mysqld start
mysql -uroot -p

mysql> CREATE DATABASE azkaban;
mysql> CREATE USER 'azkaban'@'%' IDENTIFIED BY 'azkaban';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON azkaban.* to 'azkaban'@'%' WITH GRANT OPTION;
```

azukabanのスクリプトを利用して必要なテーブル等の作成します。

```
$ cd azkaban/build/distributions/ 
$ zunip azkaban-sql-3.0.0.zip
$ cd azkaban-sql-3.0.0
$ mysql -uroot -p -Dazkaban < create-all-sql-3.0.0.sql
```

テーブルができてることの確認します。

```
$ mysql -uroot -p

mysql> use azkaban
mysql> show tables;
+------------------------+
| Tables_in_azkaban      |
+------------------------+
| active_executing_flows |
| active_sla             |
| execution_flows        |
| execution_jobs         |
| execution_logs         |
| executor_events        |
| executors              |
| project_events         |
| project_files          |
| project_flows          |
| project_permissions    |
| project_properties     |
| project_versions       |
| projects               |
| properties             |
| schedules              |
| triggers               |
+------------------------+
17 rows in set (0.00 sec)
```

これだけだと、Webサーバ起動時にエラーが発生するため以下のSQLも実行します。

```
mysql -uroot -p -Dazkaban < update.active_executing_flows.3.0.sql
mysql -uroot -p -Dazkaban < update.execution_flows.3.0.sql 
```

この2つのSQLを実行しないことで発生するエラーは、以下のとおりです。

```
Exception in thread "main" azkaban.executor.ExecutorManagerException: Error fetching active flows
        at azkaban.executor.JdbcExecutorLoader.fetchActiveFlows(JdbcExecutorLoader.java:216)
        at azkaban.executor.ExecutorManager.loadRunningFlows(ExecutorManager.java:431)
        at azkaban.executor.ExecutorManager.<init>(ExecutorManager.java:126)
        at azkaban.webapp.AzkabanWebServer.loadExecutorManager(AzkabanWebServer.java:261)
        at azkaban.webapp.AzkabanWebServer.<init>(AzkabanWebServer.java:197)
        at azkaban.webapp.AzkabanWebServer.main(AzkabanWebServer.java:739)
Caused by: java.sql.SQLException: Unknown column 'ex.executor_id' in 'on clause' Query: SELECT ex.exec_id exec_id, ex.enc_type enc_type, ex.flow_data flow_data, et.host host, et.port port, ax.update_time axUpdateTime, et.id executorId, et.active executorStatus FROM execution_flows ex INNER JOIN  active_executing_flows ax ON ex.exec_id = ax.exec_id INNER JOIN  executors et ON ex.executor_id = et.id Parameters: []
        at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:363)
        at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:350)
        at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:306)
        at azkaban.executor.JdbcExecutorLoader.fetchActiveFlows(JdbcExecutorLoader.java:212)
        ... 5 more
```


### Azkaban Web Serverの構築

ビルドしたファイルを持ってきて解凍します。

```
$ unzip azkaban-web-server-3.0.0.zip
$ cd azkaban-web-server-3.0.0
```


設定ファイルを変更します。
MySQLの設定、jettyのポート及びHTTPの接続許可、Azkaban Executor Serverの設定を行っています。
設定はドキュメントに記載のないものあるので、[ソースコード](https://github.com/azkaban/azkaban/blob/master/azkaban-webserver/src/main/java/azkaban/webapp/AzkabanWebServer.java#L626)を見た方が良いこともあります。

```
$ vim conf/azkaban.properties
$ diff conf/azkaban.properties ../../../azkaban-webserver/src/package/conf/azkaban.properties
7c7
< default.timezone.id=Asia/Tokyo
---
> default.timezone.id=America/Los_Angeles
19c19
< mysql.host=mysql-server
---
> mysql.host=localhost
31,32c31
< jetty.port=8080
< jetty.use.ssl=false
---
> jetty.port=8081
41d39
< executor.host=azkaban-executor1
```

### Azkaban Executor Serverの構築

ビルドしたファイルを持ってきて解凍します。

```
$ unzip azkaban-exec-server-3.0.0.zip
$ cd azkaban-exec-server-3.0.0
```

設定ファイルを変更します。

```
$ vim conf/azkaban.properties
$ diff conf/azkaban.properties ../../../azkaban-execserver/src/package/conf/azkaban.properties 
2c2
< default.timezone.id=Asia/Tokyo
---
> default.timezone.id=America/Los_Angeles
13,14c13,14
< mysql.host=mysql-server
< mysql.database=azkaban
---
> mysql.host=localhost
> mysql.database=azkaban2
30c30
< #executor.metric.milisecinterval.default=60000
---
> #executor.metric.milisecinterval.default=60000
\ ファイル末尾に改行がありません
```

接続確認用にMySQLを入れて確認します。

```
$ sudo yum install -y mysql
$ mysql -u azkaban -h mysql-server -p
```

### 起動

起動順は以下の順番で起動します。

1. MySQL
2. Azkaban Executor Server
3. Azkaban Web Server

起動時に利用するスクリプトがそれぞれのbinディレクトリ下に含まれているため、そのスクリプトを利用して起動します。

```
# Azkaban Executor Serverの起動
$ sudo ./bin/azkaban-executor-start.sh 
# Azkaban Web Server
$ sudo ./bin/azkaban-web-start.sh
```

#### ログイン

Webブラウザでアクセスすると、ログイン画面が確認できます。
ログイン可能なユーザは、conf/azkaban-users.xmlに書かれています。
デフォルトではazkaban/azkabanでログインできます。

<img width="1301" alt="azkaban.png" src="https://qiita-image-store.s3.amazonaws.com/0/17814/a27fc992-9c94-8d13-9a8d-1407ed8a4054.png">

ログイン後画面

<img width="1512" alt="azkaban_logined.png" src="https://qiita-image-store.s3.amazonaws.com/0/17814/3117ee7c-1ef2-892e-4580-5d54a5953399.png">


### 注意点

Executor Serverのメモリが少ない（3145728 kb以下）と、以下のようなログが出力されジョブが実行できないです。
なお、メモリのサイズは/proc/meminfoで[チェックして](https://github.com/azkaban/azkaban/blob/master/azkaban-common/src/main/java/azkaban/utils/SystemMemoryInfo.java#L65)います。

```
2016/04/01 08:48:09.271 +0000 INFO [command] [Azkaban] Submitting job 'command' to run.
2016/04/01 08:48:09.285 +0000 DEBUG [JmxJobMBeanManager] [Azkaban] *** got JOB_STARTED command azkaban.execapp.JobRunner status: QUEUED
2016/04/01 08:48:09.285 +0000 DEBUG [JmxJobMBeanManager] [Azkaban] *** got JOB_STARTED command azkaban.execapp.JobRunner status: QUEUED
2016/04/01 08:48:09.369 +0000 DEBUG [JmxJobMBeanManager] [Azkaban] *** got JOB_STATUS_CHANGED command azkaban.execapp.JobRunner status: RUNNING
2016/04/01 08:48:09.369 +0000 DEBUG [JmxJobMBeanManager] [Azkaban] *** got JOB_STATUS_CHANGED command azkaban.execapp.JobRunner status: RUNNING
2016/04/01 08:48:09.388 +0000 INFO [SystemMemoryInfo] [Azkaban] Free memory amount (1549400 kb) is less than low mem threshold (3145728 kb),  memory request declined.
2016/04/01 08:48:09.390 +0000 DEBUG [JmxJobMBeanManager] [Azkaban] *** got JOB_FINISHED command azkaban.execapp.JobRunner status: FAILED
2016/04/01 08:48:09.390 +0000 DEBUG [JmxJobMBeanManager] [Azkaban] *** got JOB_FINISHED command azkaban.execapp.JobRunner status: FAILED
2016/04/01 08:48:09.391 +0000 INFO [command] [Azkaban] Job command finished with status FAILED in 0 seconds
2016/04/01 08:48:09.391 +0000 INFO [command] [Azkaban] Setting command to FAILED_FINISHING
2016/04/01 08:48:09.392 +0000 INFO [command] [Azkaban] Setting flow '' status to FAILED in 0 seconds
2016/04/01 08:48:09.413 +0000 INFO [command] [Azkaban] Finishing up flow. Awaiting Termination
2016/04/01 08:48:09.423 +0000 INFO [command] [Azkaban] No attachment file for job command written.
2016/04/01 08:48:09.429 +0000 INFO [command] [Azkaban] Finished Flow
```