標簽(空格分隔): Spark
本篇博客以WordCount為例說明Spark Job的提交和運行,包括Spark Application初始化、DAG依賴性分析、任務的調度和派發、中間計算結果的存儲和讀取。
SparkContext的初始化綜述
SparkContext是進行Spark應用開大的主要接口,是Spark上層應用與底層實現的中轉站。
- SparkEnv
- DAGScheduler
- TaskScheduler
- SchedulerBackend
- WebUI
SparkContext的構造函數中最重要的入參是SparkConf.
-
根據初始化入參生成SparkConf,再根據SparkConf來創建SparkEnv;
//生成SparkEnv
private[spark] val env = SparkEnv.create(conf, "", conf.get("spark.driver.host", conf.get("spark.driver.port").toInt, isDriver = true, isLocal = isLocal)
SparkEnv.set(env) -
創建TaskScheduler,根據Spark的運行模式來選擇相應的SchedulerBackend,同時啟動TaskScheduler;
//生成TaskScheduler
private[spark] var taskScheduler = SparkContext.createTaskScheduler(this, master, appName)
taskScheduler.start() -
為上面創建的TaskScheduler實例為入參創建DAGScheduler並啟動運行。
//生成DAGScheduler
@volatile private[spark] var dagScheduler = new DAGScheduler(taskScheduler)
dagScheduler.start()
Spark Repl綜述
Scala已經擁有Repl,為什么在Spark中還要自己重寫一套Repl呢?Scala原聲的Repl,是使用Object來封裝輸入的代碼,而在反序列化過程中,對象的構造函數會被再次調用,產生了副作用,我們希望生成Class而不是Object。(Scala中沒有靜態方法和靜態字段,在Scala中可以用Object實現,對象的構造函數在第一次被使用的時候回調用,如果一個對象從未被使用,那么他的構造器也不會被執行,而且Object的構造函數必須是無參的)
1、scala沒有靜態方法或者靜態字段
2、伴生對象充當於靜態方法的類,所以伴生對象中全是靜態的
3、Scala中的變量有兩種var和val(val類似於Java中final,值不可改變)
Scala Repl執行過程
什么是Repl (Read-Eval-Print Loop)?
剛開始學編程的時候,是不是對搭建環境感覺非常棘手?比如從零開始搭建個 PHP Web 開發環境,要下載 Apache 服務器、PHP,然后安裝、配置……經過這么一大堆的無關工作,你可能只是想驗證一下教程上的 echo "Hello World"; 能不能工作。
這種時候,如果能有個網站可以在線執行代碼:我們只要打開瀏覽器,進入網頁,敲入要執行的代碼,點擊執行按鈕就看到執行結果。那是一件多暢快的事情!
對於這種交互式的開發環境我們叫做 REPL(Read-Eval-Print Loop)
Scala是需要編譯執行的,而Repl給我們的錯覺是Scala解釋執行的。在Repl中輸入的語句是如何被真正執行的呢?
1)在Repl中輸入的每一行語句,都會被封裝成一個Object,這以工作主要由Interpreter完成;
2) 對該Object進行編譯;
3) 由ClassLoader加載編譯后的Java二進制文件;
4) 執行引擎負責真正執行加載入內存的二進制。
