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

使用Standalone Spark读取Azure Data Lake Gen2 CSV遇abfss协议错误

问题描述

尝试使用Standalone Spark读取Azure Data Lake Gen2(ADLS Gen2)中的CSV文件时,抛出错误:java.io.IOException: No FileSystem for scheme: abfss。

环境配置:

  • 通过pip install pyspark==3.0.3安装PySpark
  • 启动命令:pyspark --packages "org.apache.hadoop:hadoop-azure:3.0.3,org.apache.hadoop:hadoop-azure-datalake:3.0.3"
  • 尝试过升级到Spark 3.2+并使用org.apache.spark:hadoop-cloud_2.12依赖,仍出现相同异常,完整堆栈信息如下:
>>> spark.read.csv("abfss://raw@teststorageaccount.dfs.core.windows.net/members.csv")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/dev/binaries/spark-3.1.2-bin-hadoop2.7/python/pyspark/sql/readwriter.py", line 737, in csv
    return self._df(self._jreader.csv(self._spark._sc._jvm.PythonUtils.toSeq(path)))
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/dev/binaries/spark-3.1.2-bin-hadoop2.7/python/lib/py4j-0.10.9-src.zip/py4j/java_gateway.py", line 1304, in __call__
  File "/Users/dev/binaries/spark-3.1.2-bin-hadoop2.7/python/pyspark/sql/utils.py", line 111, in deco
    return f(*a, **kw)
           ^^^^^^^^^^^
  File "/Users/dev/binaries/spark-3.1.2-bin-hadoop2.7/python/lib/py4j-0.10.9-src.zip/py4j/protocol.py", line 326, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o35.csv.
: java.io.IOException: No FileSystem for scheme: abfss
    at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2660)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94)
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373)
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
    at org.apache.spark.sql.execution.streaming.FileStreamSink$.hasMetadata(FileStreamSink.scala:46)
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:377)
    at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:325)
    at org.apache.spark.sql.DataFrameReader.$anonfun$load$3(DataFrameReader.scala:307)
    at scala.Option.getOrElse(Option.scala:189)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:307)
    at org.apache.spark.sql.DataFrameReader.csv(DataFrameReader.scala:795)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:282)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.lang.Thread.run(Thread.java:748)
解决方案

1. 确保Spark与Hadoop版本兼容

从堆栈信息可见,当前使用的是spark-3.1.2-bin-hadoop2.7,而abfss协议是Hadoop 3.2及以上版本才支持的,Hadoop 2.7没有对应的FileSystem实现。必须更换为绑定Hadoop 3.2+的Spark预编译包,比如spark-3.2.0-bin-hadoop3.2或更高版本。

2. 正确引入匹配版本的依赖包

Spark启动时引入的hadoop-azure版本必须与Spark自带的Hadoop版本完全一致:

  • 若使用Spark 3.2(绑定Hadoop 3.2),启动命令应为:
    pyspark --packages "org.apache.hadoop:hadoop-azure:3.2.2,com.microsoft.azure:azure-storage:8.6.6"
    
  • 若使用Spark 3.3+(绑定Hadoop 3.3),则对应依赖版本改为3.3.x。

3. 配置ADLS Gen2的访问认证参数

读取文件前必须在Spark会话中配置存储账户的认证信息,两种常见方式:

方式一:使用存储账户密钥

spark.conf.set("fs.azure.account.key.teststorageaccount.dfs.core.windows.net", "<你的存储账户密钥>")

方式二:使用服务Principal(推荐生产环境)

# 配置OAuth认证
spark.conf.set("fs.azure.account.auth.type.teststorageaccount.dfs.core.windows.net", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type.teststorageaccount.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
# 替换为你的应用ID、密钥、租户ID
spark.conf.set("fs.azure.account.oauth2.client.id.teststorageaccount.dfs.core.windows.net", "<Client-ID>")
spark.conf.set("fs.azure.account.oauth2.client.secret.teststorageaccount.dfs.core.windows.net", "<Client-Secret>")
spark.conf.set("fs.azure.account.oauth2.client.endpoint.teststorageaccount.dfs.core.windows.net", "https://login.microsoftonline.com/<Tenant-ID>/oauth2/token")

4. 验证依赖是否正确加载

启动PySpark后,执行以下命令确认hadoop-azure相关jar包已加载:

sc.listJars()

在输出中查找包含hadoop-azure的jar条目,确保依赖成功引入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:27:40