如何通过Maven成功运行依赖Databricks Connect的ScalaTest测试?
问题解决:Maven运行Databricks Connect测试时DBFS文件系统不支持错误
问题场景
我们有一个基于ScalaTest的Maven测试项目,测试用例通过Databricks Connect实现DBFS的读写操作。在IntelliJ中右键运行测试用例可成功执行,但执行mvn test命令时,抛出如下错误:
org.apache.hadoop.fs.UnsupportedFileSystemException: No FileSystem for scheme "dbfs" at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:3390) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3411) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:158) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3474) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3442) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:524) at org.apache.hadoop.fs.Path.getFileSystem(Path.java:365) at org.apache.spark.sql.execution.streaming.FileStreamSink$.hasMetadata(FileStreamSink.scala:46) at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:366) at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:297) ...
解决方案
1. 确认Databricks Connect依赖配置
IntelliJ可能自动加载了Databricks的FileSystem实现,但Maven测试阶段可能因依赖范围问题无法获取。在pom.xml中添加或确认以下依赖,版本需与你的Databricks集群版本匹配:
<dependency> <groupId>com.databricks</groupId> <artifactId>databricks-connect_2.12</artifactId> <version>对应集群版本号</version> <scope>test</scope> </dependency>
2. 添加Hadoop核心配置文件
在测试资源目录src/test/resources下创建core-site.xml,指定DBFS对应的FileSystem实现类:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property> <name>fs.dbfs.impl</name> <value>com.databricks.client.remote.RemoteDbfsFileSystem</value> </property> <property> <name>fs.dbfs.impl.disable.cache</name> <value>true</value> </property> </configuration>
该配置会让Hadoop识别dbfs://协议并使用Databricks提供的实现。
3. 配置Maven测试阶段的Databricks参数
在pom.xml的maven-surefire-plugin中添加JVM参数,传递Databricks工作区地址和访问令牌:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> <configuration> <argLine> -Dspark.databricks.service.address=你的Databricks工作区地址 -Dspark.databricks.service.token=你的访问令牌 </argLine> </configuration> </plugin> </plugins> </build>
也可以在测试类中通过代码初始化SparkSession时配置这些参数:
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .config("spark.databricks.service.address", "你的工作区地址") .config("spark.databricks.service.token", "你的访问令牌") .getOrCreate()
4. 排查依赖冲突
执行mvn dependency:tree查看依赖树,检查是否存在Hadoop相关依赖版本冲突。如果有,排除冲突的Hadoop依赖,确保Databricks提供的相关jar包优先加载。
内容的提问来源于stack exchange,提问作者user13800089
相关产品推荐
相关产品推荐

