《從0到1學習spark》--手撕parallelize源碼

之前小強介紹了RDD是什麼以及RDD的用法,如果還有疑惑的同學可以查看《從0到1學習spark》-- RDD,今天小強將介紹一下RDD的使用和源碼解析。

手撕RDD

RDD有兩種,一種如上圖所示的,使用parallelize方法創建的並行集合

另外一種是外部存儲創建的RDD,例如讀取HDFS的內容。

http://spark.apache.org/docs/latest/rdd-programming-guide.html#resilient-distributed-datasets-rdds

關於spark RDD官網資料

這裏在傳參的時,也就是圖片紅色圈起來的方法,和函數體裏面都有執行到assertNotStopped()這個方法,那麼這裏看一下具體的內容

找到parallelize方法,先看看withScope這個方法的作用,因爲這裏在進入到這個斷點前會先進入到這個方法裏面,這裏梳理一下幾個方法的執行順序

首先因爲defaultParallelism這個方法作爲形參的結果返回,因此第一個執行也就是最開始執行的內容,然後第二個執行withScope,接着纔是執行函數體裏面的內容也就是assertNotStooped()和new 這裏的內容

這裏會根據方法的註釋可以知道,用戶未指定時要使用的默認並行級別

那麼這裏默認級別是多少呢?還有這裏是根據什麼來設置的呢?

一直進入具體的方法

這裏可以知道就是根據spark.default.parallelism這個參數來設置的,這裏取兩者的最大值

另外這裏可以看到這裏返回的參數結果是2,這裏參數部分執行完默認的並行度之後,接着就是執行withScope方法了,這裏同樣進入查看一下

這裏執行withScope,獲取方法名稱,然後再次調用withScope,但是這裏的形參不一樣

這裏是對sc的一些屬性進行設置,主要是對RDD的範圍的獲取

這裏是一個柯里化的函數,柯里化是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數, 並且返回接受餘下的參數而且返回結果的新函數的技術。

https://www.jianshu.com/p/8869c0777cbe

這裏關於scala的函數的一些資料

https://blog.csdn.net/qq_21383435/article/details/79666170

關於spark withScope的源碼的含義,可以具體參考網上的資料

withScope是最近的發現版中新增加的一個模塊,它是用來做DAG可視化的(DAG visualization on SparkUI)

以前的sparkUI中只有stage的執行情況,也就是說我們不可以看到上個RDD到下個RDD的具體信息。於是爲了在sparkUI中能展示更多的信息。所以把所有創建的RDD的方法都包裹起來,同時用RDDOperationScope 記錄 RDD 的操作歷史和關聯,就能達成目標

然後這裏執行完設置spark.rdd.scope的結果如上所示,關於withScope的內容這裏因爲涉及到其他模塊,因此這裏暫時只作爲了解,後面有機會再詳細研究。

然後執行完這裏之後,就又回到了最前面的 parallelize

然後這裏進入查看一下

這裏主要是繼承了RDD,然後看下具體的執行過程

這裏主要的執行方法就是RDD.scala裏面的內容了,可以看到這裏涉及有checkpoint的內容

這個其實就是RDD的安全檢查點,所謂的安全檢查點其實是將系統運行的內存數據結構和狀態持久化到磁盤當中,在需要時通過對這些吃就好數據的讀取,重新構造出之前的運行期的狀態

這裏有幾個地方可以注意一下,第一個地方是指定了持久化級別的

第二個看註釋是用於創建RDD的,然後這裏sc.getCallSite()這個方法是和堆棧有關的,這部分內容在創建sparkContext中也有,可以看具體的相關內容

然後可以看到這裏得到的RDDOperationScope就是一個jsonMapper和scopeCounter

這裏主要內容其實還是這個jsonMapper,說白了其實RDD也是一個大的Mapper,只不過裏面包含了很多其他的各種工具內容等等。

那麼創建完RDD之後,這裏數據在哪裏呢?

就是在這個body裏面了

總結

今天小強介紹了RDD通過parallelize方法並行化創建的源碼執行流程,歡迎大家在後臺拍磚,讓我們一起學習spark。

【關注】和【點贊】是對小強最大的支持!!!

👇👇👇戳二維碼關注小強哦~👇👇👇

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章