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

本地使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:54:04