Spark的另外一個核心的奧祕:任務

任務(Task)是Spark的最小執行單元,Spark任務是經過Task來執行的。Spark的任務體系是最神祕也是最容易學習的核心模塊,任務執行機制點透了那麼Spark也就瞭解的更深刻了。Task是任務體系的一個抽象類,有兩個子類:ResultTask和ShuffleMapTask,這三個類構成了任務系統的核心。ide

ResultTask好理解,就是直接執行Task中RDD某個分區的數據操做,還記得以前的RDD的結構嗎,裏面有一個compute函數,任務就是執行compute函數。函數

ShuffleMapTask也是執行Task中RDD某個分區的數據操做,所不一樣的是輸出結果的存儲方式不同。ShuffleMapTask會把數據操做的結果保存到相似BlockManager的全局存儲中,ShuffleMapTask的結果可供下一個Task做爲輸入數據。爲何分兩種呢?換個說法就很清楚了,ResultTask對應窄依賴的RDD,ShuffleMapTask對應寬依賴的RDD操做(如全鏈接操做)。ShuffleMapTask須要對數據的讀寫進行特殊的處理,要用BlockManager來輸出數據集的;一樣,ShuffleMapTask的子RDD的讀取數據集也是從BlockManager來的。學習

ResultTask和ShuffleMapTask的類的代碼很是簡單,就是重寫runTask方法。spa

Task經過Task描述對象來反序列化,得到RDD和分區等對象後,建立TaskContextImpl做爲任務上下文,而後執行run方法運行任務,讀取RDD中的迭代器數據並處理數據。run方法實際是調用子類重寫的runTask方法具體執行的。而runTask方法在ResultTask和ShuffleMapTask中被重寫。對象

一、 ResultTask

直接結果任務,這類任務執行完也就完了,其數據不須要被下一個任務再次處理。能夠任務是終結者任務。get

重寫runTask方法。runTask方法的核心代碼以下:it

override def runTask(context: TaskContext): U = { 
 val ser = SparkEnv.get.closureSerializer.newInstance()
 val (rdd, func) = ser.deserialize[(RDD[T], (TaskContext, Iterator[T]) => U)](
 ByteBuffer.wrap(taskBinary.value), Thread.currentThread.getContextClassLoader) 
 func(context, rdd.iterator(partition, context))
 }

反序列化獲得RDD中定義的數據處理函數func,func符合格式:io

(TaskContext, Iterator[T]) => Usso

而後執行:序列化

func(context, rdd.iterator(partition, context))

這方法的意思就是對rdd分區的數據迭代器輪詢,每次取出一條數據執行func操做。ResultTask的重寫部分就是這麼簡單。

二、ShuffleMapTask

ShuffleMap格式的任務,這類任務的執行結果是要被下一個RDD消費的,所以輸出數據須要寫出到Shuffle區域。Shuffle區域會在分區數據管理中詳細的介紹。

重寫runTask方法。runTask方法的核心代碼以下:

override def runTask(context: TaskContext): MapStatus = {
 val ser = SparkEnv.get.closureSerializer.newInstance()
 val rddAndDep = ser.deserialize[(RDD[_], ShuffleDependency[_, _, _])](
 ByteBuffer.wrap(taskBinary.value), Thread.currentThread.getContextClassLoader)
 val rdd = rddAndDep._1
 val dep = rddAndDep._2
 dep.shuffleWriterProcessor.write(rdd, dep, partitionId, context, partition)
 }

前半段和Result相似,反序列化獲得RDD和分區,以及依賴分區dep。而後迭代rdd中的數據並寫入到依賴dep的shuffle區域中。

Spark的任務的執行過程這裏就說的很明白了,理解了這點,若是再搞清楚了Spark如何分配任務到不一樣機器上執行的過程,那麼能夠說Spark的精髓也就掌握的清清楚楚了!是否是信心大增?

相關文章
相關標籤/搜索