依存関係のスケジューリングは、整然としたビジネスフローを構築するための基礎となります。 ノード間の依存関係は、正しいビジネスデータが適切なタイミングで生成されるよう、正しく設定する必要があります。 依存関係を正しく設定することにより、データの研究開発シナリオを標準化できます。

DataWorks V2.0 では、自動推奨自動解析、またはカスタム設定モードのいずれかで依存関係を構成できます。 依存関係の構成例の詳細については、「スケジューリング依存関係を設定するためのベストプラクティス」をご参照ください。
依存関係をどのように構成する場合でも、上位ノードの実行後に限って下位ノードをスケジュールできるというスケジューリング全体のロジックは変わりません。 したがって、各ワークフローノードには少なくとも 1 つの親ノードが必要です。 依存関係をスケジューリングする際の基本は、親ノードと子ノード間の依存関係です。 次のセクションでは、依存関係のスケジューリングの原理と構成方法について詳しく説明します。

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;

上位ノード

上位ノードは、現行ノードが依存する親ノードを指します。 このフィールドには、上位ノード名ではなく、上位ノードの出力名を入力します (1 つのノードが複数の出力名を持つ場合があるため、 出力名を入力します)。 追加する上位ノードの出力名を検索するか、または 系列分析用の SQL 文を実行して出力名を解析します。
前者の方法では、クローラーはスケジューリングシステムに送信されたノードの出力名の中から出力名を検索します。
  • 親ノードの出力名を入力して検索
    出力名で検索したノードを現行ノードの上位ノードに設定して、依存関係を作成できます。
  • 親ノードの出力名に対応するテーブル名を入力して検索
    この方法では、親ノードの出力名の 1 つが projectname.<テーブル名> など、ノードの SQL 文の INSERT または CREATEに続くテーブル名であることを 確認してください (出力名は自動的に解析される場合があります)。
    [送信] をクリックします。 出力名は、テーブル名を検索することにより、他のノードで検索できます。

現行ノード出力

現行ノード出力は、現行ノードの出力を指します。

システムは、.out で終わるデフォルトの出力名を割り当て、各ノードに出力します。 出力名をカスタマイズしたり、自動解析により出力名を取得することもできます。
ご利用中の Alibaba Cloud アカウントで、ノードの出力名はグローバルに一意とする必要があります。

自動依存関係解析

DataWorks は、ノードの実際の SQL コンテンツに基づいて異なる依存関係を解析できます。 親ノードと現行ノードの解析後の出力名は次のとおりです。
  • 親ノードの出力名: projectname.<INSERT に続くテーブル名>
  • 現行ノードの出力名:
    • projectname.<INSERT に続くテーブル名>
    • projectname.<CREATE に続くテーブル名> (通常は一時テーブルに使用。)
DataWorks V1.0 から DataWorks V2.0 にアップグレードする場合、現行ノードの出力名は projectname.<現行ノード名> です。
複数のINSERT句とFROM句が表示される場合、複数の出力名と入力名が自動的に解析されます。
依存関係を持つ複数のノードを作成し、下位ノードのすべての入力テーブルが上位ノードの出力テーブルから取得される場合、自動解析機能を使用して、ワークフロー全体の依存関係をすばやく構成できます。
  • ノードの出力ポイントを 1 つにすることで、ノードの柔軟性と独立性を高めることができ、 SQL ビジネスプロセスを柔軟に組み立てることができます。
  • SQL 文内のテーブルが出力テーブルと参照テーブル (依存テーブル) の両方である場合、そのテーブルは出力テーブルとしてのみ解析されます。
  • SQL 文内のテーブルが複数回参照またはエクスポートされる場合、1 つのスケジューリング依存関係のみ解析されます。
  • SQL コードに一時テーブルが含まれている場合 (たとえば、「プロジェクト設定」で名前がt_で始まるテーブルが一時テーブルとして指定されている場合)、そのテーブルはスケジューリング依存関係に関与しません。
自動解析を適用する場合、入力と出力を追加して、SQL 文内の文字を自動的に入力名および出力名として解析できるようにするか、または入力と出力を削除して、文字を入力名および出力名として自動的に解析されないようにすることができます。

テーブル名を右クリックし、[入力の追加[、[出力の追加]、[入力の削除]、または [出力の削除] を選択して、依存関係を変更します。 この方法は、SQL 文のすべてのテーブル名に適用されます。 [入力の追加] を選択した場合、文字は親ノードの入力名として解析されます。 [出力の追加]を選択した場合、文字は現行のノードの出力名として解析されます。 [入力の削除] または [出力の削除] を選択した場合、文字は解析されません。

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.

カスタマイズされた依存関係

系統分析用の SQL 文を実行してもノード間の依存関係を正確に解析できない場合、下図の自動解析を[No] に設定し、依存関係を設定できます。
自動解析が [No] に設定されている場合、[自動推奨] をクリックして、上位の依存関係の自動推奨を有効にできます。 システムは、プロジェクトの SQL の系統に基づいて、現行ノードの入力テーブルをエスポートする 他のすべての SQL ノードを推奨します。 必要に応じて推奨リストからノードを 1 つ以上選択し、それらを現行ノードの上位ノードとして設定できます。
推奨ノードは前日にスケジューリングシステムに送信する必要があり、2 日目にデータが生成された後に自動推奨機能によって認識できます。

一般的なシナリオ

  • 現行ノードの入力テーブルは、上位ノードの出力テーブルと同じではない。
  • 現行ノードの出力テーブルは、下位ノードの入力テーブルと同じではない。

カスタムモードを使用すると、次の方法で依存関係を構成できます。

  • 手作業による上位ノードの追加
    1. 3つのノードを作成します。 それぞれの出力名がシステムによって設定されます。
    2. 最上位ノード task_1 ワークスペースのルートノードに依存するように設定し、 [保存] をクリックします。
    3. task_2 を task_1 の出力名に依存するように設定し、 [保存] をクリックします。
    4. task_3 を task_2 の出力名に依存するように設定し、 [保存] をクリックします。
    5. 設定完了後、[送信] をクリックして正しく依存関係が設定されていることを確認します。 送信が成功した場合、依存関係は正しく構成されています。
  • ドラッグアンドドロップによる依存関係の設定
    1. 3 つのノードを作成し、最上位ノード task_1 をルートノードに依存するよう設定し、[保存] クリックします。
    2. 3 つのノードをドラッグして接続します。
    3. task_2 および task_3 の依存関係の設定を表示します。 親ノードの出力名は自動的に生成されます。
    4. 設定完了後、[送信] をクリックして正しく依存関係が設定されていることを確認します。 送信が成功した場合、依存関係は正しく構成されています。

よくある質問

Q: 自動解析後、送信に失敗します。 次のエラーメッセージが表示されます: 親ノードのworkshop_yanshi.tb_2の出力が存在しません。 親ノードを送信した後に、このノードを送信してください。
A: この問題は、次のいずれかの理由で発生する可能性があります。
  • 上位ノードが送信されていない。 この場合、上位ノードを送信して、再試行します。
  • 送信済みの上位ノードの出力名が workshop_yanshi.tb_2 ではない。
通常、親ノードと現在のノードの出力名は、INSERT、CREATE、または FROM に続くテーブル名に基づいて自動的に解析されます。 設定方法が、「自動依存関係解析」セクションで説明されているものと一致していることを確認してください。

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 時間に設定します。