如何在非EMR环境下使用EMRFS S3-optimized committer?
问题根因
你之前引入的aws-java-sdk和aws-java-sdk-emr是AWS服务管理接口的SDK包,不包含EMRFS的实际实现类,com.amazon.ws.emr.hadoop.fs.EmrFileSystem属于AWS单独发布的EMR Hadoop文件系统专用包,公开Maven仓库没有默认托管这个包,所以会抛出类找不到异常。
解决步骤
- 第一步:获取EMRFS依赖包
你可以从Amazon EMR的公开镜像站下载对应你Hadoop版本的emrfs系列jar包,也可以直接从运行中的EMR集群的/usr/share/aws/emr/emrfs/lib/目录下拷贝所有相关jar包,包括emrfs.jar、emrfs-common.jar、emrfs-dynamodb.jar等全部关联依赖。 - 第二步:导入依赖到运行环境
如果是本地Maven项目,把下载的jar包安装到本地Maven仓库后,再在pom.xml中引入对应坐标即可;如果是自建集群环境,把所有EMRFS相关jar包放到所有节点的$HADOOP_HOME/share/hadoop/common/lib/目录下,或者添加到作业提交的依赖包列表中。 - 第三步:补充完整配置项
除了已配置的fs.s3a.impl之外,还需要添加以下必要配置才能正常启用EMRFS和S3优化提交器:<!-- 兼容s3协议前缀的实现配置 --> <property> <name>fs.s3.impl</name> <value>com.amazon.ws.emr.hadoop.fs.EmrFileSystem</value> </property> <property> <name>fs.AbstractFileSystem.s3.impl</name> <value>com.amazon.ws.emr.hadoop.fs.EmrFs</value> </property> <!-- AWS访问凭证配置,也可以通过环境变量、IAM角色等方式配置 --> <property> <name>fs.s3a.access.key</name> <value>你的AWS访问密钥AK</value> </property> <property> <name>fs.s3a.secret.key</name> <value>你的AWS访问密钥SK</value> </property> <!-- 启用S3优化提交器 --> <property> <name>spark.sql.sources.commitProtocolClass</name> <value>com.amazon.emr.committer.spark.S3OptimizedCommitter</value> </property> - 第四步:验证功能可用性
运行一个简单的Spark写S3的测试作业,检查作业运行日志是否有S3优化提交器的初始化日志,没有类不存在异常即可正常使用。
注意事项
- 不同版本的EMRFS和Hadoop、Spark版本有严格的适配关系,需要下载和你本地环境Hadoop、Spark版本匹配的EMRFS版本,否则可能出现类兼容性错误。
- 非EMR环境使用EMRFS不享受AWS官方的技术支持,生产环境使用前需要做充分的兼容性和稳定性测试。
内容的提问来源于stack exchange,提问作者Bodito
相关产品推荐
相关产品推荐

