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 のフロー制御を使用して新しいリクエストの数を制御します。これは、バージョン 6.6 以降で実行されているインスタンスで使用できます。

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

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

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

推奨事項

このエラーを解決するには、次の問題を確認します。

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

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

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

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

推奨事項

このエラーを解決するには、Dataproc で使用されるサービス アカウントに 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 ディレクティブに渡された条件が満たされると、エラーしきい値に対してカウントされ、しきい値に達するとパイプラインが失敗します。

Oracle バッチソース プラグインが NUMBERstring に変換する

Oracle バッチソース バージョン 1.9.0、1.8.3 以前では、精度とスケールが未定義の Oracle の NUMBER データ型が CDAP の decimal(38,0) データ型にマッピングされます。

プラグイン バージョン 1.9.1、1.8.4、1.8.5 には下位互換性がありません。また、パイプラインのダウンストリーム ステージがソースの出力スキーマに依存している場合、その出力スキーマが変更されるため、以前のバージョンを使用するパイプラインは、バージョン 1.9.1、1.8.5、1.8.4 にアップグレードすると機能しない場合があります。バージョン 1.9.1、1.8.5、または 1.8 にアップグレードした後、以前のプラグイン バージョンで精度とスケールなしで定義された Oracle NUMBER データ型に対して定義された出力スキーマがある場合、Oracle バッチソース プラグインは Schema field '<field name>' is expected to have type 'decimal with precision <precision> and scale <scale> but found 'string'. Change the data type of field <field name> to string. のスキーマ不一致エラーをスローします。

バージョン 1.9.1、1.8.5、1.8.4 は、精度とスケールなしで定義された Oracle NUMBER データ型の CDAP string データ型の出力スキーマで動作します。Oracle のソース出力スキーマに Oracle の NUMBER データ型が精度とスケールなしで定義されている場合、丸め誤差が発生する可能性があるため、古いバージョンの Oracle プラグインを使用することはおすすめしません。

特別なケースは、データベース名、スキーマ名、テーブル名にマクロを使用する場合や、出力スキーマを手動で指定していない場合です。スキーマは実行時に検出され、マッピングされます。古いバージョンの Oracle バッチソース プラグインは、Oracle の NUMBER データ型を精度とスケールなしで定義して CDAP decimal(38,0) データ型にマッピングします。バージョン 1.9.1、1.8.5、1.8.4 以降では、実行時にデータ型を string にマッピングします。

推奨事項

精度とスケールが定義されない Oracle NUMBER データ型を操作するときに発生する可能性のある精度の低下の問題を解決するには、パイプラインをアップグレードして Oracle バッチソース プラグインのバージョン 1.9.1、1.8.5、または 1.8.4 を使用します。

アップグレード後、精度とスケールなしで定義された Oracle の NUMBER データ型は、実行時に CDAP string データ型にマッピングされます。元の CDAP decimal データ型(精度とスケールなしでマッピングされた Oracle NUMBER データ型)を使用するダウンストリームのステージまたはシンクがある場合は、更新するか、文字列データを使用することを想定します。

丸め誤差によるデータ損失のリスクは理解しつつ、精度とスケールなしで定義された Oracle NUMBER データ型を CDAP decimal(38,0) データ型として使用する場合は、Hub から Oracle プラグイン バージョン 1.8.6(Cloud Data Fusion 6.7.3 の場合)または 1.9.2(Cloud Data Fusion 6.8.1 の場合)をデプロイし、代わりにそれらを使用するようにパイプラインを更新します。

詳細については、Oracle バッチソースのリファレンスをご覧ください。

エフェメラル Dataproc クラスタを削除する

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      クラスタに移動

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

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

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

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

Cloud Data Fusion インスタンスを作成できない

Cloud Data Fusion インスタンスの作成時に、次の問題が発生することがあります。

Read access to project PROJECT_NAME was denied.

推奨事項

この問題を解決するには、Cloud Data Fusion API を無効にしてから再度有効にします。 次に、インスタンスを作成します。

プライマリ ワーカーまたはセカンダリ ワーカーがある Dataproc クラスタでパイプラインを実行すると、失敗する

Cloud Data Fusion バージョン 6.8 と 6.9 で、Dataproc クラスタでパイプラインを実行すると、失敗します。

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 以降にアップグレードします。