【发布时间】:2020-04-12 20:51:13
【问题描述】:
我的项目中的 jar 与 spark-2.4.0 jars 文件夹中的 jar 存在冲突。我的改造带来了okhttp-3.13.1.jar(在 mvn 依赖关系中验证:树)但服务器中的 spark 有okhttp-3.8.1.jar,我得到NoSuchMethodException。所以,我试图明确地给我的 jar 以覆盖它。当我尝试在 client 模式下运行 spark submit 命令时,它会获取我提供的显式 jar,但是当我尝试在 cluster 模式下运行相同的 jar 时,这无法覆盖工作节点上的 jar,并且执行程序使用同一个旧 jar 的 Spark 导致NoSuchMethodError。我的罐子是一个胖罐子,但火花罐不知何故优先于同一个罐子。如果我可以删除 Spark 提供的 jar,它可能会起作用,但我不能,因为其他服务可能正在使用它。
以下是我的命令:
./spark-submit --class com.myJob --conf spark.yarn.appMasterEnv.ENV=uat --conf spark.driver.memory=12g --conf spark.executor.memory=40g --conf spark.sql.warehouse.dir=/user/myuser/spark-warehouse --conf "spark.driver.extraClassPath=/home/test/okhttp-3.13.1.jar" --conf "spark.executor.extraClassPath=/home/test/okhttp-3.13.1.jar" --jars /home/test/okhttp-3.13.1.jar --conf spark.submit.deployMode=cluster --conf spark.yarn.archive=hdfs://namenode/frameworks/spark/spark-2.4.0-archives/spark-2.4.0-archive.zip --conf spark.master=yarn --conf spark.executor.cores=4 --queue public file:///home/mytest/myjar-SNAPSHOT.jar
final Retrofit retrofit = new Retrofit.Builder()
.baseUrl(configuration.ApiUrl()) //this throws nosuchmethodexception
.addConverterFactory(JacksonConverterFactory.create(new ObjectMapper()))
.build();
我的 mvn 依赖项:tree 不表示我的 jar 中的任何其他传递 jar。它在 IntelliJ 以及 mvn clean install 的本地运行良好。
我什至尝试提供 jars (hdfs://users/myuser/myjars/okhttp-3.13.1.jar) 的 hdfs 路径,但没有成功。有人可以发光吗?
如果我同时尝试--conf "spark.driver.userClassPathFirst=true" --conf "spark.executor.userClassPathFirst=true",我会得到以下异常
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.apache.spark.deploy.yarn.YarnSparkHadoopUtil$.<init>(YarnSparkHadoopUtil.scala:48)
at org.apache.spark.deploy.yarn.YarnSparkHadoopUtil$.<clinit>(YarnSparkHadoopUtil.scala)
at org.apache.spark.deploy.yarn.Client$$anonfun$1.apply$mcJ$sp(Client.scala:81)
at org.apache.spark.deploy.yarn.Client$$anonfun$1.apply(Client.scala:81)
at org.apache.spark.deploy.yarn.Client$$anonfun$1.apply(Client.scala:81)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.deploy.yarn.Client.<init>(Client.scala:80)
at org.apache.spark.deploy.yarn.YarnClusterApplication.start(Client.scala:1526)
at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:849)
at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:167)
at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:195)
at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86)
at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:924)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:933)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassCastException: org.apache.hadoop.yarn.api.records.impl.pb.PriorityPBImpl cannot be cast to org.apache.hadoop.yarn.api.records.Priority
at org.apache.hadoop.yarn.api.records.Priority.newInstance(Priority.java:39)
at org.apache.hadoop.yarn.api.records.Priority.<clinit>(Priority.java:34)
... 15 more
但如果我只有--conf "spark.executor.userClassPathFirst=true",那么它就会挂起
【问题讨论】:
-
你试过设置
spark.driver.userClassPathFirst=true/spark.executor.userClassPathFirst=true吗?请注意潜在的灾难性副作用:) -
我尝试了上述建议,但又遇到了另一个异常。现在添加到描述中..请检查
-
这就是灾难性副作用的样子,尤其是当您构建一个依赖版本与目标环境不同的胖 jar 时。
-
请给我一些建议来缓解这个问题?
-
为什么 jar 覆盖在客户端模式下即使没有 userClassPathFirst=true 也能正常工作,但在集群模式下却不起作用?
标签: maven apache-spark hdfs dependency-management spark-submit