# Spark之探究RDD > 如何瞭解一個組件,先看看官方介紹! ![](https://img2023.cnblogs.com/blog/3161112/202307/3161112-20230727212358040-237097554.png) 進入RDD.scala,引入眼帘的是這麼一段描 ...
Spark之探究RDD
如何瞭解一個組件,先看看官方介紹!
進入RDD.scala,引入眼帘的是這麼一段描述文字(渣翻勿噴):
RDD,彈性分散式數據集,是Spark中的基礎抽象。代表了一個可以被並行化操作的不可變、可分區的要素集合。這個類包含了任何RDD都可使用的基本操作,例如map,filter。
此外,PairRDDFuncations聲明瞭只有KV對 RDD才可使用的操作,例如groupByKey、join;DoubleRDDFuncations聲明瞭只有Doubles RDD才可使用的操作;SequenceFileRDDFuncations聲明瞭只有可序列化RDD才可使用的操作。所有的操作都是通過隱式調用對於右側任何RDD自動可用的。例如 RDD[(Int, Int)]。
在內部,每一個RDD都有以下五個主要的屬性:
- 一個分區列表
- 作用到每個分區的計算函數
- 依賴RDD列表
- 【可選】對於KV類型的RDD會有一個Partitioner(例如,定義某個RDD是Hash分區的)
- 【可選】每個分區的首選計算執行任務
在Spark中,所有任務調度和執行都是基於這些方法,並且允許RDD覆蓋這些方法以實現自己的計算;更進一步說,用戶可以覆蓋這些方法實現自己的邏輯(例如,從一個新的存儲系統讀數據)。請參考《Spark paper》以瞭解更多關於RDD內部的信息。
源碼中的介紹就到這裡結束了,讓我們來看看之中的關鍵點。
RDD彈性分散式數據集
重要結論:RDD是一個數據集,記錄了這個數據集從哪裡來,怎麼計算
數據從哪裡來?
源頭RDD的數據從數據源來,RDD2的數據從源頭RDD來,以此類推。
數據怎麼計算?
計算就是操作,在上文RDD源碼中,說到RDD包含了許多基本的操作,例如map。那不難理解,所謂計算就是調用這些操作,而這些操作可以分成兩類:
- Transformation轉換操作:返回一個新的RDD
- Action動作操作:返回值不是RDD(無返回值或返回其他)
一般來說,會根據RDD調用的是哪類操作,從而定義為轉換運算元或執行運算元。
那如果轉換操作是將一個RDD轉化為另一個RDD,那不是也可以理解為某種“Action”嗎?所以,轉換操作不是真正的轉換,而是“將一個RDD重新嵌套成了另一個RDD”,而“重新嵌套”實質上就是把自己的計算邏輯套在了前一個RDD上面。
而,Action操作,就是真正的“動作”了。
當最後一個RDD觸發Action操作後,大概是這麼調用的:
(RDDn的計算邏輯(...(RDD2的計算邏輯(RDD1的計算邏輯)))).Action
所以當Action後,一直深入到RDD1開始計算,再逐級返回。從圖中理解,大概是某種“拉式”調用。
那如果沒有最後的Action,結果會怎樣呢?很明顯,無事發生!
數據存在哪裡?
從上面的過程,可以理解到,RDD不實際存儲真正要計算的數據,而是記錄了數據的位置在哪裡,數據的轉換關係。RDD這一條鏈就像是一本操作手冊,只記錄了對數據的操作,而實際執行這些操作的並不是它。
數據到哪裡去?
欸,這個不歸RDD管哈哈,RDD並不會操心數據到哪裡去。
最後
以上就是RDD最簡單的理解了,其實還有很多需要深入的地方,以及如何關聯Spark其他組件;例如,如果說RDD是一本電飯煲使用說明,那使用人是誰呢?(Driver),電飯煲又是哪個東西呢?(集群),飯在哪裡呢?(數據源)。至此,感謝閱讀!