Dataproc迁移至Databricks:权限与路径校验异常问题排查
1. 身份上下文的执行差异
直接调用Spark的read API时,会继承SparkSession中配置的Project-2服务账号(SA)权限,因为Spark的分布式数据读取操作会使用Spark配置中的身份凭证。但filter_valid_paths如果是自定义方法,大概率是在Driver节点本地执行文件路径校验(比如用Python原生文件操作、Hadoop FS的本地调用),这类操作不会走Spark的分布式身份上下文,默认使用Databricks集群节点自身的SA(Project-3的SA),所以出现权限不足。
2. 注释GCS配置后的默认行为
原Dataproc代码依赖GCP官方的Hadoop GCS连接器,注释相关配置后,Databricks会切换为内置的GCS集成方案。但自定义的路径校验方法没有适配这个集成的身份传递逻辑,导致校验操作无法获取Project-2 SA的权限。
3. 连接器依赖配置问题
之前添加GCS连接器依赖无效,可能是依赖版本与Databricks的Hadoop版本不兼容,或者配置方式错误(比如未正确设置fs.gs.impl等参数),导致连接器未生效,进而触发默认身份逻辑。
方案1:用Spark原生API实现路径校验
修改filter_valid_paths方法,基于SparkSession的Hadoop配置来执行路径校验,确保继承Project-2 SA的权限:
from py4j.java_gateway import java_import def filter_valid_paths(spark, paths): valid_paths = [] # 获取Spark的Hadoop配置 hadoop_conf = spark.sparkContext._jsc.hadoopConfiguration() # 导入Hadoop相关类 java_import(spark.sparkContext._jvm, "org.apache.hadoop.fs.Path") java_import(spark.sparkContext._jvm, "org.apache.hadoop.fs.FileSystem") fs = spark.sparkContext._jvm.FileSystem.get(hadoop_conf) for path in paths: hdfs_path = spark.sparkContext._jvm.Path(path) if fs.exists(hdfs_path): valid_paths.append(path) return valid_paths
方案2:显式配置Driver节点使用Project-2 SA
在执行filter_valid_paths前,在Driver节点上设置环境变量,指定Project-2 SA的密钥文件路径(需先将密钥文件上传至DBFS或集群本地):
import os os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/dbfs/path/to/project2-sa-key.json"
或者通过Spark配置全局指定身份:
spark.conf.set("spark.hadoop.google.cloud.auth.service.account.email", "project2-sa@project2.iam.gserviceaccount.com") spark.conf.set("spark.hadoop.google.cloud.auth.service.account.keyfile", "/dbfs/path/to/project2-sa-key.json")
方案3:正确配置GCP GCS连接器
修复之前的依赖配置问题,确保连接器生效:
- 在Databricks集群的高级选项 > Spark中添加如下配置:
注意:spark.jars.packages com.google.cloud.bigdataoss:gcs-connector:hadoop3-2.2.0 spark.hadoop.fs.gs.impl com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem spark.hadoop.fs.AbstractFileSystem.gs.impl com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS spark.hadoop.google.cloud.auth.service.account.email project2-sa@project2.iam.gserviceaccount.com spark.hadoop.google.cloud.auth.service.account.keyfile /dbfs/path/to/project2-sa-key.jsongcs-connector版本需与Databricks的Hadoop版本匹配(Databricks 10.x+通常适配hadoop3-2.x系列)。
方案4:使用Databricks服务账号 impersonation
如果使用Databricks工作区的服务账号,可通过 impersonation 直接获取Project-2 SA的权限:
在集群配置中添加:
spark.databricks.servicePrincipal.impersonation.enabled true spark.hadoop.google.cloud.auth.service.account.email project2-sa@project2.iam.gserviceaccount.com
前提是Databricks的工作区SA已被授予Project-2 SA的roles/iam.serviceAccountTokenCreator权限。
内容的提问来源于stack exchange,提问作者user16798185

