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

Azure Databricks读取GCS文件时元数据服务器令牌获取失败求助

问题分析与解决方案

为什么会触发元数据服务器访问?

GCS的Hadoop文件系统客户端默认会按优先级顺序尝试多种认证方式:

  1. 优先尝试从GCP元数据服务器获取默认服务账号令牌(这是GCP环境的原生认证逻辑)
  2. 失败后才会使用手动配置的服务账号密钥

你的环境是Azure Databricks,不存在GCP元数据服务器(169.254.169.254是GCP元数据服务的固定地址),因此客户端第一步认证就失败并抛出错误。

解决步骤

1. 添加强制认证类型配置

在现有Spark配置基础上,新增以下参数,强制客户端仅使用服务账号密钥认证,跳过元数据服务器检测:

spark.conf.set("spark.hadoop.google.cloud.auth.type", "SERVICE_ACCOUNT")
spark.conf.set("spark.hadoop.google.cloud.auth.service.account.disable.implicit.retrieval", "true")

2. 检查服务账号私钥格式

确保传入的private_key是完整的PEM格式,并且在Databricks中正确转义换行符:

  • 原始私钥格式示例:
    -----BEGIN PRIVATE KEY-----
    MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC...
    ...
    -----END PRIVATE KEY-----
    
  • 在Databricks中需将换行符替换为\n,示例:
    private_key = "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC...\n...\n-----END PRIVATE KEY-----"
    

3. 验证配置生效

运行读取代码前,可先确认配置是否正确加载:

print(spark.conf.get("spark.hadoop.google.cloud.auth.type"))
print(spark.conf.get("spark.hadoop.google.cloud.auth.service.account.enable"))

完整配置示例

# 基础GCS认证配置
spark.conf.set("spark.hadoop.google.cloud.auth.service.account.enable", "true")
spark.conf.set("spark.hadoop.fs.gs.auth.service.account.email", client_email)
spark.conf.set("spark.hadoop.fs.gs.project.id", project_id)
spark.conf.set("spark.hadoop.fs.gs.auth.service.account.private.key", private_key)
spark.conf.set("spark.hadoop.fs.gs.auth.service.account.private.key.id", private_key_id)
spark.conf.set("spark.hadoop.fs.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem")
spark.conf.set("spark.hadoop.fs.AbstractFileSystem.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS")

# 新增强制认证方式配置
spark.conf.set("spark.hadoop.google.cloud.auth.type", "SERVICE_ACCOUNT")
spark.conf.set("spark.hadoop.google.cloud.auth.service.account.disable.implicit.retrieval", "true")

# 读取GCS文件
gcs_path = "gs://ddfsdfts/events/31dfsdfs4_2025_02_01_000000000000.csv"
df = spark.read.format("csv") \
    .option("header", "true") \
    .option("inferSchema", "true") \
    .load(gcs_path)

df.show()

内容的提问来源于stack exchange,提问作者KristiLogos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:28:22