當(dāng)時在學(xué)習(xí)spark的時候,編譯過spark2.11源碼,當(dāng)時也遇到過不少坑,導(dǎo)致編譯過程坎坷。時過境遷,目前spark的最新版本是spark2.3.2。這次跟著官網(wǎng)指導(dǎo)編譯一下最新代碼。
前期注意事項
- 本人系統(tǒng)環(huán)境是windows10,IDE 為idea2017
- 本次編譯是通過Maven編譯,Maven版本為3.3.9,不用SBT編譯
- 自Spark 2.2.0起,對Java 7的支持已被刪除!
- 給Maven多配置一點內(nèi)存,防止編譯期間OOM異常,官網(wǎng)推薦
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
ReservedCodeCacheSize設(shè)置是可選的,但建議都加上否則可能出現(xiàn)警告或者異常。
[INFO] Compiling 203 Scala sources and 9 Java sources to /Users/me/Development/spark/core/target/scala-2.11/classes...
[ERROR] Java heap space -> [Help 1]
建議修改maven的安裝目錄下的conf/settings.xml文件中添加如下配置,以達(dá)到j(luò)ar下載加速的效果
<!-- 阿里云中央倉庫 -->
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
構(gòu)建
去官網(wǎng)下載源碼包
http://spark.apache.org/downloads.html
執(zhí)行命令
./build/mvn -DskipTests clean package
spark編譯要在 bash環(huán)境下進(jìn)行 如git的bash環(huán)境,否則可能報錯
開始編譯 ,運行效果如下圖:
此期間別急。機(jī)器不好的,網(wǎng)不好的,稍安勿躁,阿彌陀佛,等就對了。
37分鐘后編譯全部模塊完成。
IntelliJ運行編譯后的代碼
- 打開IntelliJ idea open 編譯過后的源代碼,等待加載indexing,不要選import sbt project
-
找到org.apache.spark.examples中的一個example添加本地方法,測試運行。
image.png
官網(wǎng)中的提示:
-
“Rebuild Project” 第一次編譯項目的時候可能失敗,點擊這個按鈕“Generate Sources and Update Folders For All Projects”
- 有一些模塊路徑是idea識別不了的,需要手工選一下,在“Project Settings” 然后選中 “Modules” 模塊。
- spark-hive: add v0.13.1/src/main/scala
- spark-streaming-flume-sink: add target\scala2.11\src_managed\main\compiled_avro
-
spark-catalyst: add target\scala-2.11\src_managed\main
比如idea執(zhí)行報錯,無法找到SparkFlumeProtocol類,進(jìn)入view=>tool window=>maven project中找到Spark Project External Flume Sink模塊,右鍵選擇Generate Sources and update Folders,并在lifecycle中compile改模塊。
- 執(zhí)行測試類的時候出現(xiàn)Exception in thread "main" java.lang.NoClassDefFoundError: 錯誤
解決方法:
Menu -> File -> Project Structure -> Modules -> spark-examples_2.11 -> Dependencies 添加依賴 jars -> {spark dir}/spark/assembly/target/scala-2.11/jars/ - 如果還碰到哪個模塊導(dǎo)致找不到類在idea中選中單個maven模塊重新mvn clean compile一下
其他編譯命令
mvn 還可以加-P參數(shù)指定hadoop版本,指定構(gòu)建Hive 、JDBC 、Mesos 、Kubernetes 、Kafka、Flume 的支持版本
./build/mvn -Pyarn -Phadoop-2.7 -Dhadoop.version=2.7.3 -DskipTests clean package
./build/mvn -Pyarn -Phive -Phive-thriftserver -DskipTests clean package
./build/mvn -Pmesos -DskipTests clean package
./build/mvn -Pkubernetes -DskipTests clean package
./build/mvn -Pkafka-0-8 -DskipTests clean package
./build/mvn -Pflume -DskipTests clean package
指定單一模塊進(jìn)行構(gòu)建
如果修改了一個模塊的源代碼,想構(gòu)建后跑起來的話,可以用-pl命令構(gòu)建單個模塊,節(jié)省大量時間。
./build/mvn -pl :spark-streaming_2.11 clean install
官網(wǎng)還推薦用make-distribution.sh腳本繼續(xù)打包編譯
./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Psparkr -Phadoop-2.7 -Phive -Phive-thriftserver -Pmesos -Pyarn -Pkubernetes
***bash環(huán)境下運行上面命令,這個腳本和mvn本質(zhì)一樣,但會幫助我們自動設(shè)置maven參數(shù)和jvm參數(shù),如腳本中就有這段代碼export MAVEN_OPTS="${MAVEN_OPTS:--Xmx2g -XX:ReservedCodeCacheSize=512m}"