Dataproc Serverless Batch Spark Web UI无法显示Executor日志
我在GCP Dataproc Batch中使用JDBCToBigQuery模板运行Spark任务,任务执行成功,但Spark Web UI的Executors标签页里看不到Executor的stdout和stderr日志。之前用EMR Serverless(同样是无服务器架构)时可以正常查看这些日志。
提交任务的命令如下:
gcloud dataproc batches submit spark --project PROJECT_ID \ --region asia-northeast3 \ --batch BATCH \ --class com.google.cloud.dataproc.templates.main.DataProcTemplate \ --version 1.1 \ --jars file:///usr/lib/spark/external/spark-avro.jar,gs://dataproc-templates-binaries/latest/java/dataproc-templates.jar,gs://MY_BUCKET/mysql-connector-java-8.0.23.jar \ --subnet SUBNET \ --service-account SERVICE_ACCOUNT \ --history-server-cluster CLUSTER \ -- --template JDBCTOBIGQUERY \ --templateProperty log.level=ALL \ --templateProperty jdbctobq.bigquery.location=DATASET.TABLE_ID \ --templateProperty jdbctobq.jdbc.url=jdbc:mysql://:3306/SCHEMA?user=USER&password=PWD \ --templateProperty jdbctobq.jdbc.driver.class.name=com.mysql.cj.jdbc.Driver \ --templateProperty jdbctobq.write.mode=Overwrite \ --templateProperty jdbctobq.temp.gcs.bucket=gs://MY_BUCKET \ --templateProperty jdbctobq.sql.file=gs://MYBUCKET/test_dataproc.sql \ --templateProperty project.id=PROJECT_ID
解决方法
先确认日志是否已生成
Dataproc Batch默认会把Executor的stdout/stderr存储到GCS的固定路径:gs://dataproc-batch-logs-{你的项目ID}/{区域}/{批处理ID}/executors/
可以通过GCS控制台或gsutil ls命令检查该路径下是否存在对应Executor的日志文件,如果存在,说明日志已生成,只是Web UI未加载。提交任务时添加Spark日志配置
在提交命令的Spark配置段(--之前)添加--properties参数,配置事件日志和Executor日志的存储位置,让历史服务器能读取并在Web UI展示:--properties spark.eventLog.enabled=true,spark.eventLog.dir=gs://{你的日志存储桶}/spark-events/,spark.executor.logs.uri=gs://dataproc-batch-logs-{你的项目ID}/asia-northeast3/{你的批处理ID}/executors/替换其中的占位符为实际的项目ID、日志存储桶和批处理ID。如果需要日志滚动,可额外添加:
--properties spark.executor.logs.rolling.strategy=time,spark.executor.logs.rolling.time.interval=1h,spark.executor.logs.rolling.maxRetainedFiles=5验证历史服务器权限
确保--history-server-cluster对应的集群使用的服务账号(或你指定的SERVICE_ACCOUNT)拥有访问GCS日志路径的权限,至少需要storage.objects.get和storage.objects.list权限。直接从GCS查看日志
如果Web UI仍无法显示,可直接通过gsutil命令查看日志:# 查看某个Executor的stdout gsutil cat gs://dataproc-batch-logs-{项目ID}/asia-northeast3/{批处理ID}/executors/{executor-ID}/stdout # 查看stderr gsutil cat gs://dataproc-batch-logs-{项目ID}/asia-northeast3/{批处理ID}/executors/{executor-ID}/stderr
内容的提问来源于stack exchange,提问作者lang

