1. 程式人生 > >編譯Spark原始碼與子專案GraphX中踩過的坑

編譯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
在這裡插入圖片描述
問題在於:直接安裝 Java 預設是 OpenJDK 版本,後面將證實需要SunJDK版本,具體區別見博文:Java知識點小結

安裝scala環境:sudo apt install scala

問題在於:不同的spark版本需要的scala對應的版本不同,預設安裝的版本不一定合適

核心點:一定要注意版本問題

下載原始碼

在官網上下載原始碼,不一定需要到github上:http://spark.apache.org/downloads.html
在這裡插入圖片描述
選擇合適的版本,這裡選擇spark-2.2.0版本

領悟:技術類的知識,官網是最好的選擇

編譯原始碼

領悟:技術類的知識,官網是最好的選擇,在官網上能迅速找到對應的編譯方式,而很多部落格講得很不全面,導致晦澀難懂

採用maven構建,命令為:

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

踩過的坑之maven編譯

  1. 依賴包下載失敗,後面將給出確切原因
    在這裡插入圖片描述


    查了很多博文,都說是因為wget版本問題,需要更新版本

    sudo apt-get install update
    

    然而並沒有什麼卵用,這種時候就應該好好讀編譯過程中的列印資訊,然後結合具體命令具體分析,而不能依賴搜尋。其實仔細看過之後發現,就是需要下載的依賴包沒法下載。

  2. 修改源:(有兩處需要修改!!)

    最開始按照網上的教程,只是修改了一處,導致仍然很慢。

    解決問題在於觀察編譯過程中的列印資訊,分析問題,發現maven在下載依賴包時的網址有時是修改前的,有時是修改後的,這說明沒有修改完全。

    另一方面,需要好好理解一下maven專案構建工具。

    在spark原始碼目錄下的pom.xml檔案中,將原始源修改為 :

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

    在這裡插入圖片描述

  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...
    

    在這裡插入圖片描述
    在這裡插入圖片描述
    處於還沒有開始編譯的狀態

    考慮:最開始想,這個問題大概是因為在下載mvn的依賴包時,scala的版本並不是使用的是scala-2.11.8版本。

    嘗試方案1: 刪除.m2資料夾中maven對應的repository資料夾並重新下載,仍然出現該問題,表明不是maven依賴包的問題。

    嘗試方案2: 解除安裝預設安裝的scala版本,檢視其版本為:

    在這裡插入圖片描述
    使用命令:

    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 
    


    版本修改完成。
    測試:依然報錯。

    考慮:除了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

在這裡插入圖片描述

在這裡插入圖片描述

問題應該在於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

在這裡插入圖片描述

編譯成功,生成可發行檔案壓縮包

在這裡插入圖片描述

編譯子專案

編譯其中一個子專案,採用官網上提供的方案,不需要全部編譯的命令是 :

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

在這裡插入圖片描述

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

至此,編譯spark原始碼和編譯spark單個子專案完成。