You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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连接器

修复之前的依赖配置问题,确保连接器生效:

  1. 在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.json
    
    注意:gcs-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:25:28