自托管Spark集群用--packages加载gcs-connector访问GCS报错求解
问题根因
该java.lang.NoSuchMethodError报错本质是Guava依赖版本冲突:
- Spark 3.1.2内置的Guava版本为11.x/14.x这类低版本,而gcs-connector hadoop3-2.2.2依赖的Guava版本为27.1+,高版本的
Preconditions类新增了带long类型参数的checkArgument重载方法,低版本Guava不存在该方法,运行时优先加载Spark内置的低版本Guava就会抛出对应错误。 - 用本地
--jars指定预下载的jar可正常运行的原因是:官方预编译的gcs-connector发行包是shaded版本,已经把自身依赖的Guava等三方包重命名打包到内部,不会和Spark内置的依赖冲突;而通过--packages拉取的Maven公共仓库的com.google.cloud.bigdataoss:gcs-connector是未shade的版本,会主动拉取公共依赖的Guava,和Spark内置版本冲突。
解决方案
方案1:优先加载用户提交的依赖(推荐)
提交作业时新增以下两个配置参数,让Spark优先加载你通过--packages引入的高版本Guava,避免调用内置的低版本:
--conf spark.driver.userClassPathFirst=true --conf spark.executor.userClassPathFirst=true
完整提交示例参考:
spark-submit \ --packages org.apache.spark:spark-avro_2.12:3.1.2,com.google.cloud.bigdataoss:gcs-connector:hadoop3-2.2.2 \ --conf spark.hadoop.fs.gs.impl=com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem \ --conf spark.hadoop.fs.AbstractFileSystem.gs.impl=com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS \ --conf spark.driver.userClassPathFirst=true \ --conf spark.executor.userClassPathFirst=true \ 你的作业主类/作业jar路径
注意:如果集群有其他自定义依赖冲突,该配置可能引发其他兼容问题,可优先尝试方案2
方案2:直接拉取shaded版本的gcs-connector
Maven仓库也提供已经完成shade处理的gcs-connector版本,直接指定带shaded分类器的依赖即可,不需要修改类加载优先级:
把--packages里的gcs-connector依赖替换为:com.google.cloud.bigdataoss:gcs-connector:hadoop3-2.2.2:shaded
完整提交示例:
spark-submit \ --packages org.apache.spark:spark-avro_2.12:3.1.2,com.google.cloud.bigdataoss:gcs-connector:hadoop3-2.2.2:shaded \ --conf spark.hadoop.fs.gs.impl=com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem \ --conf spark.hadoop.fs.AbstractFileSystem.gs.impl=com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS \ 你的作业主类/作业jar路径
方案3:手动排除冲突的Guava依赖
如果前面两种方案都不适用,可以在提交时显式排除gcs-connector传递依赖的Guava,同时单独引入兼容的高版本Guava:
spark-submit \ --packages org.apache.spark:spark-avro_2.12:3.1.2,com.google.guava:guava:27.1-jre,\ com.google.cloud.bigdataoss:gcs-connector:hadoop3-2.2.2 \ --exclude-packages com.google.guava:guava \ --conf spark.hadoop.fs.gs.impl=com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem \ --conf spark.hadoop.fs.AbstractFileSystem.gs.impl=com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS \ 你的作业主类/作业jar路径
内容的提问来源于stack exchange,提问作者uchiiii
相关产品推荐
相关产品推荐

