在仅支持 Spark 1.6 的集群上运行带有 Spark 2.0 的 Fat Jar

Posted

技术标签:

【中文标题】在仅支持 Spark 1.6 的集群上运行带有 Spark 2.0 的 Fat Jar【英文标题】:Running Fat Jar with Spark 2.0 on cluster with only Spark 1.6 support 【发布时间】:2017-07-10 16:13:21 【问题描述】:

我正在尝试在尚不支持 Spark 2 的 Cloudera 集群上运行 Spark 2.1 应用程序。

我在关注答案:

https://***.com/a/44434835/1549135 https://***.com/a/41359175/1549135

这似乎是正确的,但是我在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(我会 建议在撰写本文时使用最新最好的 2.1.1)和 将所有 Spark jar 捆绑为 Spark 应用程序的一部分。

所以这就是我将遵循的方式!

我还建议阅读: http://www.mostlymaths.net/2017/05/shading-dependencies-with-sbt-assembly.html

【问题讨论】:

【参考方案1】:

线程“主”java.lang.NoSuchMethodError 中的异常: scala.runtime.IntRef.create(I)Lscala/runtime/IntRef;

NoSuchMethodError 通常表示 jar 版本不匹配。由于缺少的方法位于 scala.runtime 包中,因此问题很可能是由使用 Scala 的一个版本(例如 2.11)编译代码并使用另一个版本(2.10)运行它引起的。

检查 build.sbt (scalaVersion := ...) 中的 Scala 版本并使用 -verbose:class 参数运行 JVM 以确保这些 Scala 版本匹配。

【讨论】:

以上是关于在仅支持 Spark 1.6 的集群上运行带有 Spark 2.0 的 Fat Jar的主要内容,如果未能解决你的问题,请参考以下文章

Zeppelin+Spark+Kubernetes:让 Zeppelin Job 在现有的 Spark 集群上运行

关于在集群 (AWS) 上运行 Spark 作业的说明

Spark在Hadoop集群上运行时虚拟内存超出限制

在spark集群上可以同时运行多个提交的应用程序吗

Spark 2.0 将 json 读入带有引号的数据帧中 - 与 spark 1.6 不同的行为......错误?

Spark集群任务提交