Spark源码阅读环境搭建

一、写在前面

  为什么要阅读源码?这个问题对于热爱、学习、使用技术的程序er的重要性不言而喻:不懂原理只会使用就是重复劳动的码农,技术长进不大,以后也会碰到职业天花板。所以我们就开始吧!

  环境如下:

  • JVM:JDK 1.8.0_144
  • Scala:2.12.10
  • Spark:spark-3.0.0-preview
  • IDE:IntelliJ IDEA 2017.2.3

二、搭建步骤

1.下载源码并解压

下载地址: http://spark.apache.org/downloads.html

目前(2019年12月23日)尚未发布3.0.0正式版,先下载preview版本阅读学习。

微信截图_20191223164416.png

2.修改Spark源码下的pom.xml文件

打开Spark源码下的pom.xml文件,修改对应的JDK版本和maven版本

2019-12-23_165111.png

Spark源文件中有多个pom.xml,只需要改根目录下的pom.xml文件就可以了。完成修改后,就能开始编译了。

3.导入源码到IDEA

1.png

勾选对应的选项框

5.png

添加yarnhadoop2.7选项,其他默认即可。

6.png

下一步默认:

点击finished的之后,需要等待比较长时间(我使用了几个小时)的编译过程。

4.下载Maven依赖

  工程导入之后,依次点击右侧Maven Project——Generate Sources and Update Folders For All Projects,点击之后Maven会下载编译需要的源码,需要等待一段时间,长短依赖网络好坏。

8.png

5.build工程

问题1:scala-xml问题

1
2
3
Error:(48, 9) To compile XML syntax, the scala.xml package must be on the classpath.
Please see https://github.com/scala/scala-xml for details.
<br/> ++

build错误.png

确保依赖:

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>

<dependency>
<groupId>org.scala-lang.modules</groupId>
<artifactId>scala-xml_2.12</artifactId>
<version>1.2.0</version>
</dependency>

点击Maven Projects——Reimport All Maven Projects

具体可查看: https://github.com/scala/scala-xml 的文档说明及issues

问题2:NoClassDefFoundError

1
2
3
4
5
6
7
8
9
10
"H:\Program Files\jdk8\bin\java" "-javaagent:..."
org.apache.spark.examples.SparkPi
Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/Seq
at org.apache.spark.examples.SparkPi.main(SparkPi.scala)
Caused by: java.lang.ClassNotFoundException: scala.collection.Seq
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more

原因: SDK没有找到SCALA的库(lib),导致找不到类

解决方法: 在项目中的SDK中添加SCALA的库(scala-library)

找不到类错误.png

问题3:找不到SparkSession

1
2
3
4
5
6
7
8
9
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/sql/SparkSession$
at org.apache.spark.examples.SparkPi$.main(SparkPi.scala:28)
at org.apache.spark.examples.SparkPi.main(SparkPi.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.SparkSession$
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 2 more

解决:在Modules中的spark-examples_2.12中的Dependencies中,把所有依赖范围Scope是Provided和Runtime的全部改成Compile,Test的不用修改。

问题3.png

参考:IntelliJ Runtime error

问题4:A master URL must be set in your configuration

问题4.png

  点击edit configuration,在左侧点击该项目。在右侧VM options中输入-Dspark.master=local,作用是指定本程序本地单线程运行,再次运行即可。

问题4-2.png

之后就可以正常运行Spark的example例子了。

参考:Maven编译打包spark(2.1.0)源码及出现问题的解决方案(win7+Intellij IDEA)

谢谢你请我吃糖果!
0%