目錄:
1.使用阿里雲的Maven倉庫加速Spark編譯過程
2.使用idea導入spark源碼
3.解決幾處build報錯問題
4.使用idea編譯spark生成部署包
5.jar包位置
6.運行源碼example的sparkPi.scala遇到的問題解決
7.調試spark core源碼
改動pom.xml文件的兩處:(能用國內網網站鏡像,就不用國外的,可以大大減少下載資源的等待時間,也可以避免很多錯誤)
1)修改下載maven倉庫的網站
<name>Maven Repository</name>
<!--<url>https://repo1.maven.org/maven2</url>-->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
2)maven插件也參考這個修改
<id>central</id>
<!--<url>https://repo1.maven.org/maven2</url>-->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
3)參考:http://www.kekeyun.com/thread-3385-1-1.html?spm=a2c4e.11153940.blogcont578775.14.571f5eb5HJ8Du5
2.使用idea導入spark源碼
目錄在sparkCom\spark511\spark-2.2.0-ali,導入步驟如下。




3.解決幾處build報錯問題
1)使用idea,2分鍾導入成功。build,報錯1:現在解決iml文件重復的問題,刪除目錄下重復的文件即可。

2)報錯2:
Error:(45, 66) not found: type SparkFlumeProtocol
val transactionTimeout: Int, val backOffInterval: Int) extends SparkFlumeProtocol with Logging {
重新下載D:\spark-home\external\flume-sink\src\main\scala\org\apache\spark\streaming\flume\sink資源文件即可。(一分鍾)

3)報錯3:
Error:(36, 45) object SqlBaseParser is not a member of package org.apache.spark.sql.catalyst.parser
import org.apache.spark.sql.catalyst.parser.SqlBaseParser._
先reimport,build還報這個錯,就重新下載所有資源文件。
4)報錯4:Error:(52, 75) not found: value TCLIService
public abstract class ThriftCLIService extends AbstractService implements TCLIService.Iface, Runnable {
解決完報錯的信息,再次build,就可以成功。

此處具體可以參考:https://blog.csdn.net/He11o_Liu/article/details/78739699
4.使用idea編譯spark生成部署包
1)在maven projects視圖選擇Spark Project Parent POM(root),然后選中工具欄倒數第四個按鈕(ship Tests mode)按下,這時Liftcycle中test是灰色的。

2)接着按倒數第一個按鈕進入Maven設置,在runner項設置VM option:
-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m
按OK 保存。

3)回到maven projects視圖,點中Liftcycle中package,然后按第5個按鈕(Run Maven Build按鈕),開始編譯。其編譯結果和Maven編譯是一樣的。
好感動,之前好多次用idea+maven編譯沒有成功,編譯終於成功了。

5)整個項目編譯的時間較長,如果之后的開發中,只改動了某個包下的源碼,就只需要重新編譯對應的jar包,然后替換對應源碼目錄的jars包,這樣就可以在自己二次開發后的源碼進行調試、運行了。
參考:https://blog.csdn.net/book_mmicky/article/details/25714445
5.jar包位置
編譯出來的是一個完整的包,存放在./assembly/target/scala-2.10下,這個包包含了Spark編譯得到的jar包,以及編譯過程中所依賴的包。
6.直接運行源碼example的sparkPi.scala
解決幾處error。
1)報錯1:
Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/Seq
at org.apache.spark.examples.SparkPi.main(SparkPi.scala)
Caused by: java.lang.ClassNotFoundException: scala.collection.Seq
原因是:scala的jar包未導入。
解決方法:project structure->libraries->+ scala sdk

再右鍵點擊sdk->add to modules:

2)報錯2:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/sql/SparkSession$
at org.apache.spark.examples.SparkPi$.main(SparkPi.scala:28)
at org.apache.spark.examples.SparkPi.main(SparkPi.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.SparkSession$
原因是:spark 的jar包未引入。
解決:project structure->libraries->+java->剛才編譯好的jar包位置
3)報錯3:
ERROR SparkContext: Error initializing SparkContext.
org.apache.spark.SparkException: A master URL must be set in your configuration
at org.apache.spark.SparkContext.<init>(SparkContext.scala:376)
解決辦法:設置本地運行模式。在edit configuratios下設置
VM option:-Dspark.master=local

4)解決完之前的錯誤,可以運行sparkPi,控制台輸出計算的π值。
7.調試spark core源碼
這個部分可以參考:通過打印調用堆棧進行spark源碼跟讀
