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

Azure Kubernetes集群中Spark作业Azure Blob Checkpoint配置求助

在Azure Kubernetes集群中配置Spark Checkpoint到Azure Blob存储

核心差异说明

Databricks已经内置了Azure存储的集成和认证管理,而原生Spark在K8s环境中需要手动配置依赖、认证以及Checkpoint路径,以下是完整的实现步骤:

1. 引入Azure Blob存储依赖

原生Spark默认不包含Azure Blob的客户端库,必须在提交作业时显式引入兼容的依赖包:

spark-submit --packages org.apache.hadoop:hadoop-azure:3.3.4,com.microsoft.azure:azure-storage:8.6.5 ...

注意:hadoop-azure版本必须与Spark内置的Hadoop版本匹配,可通过spark-submit --version查看Spark对应的Hadoop版本,再调整依赖版本。

2. 配置Azure Blob认证

方式1:SAS Token(快速测试)

直接在Spark配置中传入有效的SAS Token,适用于测试场景:

# spark-submit 配置参数
--conf spark.hadoop.fs.azure.account.key.<存储账户名>.blob.core.windows.net=<SAS Token>

或在Spark代码中设置:

spark.conf.set("fs.azure.account.key.<存储账户名>.blob.core.windows.net", "<SAS Token>")

方式2:服务主体(生产环境推荐)

通过K8s Secret挂载Azure AD服务主体信息,避免硬编码凭证:

  1. 创建Azure AD服务主体,为其分配目标Blob容器的Storage Blob Data Contributor权限
  2. 在K8s集群创建存储凭证的Secret:
kubectl create secret generic azure-spn-secret \
  --from-literal=tenant-id=<租户ID> \
  --from-literal=client-id=<客户端ID> \
  --from-literal=client-secret=<客户端密钥>
  1. 提交Spark作业时挂载Secret并配置认证参数:
spark-submit \
  --conf spark.kubernetes.secrets.azure-spn-secret=/mnt/secrets \
  --conf spark.hadoop.fs.azure.account.auth.type.<存储账户名>.blob.core.windows.net=OAuth \
  --conf spark.hadoop.fs.azure.account.oauth.provider.type.<存储账户名>.blob.core.windows.net=org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider \
  --conf spark.hadoop.fs.azure.account.oauth2.client.id.<存储账户名>.blob.core.windows.net=$(cat /mnt/secrets/client-id) \
  --conf spark.hadoop.fs.azure.account.oauth2.client.secret.<存储账户名>.blob.core.windows.net=$(cat /mnt/secrets/client-secret) \
  --conf spark.hadoop.fs.azure.account.oauth2.client.endpoint.<存储账户名>.blob.core.windows.net=https://login.microsoftonline.com/$(cat /mnt/secrets/tenant-id)/oauth2/token \
  ...

3. 设置Spark Checkpoint路径

在Spark代码中指定Checkpoint目录为Azure Blob的wasbs路径:

针对Spark Core/RDD

spark.sparkContext.setCheckpointDir("wasbs://<容器名>@<存储账户名>.blob.core.windows.net/<checkpoint子路径>")

针对Structured Streaming

df.writeStream
  .option("checkpointLocation", "wasbs://<容器名>@<存储账户名>.blob.core.windows.net/stream-checkpoint")
  .format("console")
  .start()

4. 完整提交示例(SAS Token方式)

spark-submit \
  --master k8s://https://<K8s API服务器地址> \
  --deploy-mode cluster \
  --name spark-checkpoint-demo \
  --class com.example.YourSparkJob \
  --packages org.apache.hadoop:hadoop-azure:3.3.4,com.microsoft.azure:azure-storage:8.6.5 \
  --conf spark.kubernetes.container.image=<你的Spark镜像> \
  --conf spark.hadoop.fs.azure.account.key.mystorageaccount.blob.core.windows.net=<你的SAS Token> \
  local:///path/to/your/job.jar

常见问题排查

  • 依赖版本冲突:如果作业启动时报ClassNotFoundException,检查hadoop-azure版本是否与Spark内置Hadoop版本一致
  • 认证失败:验证SAS Token是否未过期、包含读写权限;服务主体是否被正确赋予Blob容器的读写权限
  • 网络不通:在K8s Pod中执行curl https://<存储账户名>.blob.core.windows.net测试连通性,确保集群网络能访问Azure Blob服务
  • Checkpoint目录无法写入:确认Blob容器存在,且认证身份拥有该容器的写入权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:01:35