編譯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 表示成功!