Cloud Data Fusion バッチ パイプラインのトラブルシューティング

このページでは、Cloud Data Fusion バッチ パイプラインに関する問題を解決する方法について説明します。

パイプライン エラー: テキスト ファイルがビジー状態

バッチ パイプラインを実行すると、次のエラーが発生してパイプラインが失敗します。

error=26, Text file busy

この問題を解決するには、パイプラインが失敗したときに自動的に再試行するトリガーを設定します。

  1. パイプラインを停止する
  2. トリガーを作成する。この場合、実行するイベントを選択する際に [Fails] を選択します。詳細については、ダウンストリーム パイプラインでインバウンド トリガーを作成するをご覧ください。
  3. パイプラインを開始する

同時実行パイプラインが停止する

Cloud Data Fusion では、多数の同時バッチ パイプラインを実行すると、インスタンスに負荷がかかり、ジョブが StartingProvisioningRunning 状態で停止する場合があります。その結果、ウェブ インターフェースや API 呼び出しでパイプラインを停止することはできなくなります。多くのパイプラインを同時に実行すると、ウェブ インターフェースの動作が遅くなったり、応答しなくなったりすることがあります。この問題は、バックエンドの HTTP ハンドラに対して複数の UI リクエストが行われることが原因で発生します。

この問題を解決するには、 Cloud Data Fusion フロー制御を使用して新しいリクエストの数を制御します。

パイプラインの実行中に SSH 接続がタイムアウトする

バッチ パイプラインを実行するときに、次のエラーが発生します。

java.io.IOException: com.jcraft.jsch.JSchException:
java.net.ConnectException: Connection timed out (Connection timed out)

この問題を解決するには、次の操作を行います。

  • ファイアウォール ルール(通常はポート 22)がないかどうかを確認します。新しい ファイアウォール ルールを作成するには、 Managed Service for Apache Spark クラスタのネットワーク構成をご覧ください。
  • Compute Engine Enforcer が Cloud Data Fusion インスタンスと Managed Service for Apache Spark クラスタ間の接続を許可していることを確認します。

レスポンス コード: 401エラー: 不明なエラーです。

バッチ パイプラインを実行するときに、次のエラーが発生します。

java.io.IOException: Failed to send message for program run program_run:
Response code: 401. Error: unknown error

この問題を解決するには、Managed Service for Apache Spark で使用されるサービス アカウントに Cloud Data Fusion ランナーのロール(roles/datafusion.runner)を付与する必要があります。

BigQuery プラグインを使用したパイプラインが Access Denied エラーで失敗する

BigQuery ジョブの実行時にパイプラインが Access Denied エラーで失敗する既知の問題があります。これは、次のプラグインを使用するパイプラインに影響します。

  • BigQuery ソース
  • BigQuery シンク
  • BigQuery の複数テーブル シンク
  • 変換プッシュダウン

ログのエラー例(使用しているプラグインによって異なる場合があります):

POST https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/jobs
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Access Denied: Project xxxx: User does not have bigquery.jobs.create permission in project PROJECT_ID",
"reason" : "accessDenied"
} ],
"message" : "Access Denied: Project PROJECT_ID: User does not have bigquery.jobs.create permission in project PROJECT_ID.",
"status" : "PERMISSION_DENIED"
}

この例では、PROJECT_ID はプラグインで 指定したプロジェクト ID です。プラグインで指定されたプロジェクトのサービス アカウントには、次のいずれかを行う権限がありません。

  • BigQuery ジョブを実行する
  • BigQuery データセットを読み取る
  • 一時バケットを作成する
  • BigQuery データセットを作成する
  • BigQuery テーブルを作成する

この問題を解決するには、不足しているロールをプラグインで指定したプロジェクト (PROJECT_ID)に付与します。

  • BigQuery ジョブを実行するには、BigQuery ジョブユーザーのロール(roles/bigquery.jobUser)を付与します。

  • BigQuery データセットを読み取るには、BigQuery データ閲覧者のロール (roles/bigquery.dataViewer)を付与します。

  • 一時バケットを作成するには、ストレージ管理者のロール(roles/storage.admin)を付与します。

  • BigQuery データセットまたはテーブルを作成するには、 BigQuery データ編集者のロール (roles/bigquery.dataEditor)を付与します。

詳細については、プラグインのトラブルシューティング ドキュメント(Google BigQuery マルチ テーブル シンクのトラブルシューティング)をご覧ください。

パイプラインがエラーしきい値で停止しない

エラーしきい値を 1 に設定しても、複数のエラーが発生した後にパイプラインが停止しないことがあります。

エラーしきい値は、他の方法で処理されない障害が発生した場合に、ディレクティブから発生する例外を対象としています。ディレクティブですでに emitError API を使用している場合、エラーしきい値は有効になりません。

特定のしきい値に達したときに失敗するパイプラインを設計するには、 FAIL ディレクティブを使用します。

FAIL ディレクティブに渡された条件が満たされると、エラーしきい値に対してカウントされ、しきい値に達するとパイプラインが失敗します。

エフェメラル Managed Service for Apache Spark クラスタを削除する

Cloud Data Fusion がパイプライン実行のプロビジョニング中にエフェメラル Managed Service for Apache Spark クラスタを作成すると、パイプライン実行の完了後にとクラスタが削除されます。まれに、クラスタの削除に失敗することがあります。

強く推奨: 適切なクラスタ管理のために、最新の Cloud Data Fusion バージョンにアップグレードします。

最大アイドル時間を設定する

この問題を解決するには、Max Idle Time オプションを構成します。これにより、パイプラインの終了時に明示的な呼び出しが失敗した場合でも、Managed Service for Apache Spark がクラスタを自動的に削除できます。

Max Idle Time は、Cloud Data Fusion バージョン 6.4 以降で使用できます。

推奨: 6.6 より前のバージョンでは、Max Idle Time を 30 分以上に手動で設定します。

クラスタを手動で削除する

バージョンをアップグレードできない場合や、Max Idle Time オプションを構成できない場合は、代わりに古いクラスタを手動で削除します。

  1. クラスタが作成された各プロジェクト ID を取得します。

    1. パイプラインのランタイム引数で、 Managed Service for Apache Spark プロジェクト ID が実行用にカスタマイズされているかどうかを確認します。

      Dataproc プロジェクト ID が実行用にカスタマイズされているかどうかを確認する

    2. Managed Service for Apache Spark プロジェクト ID が明示的に指定されていない場合は、 使用するプロビジョナーを特定し、プロジェクト ID を確認します。

      1. パイプラインのランタイム引数で、system.profile.name の値を確認します。

        ランタイム引数でプロビジョナー名を取得する

      2. プロビジョナーの設定を開き、 Managed Service for Apache Spark プロジェクト ID が設定されているかどうかを確認します。設定が存在しない場合、またはフィールドが空の場合、 Cloud Data Fusion インスタンスが実行されているプロジェクトを使用しています。

  2. 各プロジェクトに対して:

    1. コンソールでプロジェクトを開き、Managed Service for Apache Spark の [クラスタ] ページに移動します。 Google Cloud

      [クラスタ] に移動

    2. クラスタを作成された日付の、古い日付から新しい日付で並べ替えます。

    3. 情報パネルが表示されていない場合は、[情報パネルを表示] をクリックして [ラベル] タブに移動します。

    4. 使用されていない各クラスタ(1 日以上経過しているなど)について、Cloud Data Fusion のバージョン ラベルがあるかどうかを確認します。 これは、Cloud Data Fusion によって作成されたことを示します。

    5. クラスタ名別のチェックボックスをオンにして、[削除] をクリックします。

プライマリ ワーカーまたはセカンダリ ワーカーを持つ Managed Service for Apache Spark クラスタでパイプラインを実行すると、失敗する

Cloud Data Fusion バージョン 6.8 と 6.9 で、Managed Service for Apache Spark クラスタに対してパイプラインを実行すると、失敗します。

ERROR [provisioning-task-2:i.c.c.i.p.t.ProvisioningTask@161] - PROVISION task failed in REQUESTING_CREATE state for program run program_run:default.APP_NAME.UUID.workflow.DataPipelineWorkflow.RUN_ID due to
Caused by: io.grpc.StatusRuntimeException: CANCELLED: Failed to read message.
Caused by: com.google.protobuf.GeneratedMessageV3$Builder.parseUnknownField(Lcom/google/protobuf/CodedInputStream;Lcom/google/protobuf/ExtensionRegistryLite;I)Z.

この問題を解決するには、 パッチ リビジョン 6.8.3.16.9.2.1 以降に アップグレードします。

Managed Service for Apache Spark 2.0 で Cloud Storage プラグインが正規表現で断続的に失敗する

Cloud Data Fusion バージョン 6.10.1 で、Cloud Storage プラグインがパスに * 正規表現パターンを使用し、実行環境が Managed Service for Apache Spark 2.0 の場合、パイプラインが断続的に失敗することがあります。

この問題を解決するには、次のいずれかの操作を行います。

  • Managed Service for Apache Spark イメージをバージョン 2.1 以降に更新します。
  • 以前のバージョンの Cloud Storage プラグインに戻します。
  • Managed Service for Apache Spark エグゼキュータに割り当てられたメモリを増やします。

Managed Service for Apache Spark 2.2 でパイプラインが NoSuchMethodError で失敗する

Cloud Data Fusion バージョン 6.10.1.1 以降では、Managed Service for Apache Spark 2.2 で実行すると、パイプラインが次のエラーで失敗することがあります。

java.lang.NoSuchMethodError: 'org.apache.spark.sql.catalyst.encoders.ExpressionEncoder
org.apache.spark.sql.catalyst.encoders.RowEncoder.apply(org.apache.spark.sql.types.StructType)'

この問題を解決するには、次のいずれかの操作を行います。

[Reference Name] にスペースが含まれている場合、複数のデータベース テーブル プラグインが失敗する

Cloud Data Fusion バージョン 6.10.1 以降では、[Reference Name] フィールドにスペース文字が含まれている場合、複数のデータベース テーブル バッチソースを使用するパイプラインが失敗することがあります。

この問題を解決するには、Hub から複数のデータベース テーブル プラグインをバージョン 1.4.1 以降に更新します。更新されたバージョンでは、[Reference Name] フィールドにスペースを使用できません。