1. 程式人生 > >編譯spark原始碼的方法,及編譯、案例測試問題總結

編譯spark原始碼的方法,及編譯、案例測試問題總結

一、編譯spark方法

1.編譯環境
首先,需要安裝jdk、maven,相關安裝教程請參考:http://blog.csdn.net/u012829611/article/details/77651855
http://blog.csdn.net/u012829611/article/details/77678609
筆者安裝的jdk1.7、maven3.3.9.
然後,在官網下載spark原始碼(http://spark.apache.org/downloads.html),我這裡選擇的版本是spark-1.6.2.tgz
把原始碼包解壓:

    [root@localhost soft-cy]# tar -zxvf spark-1.6.2.tgz
[root@localhost soft-cy]# cd spark-1.6.2

2.兩種編譯方法
①用build/mvn 來編譯(採用)

[root@localhost spark-1.6.2]# build/mvn -Pyarn -Phadoop-2.7 -Dhadoop.version=2.7.3 -DskipTests clean package

(-Pyarn 提供yarn支援 ,—Phadoop-2.7 提供Hadoop支援,並且指定hadoop的版本2.7.3)
這裡寫圖片描述
編譯完成後,你會發現在assembly/target/scala-2.10目錄下面有一個spark-assembly-1.6.2-hadoop2.7.3.jar包,這個就是編譯的結果。

②用make-distributed 指令碼來編譯

[[email protected] spark-1.6.2]# ./make-distribution.sh --name spark-1.6.2 --skip-java-test --tgz -Pyarn -Dhadoop.version=2.7.3 -Phive -Phive-thriftserver

編譯完原始碼後,雖然直接用編譯後的目錄再加以配置就可以執行spark,但是這時目錄很龐大,部署起來很不方便,所以需要生成部署包。生成在部署包位於根目錄下,檔名類似於 spark–bin-spark-1.6.2.tgz 。

二、編譯遇到問題總結

1.依賴包下載不下來的問題
如下圖,顯示一些相關依賴包下載不下來,即downloading過程中停止
這裡寫圖片描述
【解決方法】:手動下載相關依賴包,並放到指定目錄下即可。
以上圖中第一個依賴包為例Downloading:https://repo1.maven.org/maven2/org/apache/curator/curator-test/2.4.0/curator-test-2.4.0.jar
具體下載方法如下:從上面下載連結中可以看出依賴包存放的目錄(/root/.m2/repository/org/apache/curator/curator-test/2.4.0),上面連結中加粗的部分。因此,直接cd到相應目錄,wget即可。

[root@localhost ~]# cd /root/.m2/repository/org/apache/curator/curator-test/2.4.0
[root@localhost 2.4.0]# wget https://repo1.maven.org/maven2/org/apache/curator/curator-test/2.4.0/curator-test-2.4.0.jar

:用maven進行編譯時,下載的相關依賴包都放在maven庫中,maven庫的目錄為:/root/.m2/repository

2.通過編輯pom.xml檔案,註釋相應的module,可以編譯時跳過相應的Project,這樣可以方便除錯。

這裡寫圖片描述

3.使用第二種方法編譯時,會報如下錯:

這裡寫圖片描述

解決方法:編輯make-distribution.sh檔案,註釋掉下圖中陰影部分,儲存即可。

這裡寫圖片描述

參考文件:
http://blog.csdn.net/yanran1991326/article/details/46506595
http://blog.csdn.net/ouyangyanlan/article/details/52355350

三、案例測試問題

spark編譯成功後,cd到 spark1.6.2/bin 目錄下,執行 spark-shell 命令啟動spark,進入scala命令模式。執行案例測試,輸入 sc.parallelize(1 to 1000).count() 命令,會報下圖中錯誤:

這裡寫圖片描述

[root@node1 spark-1.6.2]# cd bin/
[root@localhost bin]# spark-shell
scala> sc.parallelize(1 to 1000).count()

錯誤資訊:“org.xerial.snappy.SnappyError: [FAILED_TO_LOAD_NATIVE_LIBRARY] no native library is found for os.name=Linux and os.arch=sw”。表示:snappy不支援Linux-sw作業系統。
解決方法:spark預設的解壓縮工具為snappy,檢視官網及github上,發現spark可選解壓縮工具有三種lz4、lzf、snappy,於是可將spark預設的解壓縮工具改為lzf。
官網:https://spark.apache.org/docs/latest/configuration.html#dynamically-loading-spark-properties
github:https://github.com/xerial/snappy-java/issues/178

這裡寫圖片描述

具體執行過程:

[root@node1 spark-1.6.2]# cd conf/
[root@node1 conf]# cp spark-defaults.conf.template spark-defaults.conf
[root@node1 conf]# vim spark-defaults.conf

在最後新增命令 spark.io.compression.codec lzf

這裡寫圖片描述

新增命令後,儲存退出,重新啟動spark,執行案例測試,結果顯示成功。

案例1:統計整數個數

[root@localhost bin]# spark-shell

這裡寫圖片描述

scala> sc.parallelize(1 to 1000).count()

執行可以看到,結果顯示 res0: Long = 1000 表示成功!

這裡寫圖片描述

案例2:計算pi的值

[root@localhost bin]# run-example SparkPi

這裡寫圖片描述

執行可以看到,結果顯示 Pi is roughly 3.14552 表示成功!

這裡寫圖片描述

參考文件:https://github.com/xerial/snappy-java/issues/178