このドキュメントでは、Google Cloud Serverless for Apache Spark の Spark バッチ ワークロードとインタラクティブ セッションの起動を妨げる一般的な問題のトラブルシューティングについて説明します。
概要
通常、バッチまたはセッションの開始に失敗すると、次のエラー メッセージが報告されます。
Driver compute node failed to initialize for batch in 600 seconds
このエラー メッセージは、Spark ドライバがデフォルトのタイムアウト時間(600 秒、10 分)内に起動できなかったことを示します。一般的な原因は、サービス アカウントの権限、リソースの可用性、ネットワーク構成、Spark プロパティに関連しています。
バッチとセッションの開始失敗の原因とトラブルシューティングの手順
以降のセクションでは、バッチとセッションの開始が失敗する一般的な原因と、問題の解決に役立つトラブルシューティングのヒントについて説明します。
サービス アカウントの権限が不足している
Apache Spark バッチまたはセッション用のサーバーレスで使用されるサービス アカウントには、Apache Spark オペレーション用のサーバーレスの権限と Google Cloud リソースへのアクセス権を含む特定の IAM ロールが必要です。サービス アカウントに必要なロールがない場合、バッチまたはセッションの Spark ドライバの初期化が失敗する可能性があります。
- 必要なワーカーロール: バッチまたはセッションのサービス アカウントには、Dataproc ワーカーロール(
roles/dataproc.worker
)が必要です。このロールには、Serverless for Apache Spark がコンピューティング リソースをプロビジョニングして管理するために必要な最小限の権限が含まれています。 - データアクセス権限: Spark アプリケーションが Cloud Storage または BigQuery から読み取りまたは書き込みを行う場合、サービス アカウントには、これらのサービスに関連するロールが必要です。
- Cloud Storage: 読み取りには
Storage Object Viewer
ロール(roles/storage.objectViewer
)が必要です。書き込みにはStorage Object Creator
ロール(roles/storage.objectCreator
)またはStorage Object Admin
ロール(roles/storage.admin
)が必要です。 - BigQuery: 読み取りには
BigQuery Data Viewer
ロール(roles/bigquery.dataViewer
)が必要で、書き込みにはBigQuery Data Editor
ロール(roles/bigquery.dataEditor
)が必要です。
- Cloud Storage: 読み取りには
- ロギング権限: サービス アカウントには、Cloud Logging にログを書き込む権限を持つロールが必要です。通常は、
Logging Writer
ロール(roles/logging.logWriter
)で十分です。
トラブルシューティングのヒント:
- バッチまたはセッションのサービス アカウントを特定します。指定しない場合、デフォルトで Compute Engine のデフォルト サービス アカウントが使用されます。
- Google Cloud コンソールの [IAM と管理] > [IAM] ページに移動し、バッチまたはセッションのサービス アカウントを見つけて、オペレーションに必要なロールがあることを確認します。不足しているロールを付与します。
割り当て不足
Google Cloud Apache Spark 用サーバーレスまたは他の Google Cloud リソースのプロジェクトまたはリージョン固有の割り当てを超えると、新しいバッチやセッションを開始できなくなる可能性があります。
トラブルシューティングのヒント:
Google Cloud Apache Spark 用サーバーレスの割り当てページで、同時バッチ、DCU、シャッフル ストレージの上限を確認します。
gcloud compute quotas list
コマンドを使用して、プロジェクトとリージョンの現在の使用量と上限を表示することもできます。gcloud compute quotas list --project=PROJECT_ID --filter="service:dataproc.googleapis.com"
割り当て上限に繰り返し達する場合は、 Google Cloud コンソールから割り当ての増加をリクエストすることを検討してください。
ネットワーク構成に関する問題
VPC 構成、限定公開の Google アクセス、ファイアウォール ルールなどのネットワーク設定が正しくないと、Spark ドライバが初期化されたり、必要なサービスに接続されたりするのをブロックする可能性があります。
トラブルシューティングのヒント:
バッチまたはセッションに指定された VPC ネットワークとサブネットが正しく構成され、十分な IP アドレスが使用可能であることを確認します。
バッチまたはセッションが公共のインターネットを経由せずに Google API とサービスにアクセスする必要がある場合は、サブネットで限定公開の Google アクセスが有効になっていることを確認します。
VPC ファイアウォール ルールを確認して、Spark アプリケーションに必要な内部通信や Google API または外部サービスへの下り(外向き)が誤ってブロックされていないことを確認します。
無効な Spark プロパティまたはアプリケーション コードに関する問題
Spark プロパティ(特にドライバ リソースに関連するプロパティ)の構成が誤っている場合や、Spark アプリケーション コード内に問題がある場合は、起動に失敗することがあります。
トラブルシューティングのヒント:
spark.driver.memory
とspark.driver.cores
の値を確認します。妥当な範囲内であり、利用可能な DCU と一致していることを確認します。これらのプロパティの値が大きすぎると、リソースの枯渇や初期化の失敗につながる可能性があります。デバッグを簡素化するため、不要な Spark プロパティや試験運用中の Spark プロパティを削除します。「Hello World」Spark アプリケーションを実行して、問題が環境設定にあるのか、コードの複雑さやエラーが原因なのかを特定します。
バッチまたはセッション用に指定されたすべてのアプリケーション JAR、Python ファイル、または依存関係が Cloud Storage に正しく配置され、バッチまたはセッションのサービス アカウントからアクセスできることを確認します。
ログを確認する
バッチ作成の失敗を診断するうえで重要な手順は、Cloud Logging の詳細なログを調べることです。
- Google Cloud コンソールの [Cloud Logging] ページに移動します。
- Apache Spark バッチまたはセッション用のサーバーレスでフィルタします。
- [リソース] プルダウンで、
Cloud Dataproc Batch
またはCloud Dataproc Session
を選択します。 - 失敗したバッチまたはセッションの
batch_id
またはsession_id
でフィルタします。project_id
とlocation
(リージョン)でフィルタすることもできます。
- [リソース] プルダウンで、
jsonPayload.component="driver"
を含むログエントリを探します。これらのログには、600 秒のタイムアウトが発生する前にドライバの初期化の失敗の原因を特定できる特定のエラー メッセージやスタック トレースが含まれていることがよくあります。