Databricks Connect访问abfss协议报错:No FileSystem for scheme: abfss
这个问题其实很常见——虽然你的代码是远程在Azure Databricks集群执行,但Databricks Connect的本地客户端环境需要具备识别abfss协议的能力,否则会因为找不到对应FileSystem实现抛出错误。下面是一步步的解决方案:
1. 确保本地项目依赖包含Azure Storage适配包
Databricks集群默认已经包含了访问ABFS的依赖,但你的本地IntelliJ项目需要同步这些依赖才能让客户端正确识别abfss协议。
如果用Maven,在pom.xml中添加以下依赖(版本要和你的Databricks Runtime对应的Hadoop版本匹配,比如Runtime 11.3对应Hadoop 3.3.2):
<dependencies> <!-- Hadoop Azure适配包 --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-azure</artifactId> <version>3.3.2</version> </dependency> <!-- Azure Storage SDK --> <dependency> <groupId>com.microsoft.azure</groupId> <artifactId>azure-storage</artifactId> <version>8.6.6</version> </dependency> </dependencies>
如果用Gradle,对应的配置是:
dependencies { implementation 'org.apache.hadoop:hadoop-azure:3.3.2' implementation 'com.microsoft.azure:azure-storage:8.6.6' }
2. 同步集群的Hadoop配置到本地
Azure Databricks集群已经配置好了abfss的相关参数,但你的本地Databricks Connect环境可能没有同步这些配置。你可以:
- 从Azure Databricks集群的Spark配置页面导出
core-site.xml文件(集群详情页面 → 高级选项 → Spark → 配置,找到Hadoop核心配置) - 将
core-site.xml放到本地Hadoop的配置目录(比如%HADOOP_HOME%\etc\hadoop或者~/hadoop/etc/hadoop),或者在代码中显式设置这些配置:
// 在初始化SparkSession前添加 val sparkConf = new SparkConf() .set("fs.abfss.impl", "org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem") .set("fs.azure.account.auth.type.<your-storage-account>.dfs.core.windows.net", "OAuth") .set("fs.azure.account.oauth.provider.type.<your-storage-account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider") .set("fs.azure.account.oauth2.client.id.<your-storage-account>.dfs.core.windows.net", "<your-service-principal-client-id>") .set("fs.azure.account.oauth2.client.secret.<your-storage-account>.dfs.core.windows.net", "<your-service-principal-secret>") .set("fs.azure.account.oauth2.client.endpoint.<your-storage-account>.dfs.core.windows.net", "https://login.microsoftonline.com/<your-tenant-id>/oauth2/token") val spark = SparkSession.builder() .config(sparkConf) .getOrCreate()
3. 验证Databricks Connect版本兼容性
确保你本地安装的Databricks Connect版本完全匹配Azure Databricks集群的Runtime版本。版本不匹配会导致依赖或配置的兼容性问题,比如本地客户端的Hadoop版本和集群不一致,就会出现FileSystem识别错误。
可以通过以下命令检查本地版本:
databricks-connect version
然后对比集群的Runtime版本,不一致的话重新安装对应版本的Databricks Connect。
4. 代码中显式指定FileSystem实现
如果上述步骤都做了还是有问题,可以在代码中强制指定abfss对应的FileSystem类,确保客户端能正确识别:
spark.sparkContext.hadoopConfiguration.set("fs.abfss.impl", "org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem")
执行完这些步骤后,再尝试读取abfss路径,应该就能正常访问Azure Data Lake Storage了。
内容的提问来源于stack exchange,提问作者zaxme

