我正在尝试在尚未支持Spark 2的Cloudera集群上运行 Spark 2.1 应用程序。
我正在回答:
这似乎是正确的,但我在spark-submit
期间发现了一个奇怪的错误:
Exception in thread "main" java.lang.NoSuchMethodError: scala.runtime.IntRef.create(I)Lscala/runtime/IntRef;
at scopt.OptionParser.parse(options.scala:370)
at com.rxcorp.cesespoke.config.WasherConfig$.parse(WasherConfig.scala:22)
at com.rxcorp.cesespoke.Process$.main(Process.scala:27)
at com.rxcorp.cesespoke.Process.main(Process.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:729)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
使用Denis Makarenko answer提示我已添加:
spark-submit \
...
--conf 'spark.executor.extraJavaOptions=-verbose:class' \
--conf 'spark.driver.extraJavaOptions=-verbose:class' \
...
正如在答案中所说的那样 - 我们在这里运行错误的类路径!检查日志,我可以清楚地找到:
[Loaded scala.runtime.IntRef from file:/opt/cloudera/parcels/CDH-5.8.4-1.cdh5.8.4.p0.5/jars/spark-assembly-1.6.0-cdh5.8.4-hadoop2.6.0-cdh5.8.4.jar]
这显然是问题的根源。
从头开始仔细检查给定的帖子后:
你应该使用较新的Spark安装中的spark-submit(我' d 建议使用最新和最好的2.1.1撰写本文)和 捆绑所有Spark jar作为Spark应用程序的一部分。
所以这就是我要遵循的方式!
我还建议阅读: http://www.mostlymaths.net/2017/05/shading-dependencies-with-sbt-assembly.html
答案 0 :(得分:4)
线程“main”中的异常java.lang.NoSuchMethodError: scala.runtime.IntRef.create(I)Lscala /运行/ INTREF;
NoSuchMethodError通常表示jar版本不匹配。由于缺少的方法位于scala.runtime包中,因此很可能是因为使用一个版本的Scala编译代码(例如2.11)并使用另一个版本(2.10)运行它。
检查build.sbt中的Scala版本(scalaVersion:= ...)并使用-verbose:class参数运行JVM以确保这些Scala版本匹配。