Spark是一個分布式的內存計算框架,其特點是能處理大規模數據,計算速度快。Spark延續了Hadoop的MapReduce計算模型,相比之下Spark的計算過程保持在內存中,減少了硬盤讀寫,能夠將多個操作進行合并后計算,因此提升了計算速度。同時Spark也提供了更豐富的計算API,這也讓Spark受到行業的高度關注,被認為是一款代表著未來的大數據架構。
在Spark架構的應用過程中,其任務調度是重要的組成部分。中培偉業《大數據平臺搭建與高性能計算最佳實戰》培訓專家鐘老師在這里就Spark計算過程進行了介紹分析。
鐘老師指出,Spark中的任務調度實際上分了三個層次。第一層次是基于階段的有向無環圖進行Stage的調度,第二層次是根據調度策略(FIFO,FAIR)進行TaskSet調度,第三層次是根據數據本地性(Process,Node,Rack)在TaskSet內進行調度。
任務的計算過程是在Executor上完成的,Executor監聽來自SchedulerBackend的指令,接收到任務時會啟動TaskRunner線程進行任務執行。在TaskRunner中首先將任務和相關信息反序列化,然后根據相關信息獲取任務所依賴的Jar包和所需文件,完成準備工作后執行任務的run方法,實際上就是執行ShuffleMapTask或ResultTask的run方法。任務執行完畢后將結果發送給Driver進行處理。
在Task.run方法中可以看到ShuffleMapTask和ResultTask有著不同的計算邏輯。ShuffleMapTask是將所依賴RDD的輸出寫入到ShuffleWriter中,為后面的Shuffle過程做準備。ResultTask是在所依賴RDD上應用一個函數,并返回函數的計算結果。在這兩個Task中只能看到數據的輸出方式,而看不到應有的計算邏輯。實際上計算過程是包含在RDD中的,調用RDD. Iterator方法獲取RDD的數據將觸發這個RDD的計算動作(RDD. Iterator),由于此RDD的計算過程中也會使用所依賴RDD的數據。從而RDD的計算過程將遞歸向上直到一個數據源類型的RDD,再遞歸向下計算每個RDD的值。需要注意的是,以上的計算過程都是在分區上進行的,而不是整個數據集,計算完成得到的是此分區上的結果,而不是最終結果。