Spark NLP加载预训练模型报AmazonClientException类缺失错误求助
问题根因
报错核心是抛出java.lang.ClassNotFoundException: com.amazonaws.AmazonClientException,属于JVM运行时类缺失错误:
Spark NLP的预训练模型默认托管在AWS S3存储上,拉取模型时需要调用AWS SDK的S3客户端逻辑,而你用的开源版Spark 3.2.1默认不会自带AWS SDK相关依赖包,类路径下找不到对应类就会直接报错。这个问题和操作系统(Windows/Linux)无关,也不是你配的系统环境变量有问题。
可落地解决步骤
按优先级从高到低试,第一个方法就能解决90%以上的同类问题:
- 方法1:初始化Spark会话时自动加载缺失的AWS依赖
不要直接用无参数的sparknlp.start(),启动时通过spark_jars_packages参数指定和组件版本匹配的AWS SDK依赖,会自动从Maven仓库拉取对应jar包到本地缓存:- 用Spark NLP 4.0.0版本时,启动代码替换为:
spark = sparknlp.start( spark_jars_packages="com.amazonaws:aws-java-sdk-core:1.12.200,com.amazonaws:aws-java-sdk-s3:1.12.200" )- 用Spark NLP 3.4.4版本时,启动代码替换为:
上面列的SDK版本和Spark 3.2.1、对应Spark NLP版本的依赖树完全匹配,不会出现依赖冲突报错。spark = sparknlp.start( spark_jars_packages="com.amazonaws:aws-java-sdk-core:1.11.874,com.amazonaws:aws-java-sdk-s3:1.11.874" ) - 方法2:手动补全依赖包到Spark目录
如果本地环境没法自动拉取Maven依赖,手动下载对应版本的aws-java-sdk-core、aws-java-sdk-s3两个jar包,直接放到Spark安装路径下的jars目录里,重启Python环境再跑原代码即可。注意两个jar包的版本必须完全一致,不要混装不同版本的AWS SDK组件。 - 方法3:跳过在线下载逻辑,加载本地模型
如果网络环境无法正常访问S3存储,提前把需要的预训练模型文件下载到Spark NLP的默认缓存目录,加载时会优先读取本地文件,不会触发S3下载逻辑,也就不会加载AWS SDK相关类:- Linux系统缓存路径:
~/.cache/spark-nlp - Windows系统缓存路径:
C:\Users\你的当前用户名\.cache\spark-nlp
把模型文件按官方的目录结构放到对应路径下即可正常加载。
- Linux系统缓存路径:
注意事项
- 你当前用的Java 8是适配这套组件版本的最优选择,不要升级到Java 11/17,会出现额外的依赖兼容问题。
- 不要只安装Python端的
spark-nlp包就直接运行代码,Python端只是API封装,核心运行逻辑依赖JVM侧的Spark NLP jar包和对应第三方依赖。 - 如果补全依赖后出现S3连接超时、权限拒绝类报错,不属于类缺失问题,是网络访问限制导致的,直接用方法3加载本地模型即可。
内容的提问来源于stack exchange,提问作者Luqman
相关产品推荐
相关产品推荐

