这个问题折磨了我一周都不止,梦里、坐地铁无时不刻都在思考着解决这个报错。今天终于解决了,写个日志分享出来。
首先贴程序代码:
package com.zhangcheng
import org.apache.spark._;
import java.net.InetAddress
/**
* Created by zhangcheng on 2017/6/1.
*/
object test1 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf();
val sc = new SparkContext(conf);
val rdd = sc.parallelize(List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 12);
def showName(): String = {
val host = InetAddress.getLocalHost.getHostName();
val thread = Thread.currentThread().getName();
host + ":" + thread
}
rdd.map { x => while (true) { println("=====>" + showName() + ":" + x) } }.collect
println("================> hello world");
println("================> hello world");
println("================> hello world");
println("================> hello world");
println("================> hello world");
println("================> hello world");
}
}
贴maven的pom.xml构建文件:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhangcheng</groupId>
<artifactId>myspark03</artifactId>
<version>1.0-SNAPSHOT</version>
<inceptionYear>2008</inceptionYear>
<properties>
<scala.version>2.11.8</scala.version>
</properties>
<repositories>
<repository>
<id>scala-tools.org</id>
<name>Scala-Tools Maven2 Repository</name>
<url>http://scala-tools.org/repo-releases</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>scala-tools.org</id>
<name>Scala-Tools Maven2 Repository</name>
<url>http://scala-tools.org/repo-releases</url>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.specs</groupId>
<artifactId>specs</artifactId>
<version>1.2.5</version>
<scope>test</scope>
</dependency>
</dependencies>
<reporting>
<plugins>
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<configuration>
<scalaVersion>${scala.version}</scalaVersion>
</configuration>
</plugin>
</plugins>
</reporting>
</project>
贴报错输出:
17/06/01 15:00:53 INFO client.StandaloneAppClient$ClientEndpoint: Executor updated: app-20170601150053-0003/1 is now RUNNING
17/06/01 15:00:53 INFO client.StandaloneAppClient$ClientEndpoint: Executor updated: app-20170601150053-0003/0 is now RUNNING
17/06/01 15:00:53 INFO client.StandaloneAppClient$ClientEndpoint: Executor updated: app-20170601150053-0003/2 is now RUNNING
17/06/01 15:00:54 INFO handler.ContextHandler: Started o.s.j.s.ServletContextHandler@7f9e1534{/metrics/json,null,AVAILABLE}
17/06/01 15:00:54 INFO cluster.StandaloneSchedulerBackend: SchedulerBackend is ready for scheduling beginning after reached minRegisteredResourcesRatio: 0.0
Exception in thread "main" java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: scala/runtime/java8/JFunction1$mcVI$sp
at com.zhangcheng.test1$.main(test1.scala:20)
at com.zhangcheng.test1.main(test1.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:738)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:187)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:212)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:126)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.NoClassDefFoundError: scala/runtime/java8/JFunction1$mcVI$sp
... 11 more
Caused by: java.lang.ClassNotFoundException: scala.runtime.java8.JFunction1$mcVI$sp
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 11 more
17/06/01 15:00:55 INFO spark.SparkContext: Invoking stop() from shutdown hook
17/06/01 15:00:55 INFO server.ServerConnector: Stopped ServerConnector@10e3d0ef{HTTP/1.1}{0.0.0.0:4040}
根据报错信息网上搜了下解决办法,貌似就只有一篇文章报类似这样的错误。原因是scala依赖包的版本和spark中的原生scala版本不一致。
恩,我也照着这个思路来分析问题,当然我也有更好的依据初步大概率判断是依赖冲突问题,《spark快速大数据分析》这本书中有讲到,贴出来:
“7.4.3 依赖冲突
当用户应用与Spark 本身依赖同一个库时可能会发生依赖冲突,导致程序崩溃。这种情况
不是很常见,但是出现的时候也让人很头疼。通常,依赖冲突表现为Spark 作业执行过
程中抛出NoSuchMethodError、ClassNotFoundException,或其他与类加载相关的JVM 异
常。对于这种问题,主要有两种解决方式:一是修改你的应用,使其使用的依赖库的版本
与Spark 所使用的相同,二是使用通常被称为“shading”的方式打包你的应用。Maven 构
建工具通过对例7-5 中使用的插件(事实上,shading 的功能也是这个插件取名为mavenshade-
plugin 的原因)进行高级配置来支持这种打包方式。shading 可以让你以另一个命名
空间保留冲突的包,并自动重写应用的代码使得它们使用重命名后的版本。这种技术有些
简单粗暴,不过对于解决运行时依赖冲突的问题非常有效。如果要了解使用这种打包方式
的具体步骤,请参阅你所使用的构建工具对应的文档。“
照着上面两种解决办法我查看了下我的各个软件版本:
1.spark
spark_core 2.11
version:2.1.1
2.scala
系统中安装的scala版本:scala 2.12.2
spark中集成的scala版本:scala 2.11.8
pom文件中的scala依赖库的版本是2.11.8没错,同时也将系统安装的scala重新装成2.12.2版本的。
最后将pom文件中的spark依赖库改成spark_core 2.11 version:2.1.1问题解决了。
大数据全套视频出售:http://blog.itpub.net/30522879/viewspace-2140406/