使用Maven编译Spark源码

      本文主要介绍Linux系统下使用Maven编译Spark源码,以及可能会遇到的问题及解决。由于windows下编译的方法类似,只做粗略介绍,详细参考Linux的编译方法。spark源码为1.6.0版本。为什么用Maven不用sbt?因为一年前曾经尝试用过sbt,但是没成功,后来有别的事就把编译源码放下了,最近打算学习学习,由于之前失败的经历,这次使用的是Maven,虽然遇到不少问题,最后还是成功了。

Linux下编译Spark源码

准备:Maven和Spark源码包

1. Maven安装

1.1 首先下载Maven并解压,安装目录视情况而定,我放在了/usr/local目录下

$ wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
$ tar vxf apache-maven-3.3.9-bin.tar.gz
$ mv apache-maven-3.3.9 /usr/local/maven3

1.2 配置Linux环境变量

$ vim /etc/profile

加入下面两行

export MAVEN_HOME=/usr/local/maven3
export PATH=${PATH}:${MAVEN_HOME}/bin

执行 source /etc/profile,使环境变量生效。

执行 mvn -v验证maven是否安装成功,如果安装成功会打印相关内容

Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /usr/local/maven3
Java version: 1.7.0_75, vendor: Oracle Corporation
Java home: /usr/etc/jdk1.7.0_75/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-573.18.1.el6.x86_64", arch: "amd64", family: "unix"
1.3 修改Maven配置

为了编译源码速度更快 ,或者被墙的原因下载不到依赖,可以更改Maven仓库为国内地址。进入/usr/local/maven3文件夹,在conf目录中找到settings.xml 文件,配置mirrors的子节点,添加如下mirror

阿里云Maven镜像:

  
    nexus-aliyun  
    central    
    Nexus aliyun  
    http://maven.aliyun.com/nexus/content/groups/public  

2. Spark源码下载及编译

2.1 Github上搜Spark,下载对应版本,我这里下的是1.6.0,连接:apache/spark

使用Maven编译Spark源码_第1张图片

2.2 修改make-distribution.sh 文件

位置在下载的文件夹里

修改MVN="$MAVEN_HOME/bin/mvn"

2.3 修改spark源码的pom.xml文件,将Maven仓库改成阿里云仓库

Maven Repository

  https://maven.aliyun.com/nexus/content/groups/public/
  
  true
  

2.4 编译源码

cd 到spark的目录下

$ set MAVEN_OPTS=-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m

$ mvn -DskipTests clean package




漫长等待,短则20min,长则1~2小时

编译成功

使用Maven编译Spark源码_第2张图片

2.5 导入idea

File-->New-->Project From Existing Source-->选择你自己的Spark目录-->Import project from external model-->Maven ,然后一路Next,耐心等待一切完成。

找到examples下的sparkpi,运行。不出问题 完美;不成功看下一节

3.报错解决

3.1 控制台报错 Error:scalac:XXXXX

解决办法:View-->ToolWindows-->Maven Projects-->Reimport All Maven Projects-->选中出问题的模块-->Lifecycle-->clean-->右键Run MavenBuild
然后Ctrl + F9

解释:可能是进行了重复编译,具体原因不太清楚,

3.2 报错 java.lang.NoClassDefFoundError[3][5][6][7]

解决办法:在ProjectStructure-->Modules-->对应的Module-->Dependencies-->Scope, 从provided 改为compile。但是这样一个一个改实在太蠢了,可以直接修改spark-examples_2.11.iml,将里面的scope="PROVIDED"全都替换成空就可以了。如果改了不成功可能是对应的Module选错了,可以多弄几个相关的,看是否解决问题

解释:如果你的jar包/依赖代码 在编译的时候需要依赖,在运行的时候也需要,那么就用compile。如果你的jar包/依赖代码 仅在编译的时候需要,但是在运行时不需要依赖,就用providedCompile


这两个是我在编译过程中遇到的问题,如果遇到其他问题可以查看参看文章[3]。


Windows下编译Spark源码

方法和Linux下类似,Maven安装方法网上查找,其他步骤相同,就是将Linux的terminal改为windows的cmd。


参考文章

[1]     https://www.cnblogs.com/changwei0708/p/5820952.html

[2]     https://www.2cto.com/net/201703/608767.html

[3]     http://www.jianshu.com/p/6ad9dc90b7a5

[4]      http://blog.csdn.net/sdujava2011/article/details/50587170

[5]     https://stackoverflow.com/questions/33885339/noclassdeffounderror-scala-collection-seq

[6]     https://stackoverflow.com/questions/14417814/why-do-i-get-java-lang-noclassdeffounderror-when-i-trying-to-run-this-code

[7]     https://www.2cto.com/kf/201702/597500.html





你可能感兴趣的:(Spark学习)