同一サイクル依存関係とは、ノードが実行される前に、同じサイクル内の先祖インスタンスが正常に完了するのを待つ必要がある依存関係です。あるノードが当日に先祖ノードによって生成されたデータを使用する場合に、この依存関係を利用します。DataWorks では、これらの依存関係を設定する方法が複数用意されており、プレビュー機能を利用して依存関係を確認・修正し、タスクが期待通りにスケジュールされるようにできます。
仕組み
スケジューリング依存関係は、ノード出力とノード入力をマッチングさせることで作成されます。これにより、先祖ノードの出力が子孫ノードの入力にリンクされます。依存関係を設定すると、先祖ノードが正常に実行された後でのみ、子孫ノードが開始されます。作業を始める前に、テーブルリネージに基づいて依存対象とそのタイプを特定することを推奨します。詳細については、「スケジューリング依存関係の設定ガイド」をご参照ください。
ノード出力
ノード出力(別名:現在のノードの出力名)は、他のノードがこのノードに依存できるように識別するためのものです。これはノードが実際に生成するデータを表すものではありません。他のノードはこの出力名を指定して、先祖依存関係として利用します。
DataWorks は各ノードに対して、次の 2 つの出力名を自動的に生成します。
-
projectName.randomNumber_out:この出力はグローバルに一意であり、変更や削除はできません。 -
projectName.nodeName:この出力にはノード名が含まれており、変更可能です。ノード名を変更しても、この出力名は変更されません。
DataWorks では、手動で出力を追加することも、コードから入力と出力を自動解析して追加することもできます。自動解析のサポート状況はノードタイプによって異なります。詳細については、「自動解析結果の比較」をご参照ください。
ノード入力
ノード入力は、現在のノードが依存する先祖ノードを指定します。依存関係は、先祖ノードの出力名(推奨)、ノード名、またはノード ID を使用して指定できます。
ノード ID は、先祖ノードが本番環境にコミットされた後にのみ生成されます。
設定ガイドライン
開発効率を向上させるため、ノードの依存関係を迅速に設定するには、自動解析機能の利用を推奨します。自動解析を利用する際は、次のガイドラインに従ってください。
-
ノード作成: 各ノードは、その出力テーブル名と同じ名前にすることを推奨します。
-
コード開発: 複数のノードが同じテーブルにデータを書き込むことは避けてください。
-
依存関係設定: ノードが出力するテーブルを、そのノードの出力として設定することを推奨します。
エントリーポイントとメソッド
DataStudio ノードの編集ページに移動し、右側のナビゲーションウィンドウで スケジューリング構成 をクリックし、Scheduling Dependency セクションでノードのスケジューリング依存関係を設定します。
-
Parent Nodes:現在のタスクが依存する先祖ノードを指定します。
-
Output Name of Current Node:このノードのどの出力が他のタスクによる依存関係の確立に利用可能かを定義します。
-
コードを編集中、DataWorks はデフォルトでテーブルリネージに基づいて依存関係を設定します。ノードをコミットする際、DataWorks は依存関係がデータリネージと一致しているかどうかを自動的にチェックします。コミット前に自動解析を有効にするかどうかを選択できます。詳細については、「スケジューリング設定の構成」をご参照ください。
-
ノードが前日の先祖ノードからのデータに依存する場合、または時間単位または分単位のノードが直前のサイクルの自身のインスタンスに依存する場合は、クロスサイクル依存関係を設定する必要があります。
-
ノードとその先祖ノードのスケジューリング頻度が異なる複雑なシナリオ(例:日次タスクが時間単位タスクに依存する場合)については、「必読:複雑な依存関係シナリオにおけるスケジューリング構成の原則と例」をご参照ください。
依存関係を設定するには、以下の 3 つの方法のいずれかを利用できます。いずれの方法も基本的な原理は同じです。
コードから依存関係を解析
自動解析は、コード内のテーブルリネージを分析して、ノードの出力および先祖依存関係を設定します。解析後、ノードが書き込むテーブルは自動的に projectname.tablename 形式でノード出力として追加されます。また、ノードが読み取るテーブルは自動的にノード入力として追加されます。
たとえば、SELECT 文に記述されたテーブルは、現在のノードの先祖依存関係として解析されます。INSERT 文に記述されたテーブルは、現在のノードの出力として解析されます。ノードタイプごとに自動解析でサポートされるキーワードの一覧については、「ノードタイプ別の自動解析の適用シーン」をご参照ください。
-
依存関係の設定
自動解析には、手動でコードから入力と出力を解析する方法と、Automatic Parsing Before Committingの 2 つの方法があります。どちらの方法も同じ原理に基づいています。コミット前の自動解析では、コードをコミットする際に自動的に入力と出力を解析し、依存関係のマウントを促します。
たとえば、
mc1ノードの出力テーブルdws_user_info_all_diに依存する必要があるmc2という名前の ODPS ノードがあるとします。mc2のコードは次のとおりです。INSERT OVERWRITE TABLE ads_user_info_1d PARTITION (dt='${workflow.var}') SELECT uid , MAX(region) , MAX(device) , COUNT(0) AS pv , MAX(gender) , MAX(age_range) , MAX(zodiac) FROM dws_user_info_all_di WHERE dt = '${workflow.var}' GROUP BY uid;コードから入力と出力を解析 をクリックすると、現在のノードの入力として
dws_user_info_all_diテーブルが解析され、出力テーブル名と先祖ノード名が自動的にマッチングされます。先祖出力名
先祖出力テーブル
先祖名
ノード ID
ワークスペース
所有者
スケジューリング周期
方法
最終実行ステータス
操作
yunwan_lingyi.dws_user_info_all_di
mc1
-
Test Workspace
lingyi01_testcloud_com
Daily
Automatic parsing
No data available
Delete
同時に、DataWorks は
ads_user_info_1dテーブルをノードの出力として識別します。解析結果は次のとおりです。出力名
出力テーブル
子孫名
所有者
方法
影響を受けるベースライン
操作
old_ide.505487297_out
-
-
-
System default
-
Delete
old_ide.mc2
-
-
-
Manually added
-
Delete
yunwan_lingyi.ads_user_info_1d
yunwan_lingyi.ads_user_info_1d
-
-
Automatic parsing
-
Delete
これにより、ノード
mc2がノードmc1に依存するようになります。 -
自動解析で作成された依存関係の変更
自動解析によって誤った依存関係が作成された場合や、定期タスクによって生成されないテーブルなど、サポート対象外のシナリオにおいて依存関係を削除する必要がある場合は、解析結果を変更できます。
操作
説明
解析結果を手動で削除
先祖ノードの一覧で誤った入力を削除し、再度コードを解析します。DataWorks は次回の解析時に当該入力または出力が再追加されないように、コード内に自動的にコメントを追加します。
--@exclude_input=projectname.tablename --@exclude_output=projectname.tablename入力または出力を手動で追加
コードエディタでテーブル名を右クリックし、入力または出力として追加するオプションを選択します。DataWorks はコード内に自動的に対応するコメントを追加します。
--@extra_output=projectname.tablename --@extra_input=projectname.tablenameあるいは、スケジューリング構成 UI で手動で先祖ノード依存関係を追加するか、ワークフローキャンバス上で線を引いてノード依存関係を設定することもできます。
重要子孫ノードの依存関係となっているノード出力は直接削除できません。削除すると、子孫ノードが実行時またはデータ取得時に失敗する可能性があります。先祖ノードの出力を削除する前に、子孫ノードのビジネスロジックを変更して依存関係を解除することを推奨します。
-
自動解析の対象外となるシナリオ
DataWorks は、一時テーブルをノード出力または先祖依存関係として解析しません。一時テーブルは、ワークスペーステーブル管理で特定の形式(例:
t_で始まるテーブル名)で定義されます。 -
自動解析の使用上の注意点
自動解析を利用して依存関係を設定する際は、各ノード出力が現在のリージョン内で一意であることを確認してください。DataWorks での開発時には、次の点に注意してください。
-
ノード作成:デフォルトでは、各ノードにはノード名と同じ名前の出力が存在します。同じワークスペース内に同名のノードが 2 つある場合は、いずれか一方のノード出力を手動で変更する必要があります。
-
コード開発:自動解析では、ノードの出力テーブルがノード出力として使用されます。同じワークスペース内の 2 つのスケジュール済みノードが同じテーブルにデータを書き込む場合、自動解析によっていずれかのノードでエラーが発生します。詳細については、「複数のノードが同じテーブルにデータを書き込み、出力名が重複しているため、自動解析でエラーが発生する」をご参照ください。
-
SQL ノードを使用してバッチ同期ノードの出力を処理する場合、自動解析を利用して依存関係を確立できます。そのためには、まずノードの出力テーブルを手動で追加するか、ノード名を出力テーブル名と同じにする必要があります。そうしないと、下流の SQL ノードがコミットできず、次のエラーが表示される可能性があります。現在のノードが依存する先祖ノードの出力 ${projectname.tablename} が存在しません。現在のノードをコミットできません。この出力を持つ先祖ノードがコミットされていることを確認してください。
-
依存関係を手動で追加
スケジューリング構成 > Scheduling Dependency > Parent Nodes の構成ページで、先祖ノードの出力名、ノード名、またはノード ID を入力して、手動で先祖ノードを追加できます。ノード名は重複する可能性があるため、依存関係の確立にはノード出力の使用を推奨します。
キャンバス上で依存関係を描画
ワークフローの有向非循環グラフ (DAG) パネル上で、先祖ノードから子孫ノードへ線を引くことで依存関係を作成できます。DataWorks は、先祖ノードの出力に自動的に _out サフィックスを付与し、それを子孫ノードの入力として追加します。
ワークフローキャンバスから接続線を削除すると、対応するスケジューリング依存関係もノードの構成から削除されます。
ノード出力の変更による影響
ノードの出力を変更する(生成するデータを変更する、または名前を編集する)と、次のような影響があります。
-
ノード出力を削除しても、ノードが生成するテーブルデータには直接影響しません。
-
ノード出力が子孫ノードの依存関係となっている場合、その出力を変更または削除すると、下流のタスクに深刻な問題が発生する可能性があります。
-
出力テーブルの変更:ノードの出力テーブルを変更した結果、解析されたノード出力が変更されると、子孫ノードが孤立ノードとなり、スケジュールされなくなる可能性があります。また、データ依存関係の欠落により、下流タスクでデータ破損が発生する可能性もあります。
-
出力テーブルの転送:ノードの出力テーブルを別のノードに転送する必要がある場合は、「ノード出力の削除または変更による影響」の手順をご参照ください。
ノード出力に子孫依存関係が存在する場合は、出力を削除する前に下流タスクの所有者と連絡を取り、変更内容を通知してください。これにより、所有者は構成を調整し、タスクが孤立するのを防ぐことができます。
-
依存関係の検証
依存関係を設定したら、タスクが期待通りにスケジュールされることを確認するために、次の手順で検証してください。
-
依存関係のプレビュー:誤った依存関係構成によってスケジューリングが遅延するのを防ぎます。
-
コミット時の確認:ノードをコミットする際に、依存関係の変更が期待通りであることを確認します。
-
定期タスクの依存関係の確認:ノードをデプロイ後、オペレーションセンターに移動して、本番タスクの依存関係が正しいことを確認します。定期タスクは、本番環境におけるノードのコミット済み状態を表します。その定期インスタンス間の依存関係は、インスタンスの生成方法に依存します。
詳細については、「スケジューリング依存関係の確認」をご参照ください。
よくある質問
その他のよくある質問については、「スケジューリング依存関係」をご参照ください。
ベストプラクティス
ワークスペースまたはワークフローをまたいだ依存関係を設定する方法については、「シナリオ 3:異なるワークフローやワークスペース間のノードに対するスケジューリング依存関係を設定する方法」をご参照ください。