SPSS CADSのジョブ履歴をModelerで分析する

CADSのジョブ履歴はDeployment Managerで確認することができますが、ジョブ実行についての詳しい分析を行う場合はCADSレポジトリ内のジョブ履歴 [SPSSPLAT_V_JOBHISTORY](https://www.ibm.com/docs/ja/sc-and-ds/8.6.0?topic=views-job-history-spssplat-v-jobhistory)のVIEWを直接見る必要があります。

このSPSSPLAT_V_JOBHISTORYにSPSS Modelerで接続をしてジョブの分析を行う例を紹介します。

* テスト環境
    * CADS 8.4　（レポジトリDb2）
    * Modeler 18.6
    * Windows 11
* サンプルストリーム

https://github.com/hkwd/spsssample/raw/refs/heads/master/250422SPSSPLAT_V_JOBHISTORY/SPSSPLAT_V_JOBHISTORY2.str

# ODBC DSNの設定
まず、ODBCのDSNの設定を行います。

ODBCデータソースを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4273d512-f150-4157-8fca-197bcdbd30ef.png)

システムDSNやユーザーDSNで「追加」をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/214f5b2c-c967-47f6-ae47-14f1f1eeb9c3.png)

Db2のODBCドライバーを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6a9b4bf1-f0e6-48ae-96ee-3ad4491d123c.png)


データソース名に任意の名前を付けます（ここではCADSDB）。「追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/cc6e4f04-140e-4335-a934-a61ae742c16b.png)

「TCP/IP」タブで以下を入力し、OKで閉じます。
データベース名:`SPSSCDS`
ホスト名: CADSのレポジトリDBのホスト名
ポート番号: CADSのレポジトリDBのポート番号。デフォルトは`25000`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/20546cb8-86c6-4331-9acb-f68f63e1bce7.png)

出来上がったCADSDBをダブルクリックして開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8f5fca06-ade4-4c9d-8eb7-17721696863c.png)

ユーザーとパスワードを入力して「接続」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1f820d36-bfbc-472f-b3c5-9a08e1ab3bf9.png)

テストがうまくいきました。すべてOKでODBCデーソースの設定を閉じておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fcdb21c1-3214-4beb-8b41-095c45816a06.png)

# データソースへの接続
データベース接続ノードを選び、データソースから「新規データベース接続の追加」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9516d547-69cc-4695-b1db-ba38143e3a30.png)

CADSのデータソースを選び、ユーザーとパスワードを入力して「接続」をクリックします。そして接続を選んでOKで閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0aae9305-dc91-434a-8de2-d6ce6b1d11fc.png)


# SPSSPLAT_V_JOBHISTORYからのSELECT
SPSSPLAT_V_JOBHISTORYにはCLOB列があり、テーブルモードだとエラーになります。また、EXECUTIONIDなどはBINARYのため表示も化けてしまいます。
そのため「SQLクエリー」のモードでCLOB列はVARCHAR(255)にCASTし、バイナリデータはHEXで変換したSQLを書きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a0eb9451-cfbc-466e-8b67-6dc982dd3f83.png)

```sql
SELECT HEX(T0.EXECUTIONID) AS EXECUTIONID,
HEX(T0.JOBID) AS JOBID,
T0.JOBVERSION AS JOBVERSION,
T0.JOBNAME AS JOBNAME,
T0.JOBPATH AS JOBPATH,
T0.JOBMARKER AS JOBMARKER,
T0.JOBLABEL AS JOBLABEL,
HEX(T0.JOBSTEPID) AS JOBSTEPID,
T0.JOBSTEPNAME AS JOBSTEPNAME,
T0.JOBSTEPEXECUTIONSTATUS AS JOBSTEPEXECUTIONSTATUS,
T0.JOBSTEPEXECUTIONSTARTED AS JOBSTEPEXECUTIONSTARTED,
T0.JOBSTEPEXECUTIONENDED AS JOBSTEPEXECUTIONENDED,
T0.JOBSTEPEXECUTIONRUNTIME AS JOBSTEPEXECUTIONRUNTIME,
T0.JOBEXECUTIONSTATUS AS JOBEXECUTIONSTATUS,
T0.JOBEXECUTIONSTARTED AS JOBEXECUTIONSTARTED,
T0.JOBEXECUTIONENDED AS JOBEXECUTIONENDED,
T0.JOBEXECUTIONRUNTIME AS JOBEXECUTIONRUNTIME,
CAST(T0.JOBSTEPERRORLOG as VARCHAR(255)) AS JOBSTEPERRORLOG,
T0.JOBCLUSTERQUEUEDDATETIME AS JOBCLUSTERQUEUEDDATETIME,
T0.JOBCLUSTERCOMPLETIONCODE AS JOBCLUSTERCOMPLETIONCODE,
T0.JOBCLUSTERAPPLICATIONSTATUS AS JOBCLUSTERAPPLICATIONSTATUS,
T0.JOBPROCESSID AS JOBPROCESSID,
CAST(T0.JOBEXECUTEDPARAMETERS as VARCHAR(255)) AS JOBEXECUTEDPARAMETERS,
T0.JOBNOTIFICATIONENABLED AS JOBNOTIFICATIONENABLED 
FROM DB2ADMIN."SPSSPLAT_V_JOBHISTORY" T0
```
これでSELECTができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fa573464-c29f-4066-b178-c4a19ecc9096.png)


各列の意味とサンプルデータは以下です。


| 列名                        | 説明                                                                                                                                             | サンプル                                                                                                                                          | 
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | 
| EXECUTIONID                 | ジョブステップの実行ID。ジョブ実行のIDではない                                                                                                   | A82F5CD4E1CAE43200000195F9F5584067B8                                                                                                              | 
| JOBID                       | ジョブのID。ジョブ実行のIDではない                                                                                                               | A82F5CD4E1CAE43200000195F9F5584036C8                                                                                                              | 
| JOBVERSION                  | ジョブのバージョン                                                                                                                               | 2                                                                                                                                     | 
| JOBNAME                     | ジョブ名                                                                                                                                         | 250411_1min+1minexec                                                                                                                              | 
| JOBPATH                     | ジョブの存在するレポジトリ内のパス                                                                                                               | /開発用/test/XXXX/250411_1minexec/                                                                                                                | 
| JOBMARKER                   | ジョブのバージョンと更新日                                                                                                                       | 2:2025-04-22 01:17:52.735                                                                                                                         | 
| JOBLABEL                    | ジョブのラベル                                                                                                                                   | LATEST                                                                                                                                            | 
| JOBSTEPID                   | ジョブステップのID。ジョブステップ実行のIDではない。                                                                                             | A82F5CD4E1CAE43200000195F9F5584036DF                                                                                                              | 
| JOBSTEPNAME                 | ジョブステップの名前                                                                                                                             | wait                                                                                                                                              | 
| JOBSTEPEXECUTIONSTATUS      | ジョブステップの結果ステータス。１は成功。０が失敗                                                                                               | 1                                                                                                                                                 | 
| JOBSTEPEXECUTIONSTARTED     | ジョブステップの開始日時                                                                                                                         | 2025/4/23 1:29                                                                                                                                    | 
| JOBSTEPEXECUTIONENDED       | ジョブステップの終了日時                                                                                                                         | 2025/4/23 1:31                                                                                                                                    | 
| JOBSTEPEXECUTIONRUNTIME     | ジョブステップの実行時間。日-時-分-秒をコンカチした整数                                                                                          | 200                                                                                                                                               | 
| JOBEXECUTIONSTATUS          | ジョブ全体の結果ステータス。１は成功。０が失敗                                                                                                   | 1                                                                                                                                                 | 
| JOBEXECUTIONSTARTED         | ジョブ全体の開始日時。                                                                                                                             | 2025/4/23 1:29                                                                                                                                    | 
| JOBEXECUTIONENDED           | ジョブ全体の終了日時                                                                                                                             | 2025/4/23 1:32                                                                                                                                    | 
| JOBEXECUTIONRUNTIME         | ジョブの実行時間。日-時-分-秒をコンカチした整数                                                                                                  | 324                                                                                                                                               | 
| JOBSTEPERRORLOG             | ジョブステップのログ                                                                                                                             | `--- PRMS ---<br> ping -n 121 localhost>nul<br> プロセスが強制終了されました。終了コードは 0 です。<br> --- STDOUT ---<br> --- STDERR ---         | 
| JOBCLUSTERQUEUEDDATETIME    | ジョブのキューされた日時                                                                                                                         | 2025/4/23 1:29                                                                                                                                    | 
| JOBCLUSTERCOMPLETIONCODE    | ジョブの完了コード。0が成功                                                                                                                      | 0                                                                                                                                                 | 
| JOBCLUSTERAPPLICATIONSTATUS | ジョブ・タイプ別の、ジョブ・ステータスに対応する文字列値。いつもNULLだった。                                                                     |                                                                                                                                                   | 
| JOBPROCESSID                | ジョブ・タイプ別の、システム・プロセスに対応する ID。例えば、実行中の実行可能ファイルのオペレーティング・システム・プロセス ID。いつもNULLだった |                                                                                                                                                   | 
| JOBEXECUTEDPARAMETERS       | 使用されていないとのことだったがジョブ変数が入るようだった                                                                                       | `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><jobVariableList xmlns="http://xml.spss.com/prms"><name>scheduled</name></jobVariableList>` | 
| JOBNOTIFICATIONENABLED      | ジョブに対して通知が有効かどうかを示します。                                                                                                     | 1                                                                                                                                                 | 
|                             | 

JOBSTEP毎に一行ありますが、ジョブ全体の情報もでています。
以下のようなwaitというジョブステップとmin1.str_stepというジョブステップがあった場合、waitで2分、min1.str_stepで1分30秒、ジョブ全体としては3分25秒かかっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/03688dd0-cacf-4d4d-bb8c-5cedcbfe9e2b.png)


SPSSPLAT_V_JOBHISTORYから取得した結果を並べると以下のようになります。
JOBEXECUTIONRUNTIMEがジョブ全体の実行時間で、JOBSTEPEXECUTIONRUNTIMEがジョブステップの実行時間です。
ちょっと特殊な数値データで日-時-分-秒をコンカチした整数になっています。325は3分25秒をあらわしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e08b4287-0be2-4720-b165-e2c213d2ddc9.png)

ちょっとこのJOBEXECUTIONRUNTIMEやJOBSTEPEXECUTIONRUNTIMEの数値が特殊で、演算をしにくいので以下のように秒に変換もしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2a267ea2-1fce-41db-9b33-a08c9a24fb2d.png)
```java:秒変換のclem式
@FIELD rem 100 +
(@FIELD div 100 rem 100) *60 +
(@FIELD div 10000 rem 100) *60*60 +
(@FIELD div 1000000) *60*60*24
```

# 分析例
## 実行回数の多いジョブランキング
JOBNAMEをキーにRecord_Countをとって多い順に並べています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9f08441e-8927-490d-bedb-46ea433ee0bc.png)

![{ACDE4BEA-2ACA-43B9-905E-99DDC72FBB15}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f6a06003-3f06-4b0c-8897-deec7f8064f7.png)

## ジョブ実行回数の多い日ランキング
JOBEXECUTIONSTARTEDをto_dateで日付にして、それをキーにRecord_Countをとって多い順に並べています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/31097311-142b-4f74-a21b-6ced313247dd.png)

![{7104B41E-7064-4E96-A85C-46A3D3C00B47}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/96f5d0f7-393f-4fb9-a579-0a3f525d0e31.png)

## 平均実行時間の長いジョブランキング
JOBNAMEをキーにJOBEXECUTIONRUNTIME_SECの平均をとって、その大きい順に並べています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/44b97d16-89c3-4ee6-9ef8-410119f80555.png)

![{25B21536-8A37-42CE-9382-A46F2BC38524}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/86e9d0a0-cf02-47ca-85e4-11751b134a1b.png)

## 特定ジョブの実行時間の時系列グラフ
JOBNAMEで特定ジョブに絞り込み、フィルターノードでJOBレベルの主な項目を選んでいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9aec7a8f-e6de-4765-8b31-7460fda123f6.png)

ジョブステップが複数あるとジョブ実行だけで1レコードにならないので、重複レコードノードでJOBIDとJOBEXECUTIONSTARTEDをキーに重複を排除しています。
時系列ノードでJOBEXECUTIONRUNTIME_SECを縦軸に表示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/80cd1aae-982a-498d-a05c-7bd349d0163f.png)
![{4A080193-14A3-4544-A461-BB9AD8395B0D}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/566f2717-e125-4797-86c3-a6f264206d20.png)


# 参考
#### SPSSPLAT_V_JOBHISTORY

https://www.ibm.com/docs/ja/sc-and-ds/8.6.0?topic=views-job-history-spssplat-v-jobhistory