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