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

EMR Serverless运行Spark读取S3 Parquet报NoClassDefFoundError求助

问题原因与解决方案

问题原因

  1. 缺失AWS SDK v2的S3 Transfer Manager依赖:software.amazon.awssdk.transfer.s3.progress.TransferListener是AWS SDK for Java v2中s3-transfer-manager模块的类,你当前传入的aws-java-sdk-bundle-1.12.569.jar属于AWS SDK v1,完全不包含这个类。
  2. EMR环境与手动依赖版本冲突:Serverless EMR 6.15.0(对应Hadoop 3.3.4)默认使用AWS SDK v2作为S3客户端的依赖,但你手动传入的AWS SDK v1包会干扰环境自带的v2组件加载,导致必要的v2类无法找到。
  3. 本地与EMR环境依赖不一致:本地运行正常是因为你的项目构建时已经包含了AWS SDK v2的s3-transfer-manager相关依赖,但部署到EMR时没有将这些依赖一同传入。

解决方案

  • 移除手动传入的AWS SDK v1包:EMR 6.15.0已经预装了与Hadoop 3.3.4兼容的AWS SDK v2组件,不需要手动传入aws-java-sdk-bundle-1.12.569.jar和aws-java-sdk-1.12.569.jar。修改spark.jars配置,只保留必要的依赖(如果确实需要自定义hadoop-aws,确保版本与EMR一致,否则建议直接使用环境自带的):
    --conf spark.jars=s3://<bucket>/<prefix>/aws-crt-0.28.10.jar
    
  • 补充AWS SDK v2的必要依赖:如果必须手动管理依赖,需要添加AWS SDK v2的s3-transfer-manager及相关核心jar包(版本需与Hadoop 3.3.4兼容,建议使用EMR 6.15.0对应的版本,如2.20.149):
    • aws-sdk-s3-transfer-manager-2.20.149.jar
    • aws-sdk-s3-2.20.149.jar
    • aws-sdk-core-2.20.149.jar
      将这些jar包上传到S3后,更新spark.jars配置包含它们。
  • 避免类加载冲突:不要同时混合AWS SDK v1和v2的包,EMR环境默认使用v2,优先依赖环境自带组件,不要手动传入v1包引发版本冲突。

内容的提问来源于stack exchange,提问作者ferrari16

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 18:33:13