このトピックでは、スケジューリングパラメーターに関するよくある質問とその回答を記載します。
-
代表的なユースケース
-
テストとトラブルシューティング
-
実行モードによる値割り当てロジックの違い
-
運用とモニタリング
前時間のデータを取得する際の日またぎパラメーター置換の処理方法
-
問題の説明
テーブルパーティションのフォーマットは day=yyyymmdd,hour=hh24 です。実行時に、時間は前の時間のデータを取得します。パラメーター $[yyyymmdd] $[hh24-1/24] はこの要件を満たせますが、深夜 00:00 になると、時間が当日の 23:00 になってしまいます。これをどのように処理すればよいですか。
-
解決策
パラメーターの計算式を変更することで対応できます。datetime を $[yyyymmdd-1/24] に設定します。hour の計算式は $[hh24-1/24] のままです。
設定の説明
-
コードで、
day=datetime, hour={hour},を設定します。 -
ノードのスケジューリングパラメーターを割り当てます:
datetime=[yyyymmdd-1/24],hour=[hh24-1/24]
例
-
インスタンスのスケジュール時刻が 2021-7-21 00:00:00 の場合、1 時間を引くと前日になります。この場合、$[yyyymmdd-1/24] は 20210720 と評価され、$[hh24-1/24] は 23 と評価されます。
-
インスタンスのスケジュール時刻が 2021-7-21 01:00:00 の場合、1 時間を引いても当日のままです。この場合、$[yyyymmdd-1/24] は 20210721 と評価され、$[hh24-1/24] は 00 と評価されます。
-
pt=yyyy-mm-dd hh24:mi:ss のように、テーブルパーティションのフォーマットにスペースが含まれる場合の処理方法
スケジューリングパラメーターの割り当ては、スペースに対応していません。
以下のように、2 つのカスタム変数を使用して割り当てることができます:
-
日付:パラメーター datetime=$[yyyy-mm-dd]
-
時刻:パラメーター hour=$[hh24:mi:ss]
日付と時刻を別々に取得した後、コード内でスペースを使って pt=${datetime} ${hour} のように連結します。たとえば、SQL コードで select * from xc_demo_partition where dt='${key1} ${key2}'; を使用し、右側の [スケジュール設定] > [パラメーター] で key1=$[yyyymmdd] key2=$[hh24miss] を設定します。
ノードが 20:00 に実行されるようにスケジュールされ、そのパラメーターがスケジュール時刻 ($cyctime または $[yyyymmddhh24miss]) を参照している場合に、上流の障害が原因でノードが翌日の 00:00 に実際に実行された場合、スケジューリングパラメーターにはどの時刻が使用されますか。
インスタンスのスケジュール時刻は、期待される実行時刻と理解することができます。タスクはリソースの待機などの理由で遅延することがあるため、スケジュール時刻は実際の実行時刻と異なる場合があります。インスタンスのスケジュール時刻は絶対的なものであり、実際の実行時刻によって変更されることはありません。
スケジューリングパラメーターは、インスタンスのスケジュール時刻を使用します。スケジューリングパラメーターの置換値はインスタンスが生成されるときに決定され、実際の実行時刻によって変更されることはありません。したがって、スケジューリングパラメーターの値が変更されるかどうかを心配する必要はありません。[オペレーションセンター] > [定期インスタンス] ページで、[プロパティ] パネルの [スケジュール時刻] フィールドには、インスタンスの期待される実行時刻 (例:2021-07-13 00:00:00) が表示されます。これを [開始時刻] (例:00:00:27) と比較して確認できます。[Data Studio] ページで、[スケジュール設定] > [パラメーター] で var1=$bizdate var2=$cyctime var3=$[yyyymmdd] var4=$[yyyymmddhh24miss] を設定します。[スケジュール] を [日] に、[スケジュール時刻] を 00:00 に設定します。コードで select '${var1}' '${var2}'; を使用して、ビジネス日付とスケジュール時刻の値をそれぞれ確認します。
ODPS Spark ノードの時間パラメーターの設定方法
ODPS Spark ノードを作成する際、編集ページでパラメーターを設定する必要があります。システムは設定された順序でパラメーターを実行します。
コードで変数を設定した後、編集ページの右側にある [スケジュール設定] をクリックし、パラメーターパネルで変数に値を割り当てます。スケジューリングパラメーターの詳細については、「スケジューリングパラメーターの設定」をご参照ください。たとえば、ODPS Spark ノードの [パラメーター] フィールドに $(var) を入力し、パラメーターテーブルにパラメーター名 var とパラメーター値 $bizdate の行を追加し、[パラメーターのプレビュー] をクリックして置換結果を確認します。
スケジューリングパラメーターを直接処理できないノードで、そのパラメーターを使用する方法
バッチ同期ノードなど一部のノードでは、パラメーターを設定してもスケジューリングパラメーターの戻り値を直接使用できません。これらのノードに対しては、対象ノードの上流ノードとして代入ノードを設定することができます。代入ノードはスケジューリングパラメーターを参照し、戻り値を処理・変換した後、ノードコンテキスト機能を通じて最終的なパラメーター値を下流の対象ノードに渡します。
-
代入ノードの設定の詳細については、「代入ノードの作成」をご参照ください。
-
ノードコンテキストの設定の詳細については、「ノードコンテキストの設定」をご参照ください。
基本概念
-
MaxCompute の日付関数を直接使用して時刻の値を取得する場合、戻り値は計算タスクを実行するマシンの表示時刻になります。同じインスタンスが異なる時刻に実行されると、返される時刻も変わります。
-
スケジューリングパラメーターを使用して時刻の値を取得する場合、戻り値はスケジュール時刻に基づいて計算されます。同じインスタンスがいつ実行されても、返される時刻は変わりません。
Data Studio でスケジューリングパラメーターをテストする方法
スケジューリングパラメーターはスケジューリングシステムによってのみ自動的に置換されるため、Data Studio でスケジューリングパラメーターの置換をテストしたい場合は、[開発環境でのスモークテストの実行] を使用できます。
データ統合タスクは開発環境でのテストをサポートしていないため、このようなタスクのスケジューリングパラメーター置換をテストしたい場合は、SQL ノードを作成し、開発環境でのスモークテストを使用してスケジューリングパラメーターを個別にテストし、結果が期待通りであることを確認した後にデータ統合ノードでパラメーターを使用することを推奨します。
FAILED: ODPS-0130161:[1,84] Parse exception - invalid token '$' エラー
原因:スケジューリングパラメーターに値が割り当てられていないか、割り当てが無効です。
解決策:
-
スケジューリングパラメーターに値が割り当てられているか確認してください。
-
設定されたスケジューリングパラメーターが要件を満たしているか確認してください。詳細については、「スケジューリングパラメーターの設定」をご参照ください。
パラメーター設定を変更した後は、変更を送信してデプロイする必要があります。デプロイ後、本番環境のオペレーションセンターで定期タスクのプロパティパネルを確認し、パラメーターが最新の設定を反映していることを確認してください。
params format error,please check your params(key=values)
解決策:
-
変数に値が割り当てられているか確認してください。
-
スケジューリングパラメーターに余分なスペースがないか確認してください。
-
ノード名では、ピリオド (.) と中国語文字を一緒に使用することはできません。
例: time①=②$[yyyymmdd③hh24:mi:ss]time1=$[yyyymmdd]④time2=$[hh24:mi:ss] (①②③④ はスペースの位置を示します)。
-
スケジューリングパラメーターの等号 (=) の両側にスペースを入れることはできません。これは、例の ① と ② の位置に該当します。
-
スケジューリングパラメーターの値にスペースはサポートされていません。これは、例の ③ の位置に該当します。
-
2 つのスケジューリングパラメーターは、1 つのスペースで区切る必要があります。これは、例の ④ の位置に該当します。
基本概念
|
操作 |
説明 |
|
実行 |
最初の実行後、変数に手動で定数値を割り当てる必要があります。最初の割り当てが記録されます。コードを変更しても、変数は最初の実行時に割り当てられた値を引き続き使用します。 |
|
パラメーターを指定して実行 |
[パラメーターを指定して実行] を使用する場合、現在のコード内の変数に手動で定数値を割り当てる必要があります。コード内の変数を変更した場合は、[パラメーターを指定して実行] を使用して定数値を再割り当てします。 説明
タスク実行のリソースグループを変更したい場合は、[パラメーターを指定して実行] を使用してください。 |
|
開発環境でのスモークテストの実行 |
このモードは、手動でビジネス日付を選択して、指定されたビジネス日付のスケジューリングパラメーターの置換値を取得することにより、自動スケジューリングシナリオをシミュレートします。 |
[Data Studio] ページのコードエディタでは、組み込みのシステム変数 (例:${bdp.system.cyctime}) またはカスタム変数 (例:${var1}) を使用できます。右側の [スケジュール設定] > [パラメーター] パネルで変数に値を割り当てます (例:var1=$bizdate)。[実行] または [パラメーターを指定して実行] を使用すると、システムが自動的に値を置換します。[開発環境でのスモークテストの実行] を使用する場合は、上部のツールバーからビジネス日付を選択して、スケジューリングシナリオをシミュレートします。
本番環境でパラメーター置換を確認する方法
Data Studio でスケジューリングパラメーターを変更し、変更を送信してデプロイした場合、本番環境のオペレーションセンターで定期タスクのプロパティパネルを確認し、スケジューリングパラメーターが期待通りであるかを確認してください。期待通りでない場合は、タスクのデプロイメントページとデプロイメントパッケージを確認し、デプロイメントが成功したかを確認してください。特定のインスタンスのスケジューリングパラメーター置換を表示するには、定期インスタンスのプロパティパネルを確認します。
個々のインスタンスが実行されたかどうかに関わらず、インスタンスの実行パラメーターは、本番環境の定期タスクの最新のパラメーター設定を反映するようにリアルタイムで更新されます。
例:
-
ノード A の当日定期インスタンス A1 のスケジューリングパラメーター time1 は $bizdate に設定されています。インスタンスは正常に実行され、コード内のパラメーター値は bizdate のビジネス日付 (特定の値) です。
-
日中のある時点で、スケジューリングパラメーター time1 が $bizdate から $cyctime に変更されます。すると、当日のインスタンスの実行パラメーターには cyctime のスケジュール時刻 (特定の値) が表示されます。
-
現在のインスタンスを再実行すると、最新のパラメーター設定である time1=$cyctime が使用されます。
-
スケジューリングパラメーターが変更される前にインスタンスが使用したスケジューリングパラメーター置換を表示するには、ログを確認してください。詳細については、よくある質問:「ログを使用して実行中のインスタンスのパラメーター置換を確認する方法」をご参照ください。
[オペレーションセンター] > [定期インスタンス] ページで、インスタンスを選択し、下部の [プロパティ] パネルの [実行パラメーター] フィールドでスケジューリングパラメーターの実際の置換値 (例:var1=20210708233000 var2=20210709000000) を表示して、パラメーターが期待通りに更新されているかを確認します。
ログを使用して実行中のインスタンスのパラメーター置換を確認する方法
コード内で、キーワード SKYNET_PARAVALUE を探します。
07-09 00:00:19 INFO SKYNET_RERUN_MODE=1:
07-09 00:00:19 INFO SKYNET_FLOW_PARAVALUE=:
07-09 00:00:19 INFO SKYNET_ONDUTY=xxx:
07-09 00:00:19 INFO SKYNET_SYSTEMID=:
07-09 00:00:19 INFO CALC_ENGINE_IDENTIFIER=xxx:
07-09 00:00:19 INFO SKYNET_SOURCEID=xxx:
07-09 00:00:19 INFO SKYNET_PARAVALUE=var1=20210708233000 var2=20210709000000:
07-09 00:00:19 INFO SKYNET_TASKID=xxx:
07-09 00:00:19 INFO SKYNET_TENANT_ID=283789484710656:
07-09 00:00:19 INFO SKYNET_ID=700003341088:
07-09 00:00:19 INFO SKYNET_JOBID=700200619122:
07-09 00:00:19 INFO SKYNET_NODENAME=xc_partition_copy:
07-09 00:00:19 INFO SKYNET_CYCTYPE=0:
07-09 00:00:19 INFO SKYNET_DSC_JOB_VERSION=1:
07-09 00:00:19 INFO SKYNET_TASK_INPUT={}:
07-09 00:00:19 INFO SKYNET_FLOWNAME=ATCLOUD_FLOW:
07-09 00:00:19 INFO FILE_ID=700003341088:
スケジューリングパラメーターのタイムゾーンを定義する方法
夏時間 (DST) は、インスタンスの生成とパラメーターパーティションの計算でサポートされており、DST が開始および終了する日に正しい実行が保証されます。以下に米国太平洋時間を例として示します:
-
DST が開始する日には、23 個のインスタンスが生成されます。その日の 03:00 の 10 分前にシフトすると 01:50 になります。DST が開始する日の 02:00 にスケジュールされたタスクはドライランされます。
-
DST が終了する日には、24 個のインスタンスが生成されます。その日の 03:00 の 10 分前にシフトすると 02:50 になります。
DST が開始する日の日次、週次、月次の定期ノードについて、設定された実行時刻がスキップされる時間帯に該当する場合、その日に生成されるインスタンスの実行時刻は、その日の 00:00 に設定されます。
ノードのスケジューリングパラメーターが設定、送信、デプロイされたが、戻り値が変更されない
スケジューリングパラメーターが、同じ名前のワークフローパラメーターによって上書きされていないか確認してください。トラブルシューティングの詳細については、「ワークフローパラメーターの確認」をご参照ください。
同じ名前のワークフローパラメーターが存在し、不要な場合は削除してください。ワークフローパラメーターを保持する必要がある場合は、ノードのスケジューリングパラメーターの名前を変更してください。