编译Spark源码与子项目GraphX中踩过的坑

编译Spark源码与子项目GraphX中踩过的坑

原始目标:在三台虚拟机上真实分布式安装spark平台,并通过修改graphx对应的源码,观察graphx的分布式性能,为进一步做图划分做准备。

官网文档:http://spark.apachecn.org/docs/cn/2.2.0/building-spark.html

首先肯定是安装环境了

据其他博客了解到需要安装java1.8以上版本,scala环境,于是自以为聪明的上来直接系统默认安装了。

环境:VM虚拟机,ubuntu18.04 LTS

安装java环境:sudo apt install default-jdk
编译Spark源码与子项目GraphX中踩过的坑
问题在于:直接安装 Java 默认是 OpenJDK 版本,后面将证实需要SunJDK版本,具体区别见博文:Java知识点小结

安装scala环境:sudo apt install scala

问题在于:不同的spark版本需要的scala对应的版本不同,默认安装的版本不一定合适

核心点:一定要注意版本问题

下载源代码

在官网上下载源码,不一定需要到github上:http://spark.apache.org/downloads.html
编译Spark源码与子项目GraphX中踩过的坑
选择合适的版本,这里选择spark-2.2.0版本

领悟:技术类的知识,官网是最好的选择

编译源码

领悟:技术类的知识,官网是最好的选择,在官网上能迅速找到对应的编译方式,而很多博客讲得很不全面,导致晦涩难懂

采用maven构建,命令为:

build/mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.5 -DskipTests clean package

踩过的坑之maven编译

  1. 依赖包下载失败,后面将给出确切原因
    编译Spark源码与子项目GraphX中踩过的坑
    查了很多博文,都说是因为wget版本问题,需要更新版本

    sudo apt-get install update
    

    然而并没有什么卵用,这种时候就应该好好读编译过程中的打印信息,然后结合具体命令具体分析,而不能依赖搜索。其实仔细看过之后发现,就是需要下载的依赖包没法下载。

  2. 修改源:(有两处需要修改!!)

    最开始按照网上的教程,只是修改了一处,导致仍然很慢。

    解决问题在于观察编译过程中的打印信息,分析问题,发现maven在下载依赖包时的网址有时是修改前的,有时是修改后的,这说明没有修改完全。

    另一方面,需要好好理解一下maven项目构建工具。

    在spark源码目录下的pom.xml文件中,将原始源修改为 :

    <http://maven.aliyun.com/nexus/content/groups/public/> 
    

    编译Spark源码与子项目GraphX中踩过的坑

  3. 如果使用的scala版本为2.11,需要执行dev目录下的脚本

    ./change-scala-version.sh 2.11
    

    没有执行的话,可能会出现一些问题

  4. 编译过程中需要自动下载文件

    scala-2.11.8https://downloads.typesafe.com/scala/2.11.8/scala-2.11.8.tgz

    zinc-0.3.11https://downloads.typesafe.com/zinc/0.3.11/zinc-0.3.11.tgz

    在第一个坑的基础之上,发现更新之后仍然不行,最后发现无法下载的原因在于被墙了而不是wget的问题,开启socks全局模式可以解决,也可以定向增加定向开启socks的网址。直接手动在浏览器上下载,然后放置到对应的位置 build 目录下。

  5. 顺利下载了所有的依赖,但是编译出现问题

    'compiler-interface' not yet compiled for Scala 2.11.8. Compiling...
    

    编译Spark源码与子项目GraphX中踩过的坑
    编译Spark源码与子项目GraphX中踩过的坑
    处于还没有开始编译的状态

    考虑:最开始想,这个问题大概是因为在下载mvn的依赖包时,scala的版本并不是使用的是scala-2.11.8版本。

    尝试方案1: 删除.m2文件夹中maven对应的repository文件夹并重新下载,仍然出现该问题,表明不是maven依赖包的问题。

    尝试方案2: 卸载默认安装的scala版本,查看其版本为:

    编译Spark源码与子项目GraphX中踩过的坑
    使用命令:

    sudo apt-get remove scala* 
    

    卸载默认安装的scala

    配环境的时候,最好要安装特定版本,不能图省事安装默认版本,否则后患无穷,使用安装包自行配置安装特定版本比较好

    重新安装scala-2.11.8

    将scala-2.11.8的安装包拷贝至 /home/wj/app 下

    ~/.bashrc 文件中添加:

    export SCALA_HOME=/home/wj/app/scala-2.11.8
    export PATH=${SCALA_HOME}/bin:$PATH
    

    使修改生效:

     source ~/.bashrc 
    

    编译Spark源码与子项目GraphX中踩过的坑
    版本修改完成。
    测试:依然报错。

    考虑:除了scala外,还有java版本问题,maven只是构建工具应该不会和编译过程有关系。

    尝试方案3 : 可能是jdk的版本问题,不使用OpenJDK换用SunJDK进行实验

    在全新的ubuntu16.04环境中编译成功

    然后,在ubuntu18.04下卸载默认安装的java版本:

    sudo apt-get remove java* 
    

    安装新的java版本

    在java官网下载安装包,并安装至 /home/wj/app/ 下。

    ~/.bashrc 文件中添加以下内容:

    export JAVA_HOME=/home/wj/app/jdk1.8.0_181
    export JRE_HOME=/home/wj/app/jdk1.8.0_181/jre
    export PATH={JAVA_HOME}/bin:{JRE_HOME}/bin:$PATH
    

    使修改生效:

    source ~/.bashrc
    

    编译成功

    另外,在spark-2.2.0上测试完成之后,在最新的github上的spark-master上进行了测试。

    编译 spark-master:

    需要scala版本为2.11.12

    需要zinc版本为0.3.15

    编译成功

编译并构建可发行版本

Spark源码中提供了多种构建方式,本文中采用maven构建,sbt易出现错误,以来太多难以下载。按照上述方法进行配置,maven编译过程不会出错。接下来的实验是构建可发行脚本和编译单个子项目,仅使用标准spark-2.2.0版本进行。

可以通过spark中自带的编译脚本

 ./dev/make-distribution.sh 

构建一个可发行的版本,但是按照官网上给出的命令,中间会出现错误

./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Psparkr -Phadoop-2.7 -Phive -Phive-thriftserver -Pmesos -Pyarn

编译Spark源码与子项目GraphX中踩过的坑

编译Spark源码与子项目GraphX中踩过的坑

问题应该在于R语言没有安装,去掉R语言接口(-Psparkr 和 --r)的生成

./dev/make-distribution.sh --name custom-spark --pip --tgz -Phadoop-2.7 -Phive -Phive-thriftserver -Pmesos –Pyarn

参数行-Psparkr用于支持R语言运行在spark上的库
参数行--r和--pip分别用于支持R语言和Python语言

如果需要编译支持R语言的spark,需要安装R插件,参照如下文章:

https://blog.csdn.net/sddyljsx/article/details/81051078

编译成功,但是没有成功构建发行包,需要安装python及其相关安装包setuptools

编译Spark源码与子项目GraphX中踩过的坑

编译成功,生成可发行文件压缩包

编译Spark源码与子项目GraphX中踩过的坑

编译子项目

编译其中一个子项目,采用官网上提供的方案,不需要全部编译的命令是 :

./build/mvn -pl :spark-graphx_2.11 clean install

编译Spark源码与子项目GraphX中踩过的坑

将生成的graphx的包spark-graphx_2.11-2.2.0.jar替换就可以了。

至此,编译spark源码和编译spark单个子项目完成。