標籤(空格分隔): Spark編程
本篇博客以WordCount爲例說明Spark Job的提交和運行,包括Spark Application初始化、DAG依賴性分析、任務的調度和派發、中間計算結果的存儲和讀取。瀏覽器
SparkContext是進行Spark應用開大的主要接口,是Spark上層應用與底層實現的中轉站。服務器
SparkContext的構造函數中最重要的入參是SparkConf.app
根據初始化入參生成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)oop
建立TaskScheduler,根據Spark的運行模式來選擇相應的SchedulerBackend,同時啓動TaskScheduler;網站
//生成TaskScheduler
private[spark] var taskScheduler = SparkContext.createTaskScheduler(this, master, appName)
taskScheduler.start()this
爲上面建立的TaskScheduler實例爲入參建立DAGScheduler並啓動運行。spa
//生成DAGScheduler
@volatile private[spark] var dagScheduler = new DAGScheduler(taskScheduler)
dagScheduler.start()scala
Scala已經擁有Repl,爲何在Spark中還要本身重寫一套Repl呢?Scala原聲的Repl,是使用Object來封裝輸入的代碼,而在反序列化過程當中,對象的構造函數會被再次調用,產生了反作用,咱們但願生成Class而不是Object。(Scala中沒有靜態方法和靜態字段,在Scala中能夠用Object實現,對象的構造函數在第一次被使用的時候回調用,若是一個對象從未被使用,那麼他的構造器也不會被執行,並且Object的構造函數必須是無參的)
一、scala沒有靜態方法或者靜態字段
二、伴生對象充當於靜態方法的類,因此伴生對象中全是靜態的
三、Scala中的變量有兩種var和val(val相似於Java中final,值不可改變)
什麼是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) 執行引擎負責真正執行加載入內存的二進制。