この記事について
- この記事はIBMが提供する製品に関する情報やナレッジを共有する Advent Calendar 2024の12月10日分として記載しています。
Datastage について
- Datastage は、いわゆるETLソフトウェアであり、データソースからデータをExtract、Transform、Load、する事を目的としたものです
- なお、ELT/TELの場合、内部ではdbtを使用しています
- 稼働環境としては、Software版とSaaS版があります
- Software版:Cloud Pak for Data (CP4D)上のソフトウェア・カートリッジとして稼働
- (従来のIISとしてのDatastageについてはここでは記載しません)
- SaaS版:IBM Cloud上のサービスとして稼働
- Software版:Cloud Pak for Data (CP4D)上のソフトウェア・カートリッジとして稼働
- サブルーチンの設定はSoftware版でもSaaS版でもできますが、今回はSoftware版(CP4D5.0.3)を使用しています
- なお、SaaS版Datastageの使い方については、こちらの記事で記載しています
実行前祝日判定サブルーチン について
-
DatastageはETL、つまり主にバッチジョブとして大量データを処理するソフトウェアとして稼働するものであり、決まった時間にタイマー起動する事が多い製品です
-
外部のスケジューラ(IWSやJP1等)からの呼び出しで起動することが多いのですが、Datastage自体にもスケジューラ機能は備わっています
-
Datastageのスケジューラを確認すると、実行の開始日/時間、終了日/時間、実行頻度、実行しない曜日、の設定はあるのですが、スケジューラでは祝日の設定をすることができません
- そこで、Datastageの実行前サブルーチンに祝日判定を組み込み、祝日であればその旨のメッセージを出力して終わる(異常終了)ように設定してみました
設定方法
祝日の取得方法
- 内閣府のデータから取得します
- コマンドとしては、以下のスクリプトを使用して、awkコマンドで1列目だけを取得し、2024年分のみgrepしています(しなくてもいいですが)
- 2列目以降を取得しないのは、2列目以降は文字化けしていて取り込むと文字ではなくバイナリ扱いされてうまく処理できない為です
export SHUKUJITU=`curl -sL https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv |awk -F',' '{print $1}'| grep 2024`
GUIでの設定方法
-
上記を踏まえて、サブルーチンに設定するテスト用の内容は以下です
-
内閣府から取得した祝日日付と本日日付を比較し、本日日付が祝日に該当した場合には処理を止める、という流れ担っています
-
以下内容では、テストの為に本日日付をべた書きで祝日に設定しています
#祝日リスト取り込み(最初にawkコマンドで1列目だけを取得する。2列目以降は文字化けしていて、取り込むと文字ではなくバイナリ扱いされてうまく処理できないので)
export SHUKUJITU=`curl -sL https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv |awk -F',' '{print $1}'| grep 2024`
#本日日付を取り込む。以下はわざと祝日日付を設定している
#export TODAY=`date '+%Y/%m/%d'`
export TODAY="2024/11/3"
#祝日判定フラグ。デフォルトでは平日としておく
export FLAG=weekday
# 以下、for文で祝日リストと本日日付の突き合わせを実施。本日が祝日リストの中に含まれる場合はフラグを祝日として変更。
# 日付は数字扱いではないので、-eq で判定せず、= を使う。
for list in $SHUKUJITU
do
if [ $list = $TODAY ];
then
FLAG=holiday
fi
done
echo "FLAG is"
echo $FLAG
#フラグが祝日の場合、異常終了する。(異常終了以外の終わり方がなさそう。。。)
if [ $FLAG = holiday ];
then
echo HOLIDAY_STOP
exit 1
else
echo WEEKDAY_ROUTINE
exit 0
fi
設定した、「HOLIDAY_STOP」の文言が確認できました
実行ログを抜き取ったものが以下です
1 2024-10-30 03:47:36 WARNING IIS-DSEE-TCOS-00051 <main_program> Failed to parse message handler entry, the message ID is not in an expected format like TFSR0114, or TFSR-00114, or IIS-DSEE-TFSR-00114. MessageId: HOLIDAY Action: demote2 2024-10-30 03:47:36 WARNING IIS-DSEE-TOSH-00395 BeforeJob (ExecSH): コマンドの実行中にエラーが発生しました: export SHUKUJITU=`curl -sL https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv |awk -F',' '{print $1}'| grep 2024`
#export TODAY=`date '+%Y/%m/%d'`
export TODAY="2024/11/3"
export FLAG=weekday
for list in $SHUKUJITU
do
if [ $list = $TODAY ];
then
FLAG=holiday
fi
done
echo "FLAG is"
echo $FLAG
if [ $FLAG = holiday ];
then
echo HOLIDAY_STOP
exit 1
else
echo WEEKDAY_ROUTINE
exit 0
fi3 2024-10-30 03:47:36 INFO IIS-DSEE-TOSH-00401 *** コマンドからの出力: ***
4 2024-10-30 03:47:36 INFO IIS-DSEE-TOSH-00402 FLAG is
holiday
HOLIDAY_STOP
5 2024-10-30 03:47:36 ERROR IIS-DSEE-TOSH-00409 ジョブが停止しました - ジョブ前処理ルーチンがエラーを返しました。エラー 1 が BEFORE ルーチンから返されました
さいごに
- このような形で祝日判定を処理前に組み込むことで、Datastage単体でも祝日に対応できます