Spark源码编译: 在IDEA中运行 spark-examples 模块源码

问题描述

        当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】

运行验证

结果出来了,收工!

猜你喜欢

转载自blog.csdn.net/dinghua_xuexi/article/details/106264893