本地使用s3://协议访问S3报No FileSystem异常,sbt需添加什么依赖?
问题复现
测试代码
import org.apache.hadoop.fs.Path import org.apache.hadoop.conf.Configuration new Path("s3://bucket/key").getFileSystem(new Configuration())
本地运行异常
No FileSystem for scheme "s3" org.apache.hadoop.fs.UnsupportedFileSystemException: No FileSystem for scheme "s3" at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:3336) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3356) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:123) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3407) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3375) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:486) at org.apache.hadoop.fs.Path.getFileSystem(Path.java:365)
现象说明
相同代码在EMR的spark-shell中可正常执行,返回的FileSystem实现为com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem,需求是本地和EMR环境统一使用s3://协议访问S3存储。
解决方案
你需要在sbt配置中添加AWS EMR专属的Maven仓库和对应依赖,操作步骤如下:
- 首先在sbt配置中添加EMR的Maven仓库
resolvers += "EMR Maven Repository" at "https://s3.us-west-2.amazonaws.com/us-west-2-emr-maven-repo/release/"
- 引入
emr-hadoop-fs依赖,版本需要和你使用的EMR集群对应的Hadoop版本对齐,示例如下(以3.3.2版本Hadoop为例):
libraryDependencies += "com.amazon.emr" % "emr-hadoop-fs" % "3.3.2-amzn-0"
- 若添加依赖后还是报协议不存在的错误,可手动在Hadoop配置中注册s3协议的实现类:
val conf = new Configuration() // 手动指定s3协议的实现类 conf.set("fs.s3.impl", classOf[com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem].getName) new Path("s3://bucket/key").getFileSystem(conf)
也可以将上述配置写入项目的resources/core-site.xml文件中,无需硬编码到代码里。
注意:依赖版本必须和你EMR集群的Hadoop版本保持一致,否则可能出现兼容性问题。
内容的提问来源于stack exchange,提问作者Prassi
相关产品推荐
相关产品推荐

