在集群上运行Fat Jar和Spark 2.0,只支持Spark 1.6

时间:2017-07-10 16:13:22

标签: scala apache-spark classpath cloudera apache-spark-2.0

我正在尝试在尚未支持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

1 个答案:

答案 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版本匹配。