在仅支持 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 集群上运行