Spark學習(三) -- SparkContext初始化


標簽(空格分隔): Spark


本篇博客以WordCount為例說明Spark Job的提交和運行,包括Spark Application初始化、DAG依賴性分析、任務的調度和派發、中間計算結果的存儲和讀取。

SparkContext的初始化綜述

SparkContext是進行Spark應用開大的主要接口,是Spark上層應用與底層實現的中轉站。

  • SparkEnv
  • DAGScheduler
  • TaskScheduler
  • SchedulerBackend
  • WebUI

SparkContext的構造函數中最重要的入參是SparkConf.

  1. 根據初始化入參生成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)

  2. 創建TaskScheduler,根據Spark的運行模式來選擇相應的SchedulerBackend,同時啟動TaskScheduler;

    //生成TaskScheduler
    private[spark] var taskScheduler = SparkContext.createTaskScheduler(this, master, appName)
    taskScheduler.start()

  3. 為上面創建的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) 執行引擎負責真正執行加載入內存的二進制。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM