依存関係のスケジューリングは、整然としたビジネスフローを構築するための基礎となります。 ノード間の依存関係は、正しいビジネスデータが適切なタイミングで生成されるよう、正しく設定する必要があります。 依存関係を正しく設定することにより、データの研究開発シナリオを標準化できます。
2019 年 1 月 10 日より前に作成されたワークスペースにはデータの問題があります。 チケットを起票して、トラブルシューティングを依頼してください。 1 月 10 日以降に作成されたプロジェクトは影響を受けません。
標準化されたデータ開発シナリオ
- スケジューリングの依存関係を構成する前に、次の基本概念を理解する必要があります。
- DataWorks ノード: データに対して実行する操作を定義します。 詳細については、「基本概念」をご参照ください。
- 出力名: システムが各ノードに割り当てるデフォルトの出力名です。 出力名の末尾は.outです。 出力名をカスタマイズすることもできますが、テナント内で重複するノードの出力名は使用できません。 詳細は、「基本概念」をご参照ください。
- 出力テーブル: ノードの SQL 文の INSERT または CREATE に続けて指定するテーブルです。
- 入力テーブル:ノードの SQL 文のFROMに続けて指定するテーブルです。
- SQL 文の詳細については、「SQL 概要」をご参照ください。
実際には、1 つの DataWorks ノードには 1 つまたは複数の SQL 文を設定できます。
上位ノードと下位ノードは、出力名によって関連付けられます。 最上位のノードは、ワークスペースのルートノードとして設定できます (ワークスペース名: projectname_root)。
- 標準化されたデータ開発の原則
標準化されたデータ開発プロセスでは、複数の上位および下位 SQL ノードが作成されます。 次の原則に従うことを推奨します。
- 下位ノードの入力テーブルは、その上位ノードの出力テーブルとすること。
- 1 つのテーブルをエクスポートできるテーブルは 1 つに限ること。
目的は、ビジネスプロセスが急激に増加した場合でも、 自動解析機能を使用して、複雑な依存関係を迅速に構成することにあります。
- 標準化されたデータ開発プロセスの例
上図の各ノードおよびコードは次のとおりです。
- Task_1 のコードは次のとおりです。 このノードの入力データは ods_raw_log_d テーブルから取得され、エクスポート先は ods_log_info_d テーブルです。
INSERT OVERWRITE TABLE ods_log_info_d PARTITION (dt=${bdp.system.bizdate}) SELECT ... //It represents your SELECT operation. FROM ( SELECT ... //It represents your SELECT operation. FROM ods_raw_log_d WHERE dt = ${bdp.system.bizdate} ) a;
- Task_2 のコードは次のとおりです。 このノードの入力データは ods_user_info_d テーブルおよび ods_log_info_d テーブルから取得され、エクスポート先は dw_user_info_all_d テーブルです。
INSERT OVERWRITE TABLE dw_user_info_all_d PARTITION (dt='${bdp.system.bizdate}') SELECT ... //It represents your SELECT operation. FROM ( SELECT * FROM ods_log_info_d WHERE dt = ${bdp.system.bizdate} ) a LEFT OUTER JOIN ( SELECT * FROM ods_user_info_d WHERE dt = ${bdp.system.bizdate} ) b ON a.uid = b.uid;
- Task_3 のコードは次のとおりです。 このノードの入力データは dw_user_info_all_d テーブルから取得され、エクスポート先は rpt_user_info_d テーブルです。
INSERT OVERWRITE TABLE rpt_user_info_d PARTITION (dt='${bdp.system.bizdate}') SELECT ... //It represents your SELECT operation. FROM dw_user_info_all_d WHERE dt = ${bdp.system.bizdate} GROUP BY uid;
- Task_1 のコードは次のとおりです。 このノードの入力データは ods_raw_log_d テーブルから取得され、エクスポート先は ods_log_info_d テーブルです。
上位ノード
- 親ノードの出力名を入力して検索
出力名で検索したノードを現行ノードの上位ノードに設定して、依存関係を作成できます。
- 親ノードの出力名に対応するテーブル名を入力して検索
この方法では、親ノードの出力名の 1 つが projectname.<テーブル名> など、ノードの SQL 文の INSERT または CREATEに続くテーブル名であることを 確認してください (出力名は自動的に解析される場合があります)。[送信] をクリックします。 出力名は、テーブル名を検索することにより、他のノードで検索できます。
現行ノード出力
現行ノード出力は、現行ノードの出力を指します。
自動依存関係解析
- 親ノードの出力名: projectname.<INSERT に続くテーブル名>
- 現行ノードの出力名:
- projectname.<INSERT に続くテーブル名>
- projectname.<CREATE に続くテーブル名> (通常は一時テーブルに使用。)
- ノードの出力ポイントを 1 つにすることで、ノードの柔軟性と独立性を高めることができ、 SQL ビジネスプロセスを柔軟に組み立てることができます。
- SQL 文内のテーブルが出力テーブルと参照テーブル (依存テーブル) の両方である場合、そのテーブルは出力テーブルとしてのみ解析されます。
- SQL 文内のテーブルが複数回参照またはエクスポートされる場合、1 つのスケジューリング依存関係のみ解析されます。
- SQL コードに一時テーブルが含まれている場合 (たとえば、「プロジェクト設定」で名前がt_で始まるテーブルが一時テーブルとして指定されている場合)、そのテーブルはスケジューリング依存関係に関与しません。
テーブル名を右クリックし、[入力の追加[、[出力の追加]、[入力の削除]、または [出力の削除] を選択して、依存関係を変更します。 この方法は、SQL 文のすべてのテーブル名に適用されます。 [入力の追加] を選択した場合、文字は親ノードの入力名として解析されます。 [出力の追加]を選択した場合、文字は現行のノードの出力名として解析されます。 [入力の削除] または [出力の削除] を選択した場合、文字は解析されません。
--@extra_input=table name --Add an input.
--@extra_output=table name --Add an output.
--@exclude_input=table name --Delete an input.
--@exclude_output=table name --Delete an output.
カスタマイズされた依存関係
一般的なシナリオ
- 現行ノードの入力テーブルは、上位ノードの出力テーブルと同じではない。
- 現行ノードの出力テーブルは、下位ノードの入力テーブルと同じではない。
カスタムモードを使用すると、次の方法で依存関係を構成できます。
- 手作業による上位ノードの追加
- 3つのノードを作成します。 それぞれの出力名がシステムによって設定されます。
- 最上位ノード task_1 ワークスペースのルートノードに依存するように設定し、 [保存] をクリックします。
- task_2 を task_1 の出力名に依存するように設定し、 [保存] をクリックします。
- task_3 を task_2 の出力名に依存するように設定し、 [保存] をクリックします。
- 設定完了後、[送信] をクリックして正しく依存関係が設定されていることを確認します。 送信が成功した場合、依存関係は正しく構成されています。
- ドラッグアンドドロップによる依存関係の設定
- 3 つのノードを作成し、最上位ノード task_1 をルートノードに依存するよう設定し、[保存] クリックします。
- 3 つのノードをドラッグして接続します。
- task_2 および task_3 の依存関係の設定を表示します。 親ノードの出力名は自動的に生成されます。
- 設定完了後、[送信] をクリックして正しく依存関係が設定されていることを確認します。 送信が成功した場合、依存関係は正しく構成されています。
よくある質問
- 上位ノードが送信されていない。 この場合、上位ノードを送信して、再試行します。
- 送信済みの上位ノードの出力名が workshop_yanshi.tb_2 ではない。
Q: 現行ノードの出力で、下位ノードの名前と ID が空白になり指定できません。 なぜでしょうか。
A: 現行ノードに下位ノードがない場合、下位ノードの名前と ID は空白になります。 現行ノードに下位ノードが設定されると、対応する内容が自動的に解析されます。
Q: ノードの出力名は何に使用しますか。
A: ノードの出力名は、他のノードとの依存関係を確立するために使用されます。 ノード A の出力名が ABC で、ノード B が入力として ABC を使用する場合、ノード A とノード B の間に依存関係が確立されます。
Q: 1 つのノードに複数の出力名を付けることはできますか。
A: はい。 下位ノードが現行のノードの出力名を親ノードの出力名として参照する場合、下位ノードと現行ノードの間に依存関係が確立されます。
Q: 複数のノードに同じ出力名を付けることは可能ですか。
A: いいえ。 各ノードの出力名は、1 つの Alibaba Cloud アカウント内で一意である必要があります。 複数のノードが同じ MaxCompute テーブルにデータをエクスポートする場合、これらのノードの出力として <テーブル名>_<パーティション ID> を使用することを推奨します。
Q: 依存関係の自動解析中に中間テーブルを解析しないように設定するにはどうすればよいですか。
A: SQLコードで中間テーブル名を右クリックし、[入力の削除] または [出力の削除] 選択し、再度入力と出力の自動解析を行います。
Q: 最上位ノードの依存関係を構成するにはどうすればよいですか?
A: 通常、最上位ノードはワークスペースのルートノードに依存します。
Q: ノード A で上位ノードの出力名を検索すると、ノード B の存在しない出力名が検索されるのはなぜですか。
A: 検索機能が送信されたノード情報に基づいて動作するためです。 ノード B の送信後にノード B の出力名を削除し、ノードBをスケジューリングシステムに送信していない場合、ノード A ではノード B の削除された出力名が引き続き検索されます。
Q: A-> B-> Cのノードフローを 1 時間に 1 回実装するにはどうすればよいですか (ノード A の完了後にノード B を実行し、ノード B の完了後にノード C を実行します)。
A: ノード A の出力をノード B の入力として、ノード B の出力をノード C の入力として設定し、ノードA、B、および C のスケジューリング期間を 1 時間に設定します。