问题描述
当spark源码编译完成,并导入IDEA后,打开 spark-examples 子模块,试图运行其中的 SparkPi 程序进行测试,发现各种报错,这些错提示 spark 依赖或者 scala 依赖的各种类找不到。为了解决这些问题,花了好几天时间,查了各种博客,大部分都解决不了我的问题 (网上博客等资料十有八九都是互相抄袭,来自亲身实践的很少,有真知灼见的就更少了)。大海捞针,也发现有一两篇,讲的虽不详细,但是提供了方向。
指导思想
需要为 spark-example 子模块提供 spark 其他模块的和 scala 依赖,虽然源码中各个子模块都编译成了jar包,但是 spark-examples 子模块在运行时,并未依赖到这些 jar。需要我们在 IDEA 中手动为他们加上。
添加依赖操作
1 添加jar包预备操作
在 IDEA 中 点击【File】---> 【Project Structure】--->【Project settings】---->【Modules】 选中 spark-examples,点击【Dependencies】 tab页.
2 首次添加jar包依赖
如上图,点击右侧红线框中的 “+”,添加依赖jar,选中 【1 Jar or directories】, 选中 assembly 子模块的 jars 目录,如下图所示
点击下方的【OK】
3 试运行 SparkPi
出现如下错误
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/jetty/util/thread/Scheduler
at org.apache.spark.ui.WebUI.attachPage(WebUI.scala:89)
at org.apache.spark.ui.WebUI$$anonfun$attachTab$1.apply(WebUI.scala:71)
at org.apache.spark.ui.WebUI$$anonfun$attachTab$1.apply(WebUI.scala:71)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
at org.apache.spark.ui.WebUI.attachTab(WebUI.scala:71)
at org.apache.spark.ui.SparkUI.initialize(SparkUI.scala:62)
at org.apache.spark.ui.SparkUI.<init>(SparkUI.scala:80)
at org.apache.spark.ui.SparkUI$.create(SparkUI.scala:178)
at org.apache.spark.SparkContext.<init>(SparkContext.scala:444)
at org.apache.spark.SparkContext$.getOrCreate(SparkContext.scala:2520)
at org.apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:935)
at org.apache.spark.sql.SparkSession$Builder$$anonfun$7.apply(SparkSession.scala:926)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.sql.SparkSession$Builder.getOrCreate(SparkSession.scala:926)
at org.apache.spark.examples.SparkPi$.main(SparkPi.scala:32)
at org.apache.spark.examples.SparkPi.main(SparkPi.scala)
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.util.thread.Scheduler
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 17 more
4 出错后补充依赖
出了错,不要紧,一步步解决,这个是报的 jetty 某个依赖找不到,在我们上面提到过的 【Dependencies】 tab 页,找到所有jetty相关的依赖,把他们的 scope 值都改为 compile ,点击【apply】,【OK】
运行验证
结果出来了,收工!