PDIでのバッチ実行の方法まとめ

PDIは手元で実行する際にはSpoonでそのまま実行することが多いのですが、バッチ的にCronやタスクスケジューラーで実行したいという質問をよくされるので、まとめておきました。

# バッチ実行用のスクリプト
PDIには、バッチ実行用に2つのスクリプトがあらかじめ用意されています。
以下の2種類です。

- pan.sh (Windowsの場合はPan.bat)
- kitchen.sh (Windownsの場合はKitchen.bat)

PDIには2つの設定形式(JOBとTransformation)があるのですが、それぞれpan系がTransformationに、kitchen系がJOBに対応しています。
つまり、Transformationを実行する場合にはpan系のスクリプトを、JOBを実行する場合にはkitchen系のスクリプトを使用するわけです。

※Transformationはデータを抽出してきて変換してロードするまでのいわゆるETL処理を実行するもので、JOBはそれらTransformationをまとめて実行するためのものです。JOBを使用すると、先行のTransformation処理が成功すればTransformation2、失敗すればTransformation3など、処理の流れを設定することができます。それ以外にも特定ファイルがあれば特定のTransformationを実行するなども可能です。

# panの実行
まずはそのまま実行してみます。するとしばらくしてヘルプが表示されます。

```
# cd data-integration (※PDIのインストールディレクトリ)
# ./pan.sh
：
：
Options:
  -rep            = リポジトリ名
  -user           = リポジトリユーザ名
  -pass           = リポジトリパスワード
  -trans          = 起動するトランスフォーメーション名
  -dir            = ディレクトリー (/の追記が必要)
  -file           = The filename (Transformation in XML) to launch
  -level          = ログレベル(Basic, Detailed, Debug, Rowlevel, Error, Minimal, Nothing)
  -logfile        = 書き出すためのロギングファイル
  -listdir        = リポジトリ内のディレクトリを表示します。
  -listtrans      = 指定されたディレクトリのトランスフォーメーションを表示します。
  -listrep        = 利用可能なリポジトリを表示します。
  -exprep         = 全てのリポジトリオブジェクトをひとつのXMLファイルにエクスポートします。
  -norep          = リポジトリにロギングしません。
  -safemode       = セーフモードで起動します。
  -version        = show the version, revision and build date
  -param          = パラメータ <NAME>Pan.ComdLine.Version=バージョン、更新、作成日時表示
  -listparam      = 指定されたトランスフォーメーションで定義されたパラメータ情報を表示します。
  -metrics        = Gather metrics during execution
  -maxloglines    = 内部的に保持されるログの最大行数を指定します。 0（デフォルト）に設定するとすべての行を保持します。
  -maxlogtimeout  = 内部的に保持されるログの最大有効期間（分）を指定します。0（デフォルト）に設定すると無制限となります。

```

リポジトリ名(rep)、ユーザ名(user)、パスワード(pass)、ディレクトリ(dir)、トランスフォーメーション名(trans)はリポジトリを使用している場合に設定します。
※PDIのリポジトリについては、[こちら](https://qiita.com/mik/items/2cea8cdb24d089d29a55)をご確認ください。

```
# ./pan.sh -rep localhost -user admin -pass password -dir /home/admin -trans test
：
：
2018/05/02 10:51:25 - Pan - 実行開始
2018/05/02 10:51:25 - RepositoriesMeta - Reading repositories XML file: /Users/michi/.kettle/repositories.xml
2018/05/02 10:51:25 - PurRepositoryConnector - Creating security provider
2018/05/02 10:51:25 - PurRepositoryConnector - Creating repository web service
2018/05/02 10:51:25 - PurRepositoryConnector - Creating repository sync web service
May 02, 2018 10:51:25 AM com.sun.xml.ws.api.streaming.XMLStreamReaderFactory$Woodstox <init>
警告: Expected property not found in Woodstox input factory: {0}
2018/05/02 10:51:26 - PurRepositoryConnector - Repository web service created
2018/05/02 10:51:26 - PurRepositoryConnector - Creating unified repository to web service adapter
2018/05/02 10:51:26 - PurRepositoryConnector - Synchronizing repository web service
2018/05/02 10:51:26 - PurRepositoryConnector - Security provider created
2018/05/02 10:51:27 - PurRepositoryConnector - Registering security provider
2018/05/02 10:51:27 - PurRepositoryConnector - Repository services registered
2018/05/02 10:51:27 - PurRepository - Creating repository meta store interface
2018/05/02 10:51:27 - PurRepository - Connected to the enterprise repository
2018/05/02 10:51:27 - test - Dispatching started for transformation [test]
2018/05/02 10:51:27 - データグリッド.0 - 処理を終了 (I=0, O=0, R=0, W=1, U=0, E=0)
2018/05/02 10:51:27 - Pan - 終了しました。
2018/05/02 10:51:27 - Pan - 開始Pan.ComdLine.XMLTransFile=起動するファイル名（XML内のトランスフォーメーションファイル）
2018/05/02 10:51:27 - Pan - 2秒後にプロセスを終了します。
2018/05/02 10:51:27 - test -
2018/05/02 10:51:27 - test - Step データグリッド.0 ended successfully, processed 1 lines. ( 0 lines/s)

```

リポジトリを使用せずにファイルベース(.ktrファイル)で実行する場合には、リポジトリの設定は行わずにファイル名(file)で指定します。

```
# ./pan.sh -file test.ktr
：
：
2018/05/02 10:54:02 - Pan - 実行開始
2018/05/02 10:54:02 - test - Dispatching started for transformation [test]
2018/05/02 10:54:02 - データグリッド.0 - 処理を終了 (I=0, O=0, R=0, W=1, U=0, E=0)
2018/05/02 10:54:02 - Pan - 終了しました。
2018/05/02 10:54:02 - Pan - 開始Pan.ComdLine.XMLTransFile=起動するファイル名（XML内のトランスフォーメーションファイル）
2018/05/02 10:54:02 - Pan - 0秒後にプロセスを終了します。
2018/05/02 10:54:02 - test -
2018/05/02 10:54:02 - test - Step データグリッド.0 ended successfully, processed 1 lines. ( - lines/s)

```

あと良く使う設定としては、ログ系の設定とパラメータ系の設定です。
以下は、パラメータ"Year"に2018を、"Month"に05を設定し、実行ログをログレベル"Basic"で"test.log"に出力するように実行した場合の例です。
パラメータが設定されているか確認するために、パラメータをログに出力するようにしています。

```
# ./pan.sh -file test.ktr -param Year=2018 -param Month=05 -level Basic -logfile test.log
：
：
2018/05/02 11:27:28 - Pan - レベル: 基本のログでログ出力をいたします。
2018/05/02 11:27:28 - Pan - 実行開始
2018/05/02 11:27:28 - test - Dispatching started for transformation [test]
2018/05/02 11:27:28 - データグリッド.0 - 処理を終了 (I=0, O=0, R=0, W=1, U=0, E=0)
2018/05/02 11:27:28 - ログ書き込み.0 -
2018/05/02 11:27:28 - ログ書き込み.0 - ------------> Linenr 1------------------------------
2018/05/02 11:27:28 - ログ書き込み.0 - Year = 2018
2018/05/02 11:27:28 - ログ書き込み.0 - Month = 05
2018/05/02 11:27:28 - ログ書き込み.0 -
2018/05/02 11:27:28 - ログ書き込み.0 - a = 1
2018/05/02 11:27:28 - ログ書き込み.0 -
2018/05/02 11:27:28 - ログ書き込み.0 - ====================
2018/05/02 11:27:28 - ログ書き込み.0 - 処理を終了 (I=0, O=0, R=1, W=1, U=0, E=0)
2018/05/02 11:27:28 - Pan - 終了しました。
2018/05/02 11:27:28 - Pan - 開始Pan.ComdLine.XMLTransFile=起動するファイル名（XML内のトランスフォーメーションファイル）
2018/05/02 11:27:28 - Pan - 0秒後にプロセスを終了します。
2018/05/02 11:27:28 - test -
2018/05/02 11:27:28 - test - Step データグリッド.0 ended successfully, processed 1 lines. ( - lines/s)
2018/05/02 11:27:28 - test - Step ログ書き込み.0 ended successfully, processed 1 lines. ( - lines/s)

```

こんな感じで実行することが可能です。
Cronやタスクスケジューラーで実行する場合は、そのまま上記のコマンドラインを実行するように設定するか、一度別のスクリプトやバッチファイルでラップしてから、そのスクリプトを実行するように設定する感じになります。

kitchen.shも大体同じ感じなのでここでは割愛します。
詳細は、[Pentaho公式ドキュメント](https://help.pentaho.com/Documentation/8.0/Products/Data_Integration/Command_Line_Tools)をご確認ください。
実行後に返却されるステータスコードなども記載されています。