Spark核心程式設計 RDD的實現和程式設計介面

2021-08-22 16:13:24 字數 1914 閱讀 2601

說明:本文參考郭景瞻的《**spark:核心技術與案例實戰》

當對rdd執行「轉換操作」時,排程器(dgascheduler)會根據rdd的血統來構建由若干排程階段(state)組成的有向無環圖(dag),每個排程階段包含盡可能多的連續「窄依賴」轉換。排程器按照有向無環圖順序進行計算,並最終得到目標rdd。

排程器(taskscheduler)向各節點分配任務採用延時排程機制並根據資料儲存位置來確定(資料本地性:移動計算而非移動資料)。若乙個任務需要處理的某個分割槽剛好儲存在某個節點的記憶體中,則該任務會分配給該節點;如果在記憶體中不包含該分割槽,排程器會找到包含該rdd的最佳位置,並把任務分配給所在節點。

spark從大的方向上提供了兩種持久化rdd的儲存策略:一是存在記憶體中;二是儲存在磁碟中。

對於記憶體使用lru**演算法來進行管理,當計算得到乙個新的rdd分割槽,但沒有足夠空間來儲存時,系統會從最近最少使用的rdd中**其乙個分割槽的空間。除非該rdd是新分割槽對應的rdd,這種情況下spark會將舊的分割槽繼續保留在記憶體中,防止同乙個rdd的分割槽被迴圈調入和調出。這點很關鍵,因為大部分的操作會在乙個rdd的所有分割槽上進行,那麼很有可能已經存在記憶體中的分割槽將再次被使用。

雖然血統可以用於錯誤後rdd的恢復,但是對於很長的血統的rdd來說,這樣的恢復耗時比較長,因此需要通過檢查點操作儲存到外部儲存中。

spark提供為rdd設定檢查點操作的api,可以讓使用者自行決定需要為哪些資料設定檢查點操作。另外由於rdd的唯讀特性,使得不需要關心資料一致性問題。

spark中提供了通用介面來抽象每個rdd,這些介面包括:

(1)分割槽資訊:它們是資料集的最小分片。

(2)依賴關係:指向其父rdd。

(3)函式:基於父rdd計算方法。

(4)劃分策略和資料位置的元資料。

乙個rdd劃分成很多的分割槽(partition)分布在集群的節點中,分割槽的多少涉及對這個rdd進行平行計算的粒度。在rdd操作中使用者可以使用partitions方法獲取rdd劃分的分割槽數,當然使用者也可以設定分割槽數目。如果沒有指定將使用預設值,而預設數值是該程式所分配到cpu核數,如果是從hdfs檔案建立,預設為檔案的block數(有一點我們必須要注意,當我們顯示的設定分割槽數時,分割槽數不允許小於hdfs檔案的block數)。

// 使用textfile方法獲取指定路徑的檔案,未設定分割槽數

// 使用partitions方法獲取分割槽數,假設預設的分割槽數為2,那麼將返回2

val partitionsize = rdd.partitions.size

// 顯示地設定rdd為6個分割槽

// 獲取分割槽數,此時返回6

partitionsize = rdd.partitions.size

在spark形成任務有向無環圖(dag)時,會盡可能地把計算分配到靠近資料的位置,減少資料網路傳輸。當rdd產生的時候存在首選位置,如hadooprdd分割槽的首選位置就是hdfs塊所在的節點。當rdd分割槽被快取,則計算應該傳送到快取分割槽所在的節點進行,再不然回溯rdd的血統,一直找到具有首選位置屬性的父rdd,並據此決定子rdd的位置。

在rdd中將依賴關係分成了兩種型別:窄依賴(narrow dependencies)和寬依賴(wide dependencies)。其中窄依賴是指每個父rdd的分割槽都至多被乙個子rdd的分割槽使用,而寬依賴是多個子rdd的分割槽依賴乙個父rdd分割槽。

這兩種依賴的區別從兩個方面來說比較有用。第一:窄依賴允許在單個集群節點上流水線式執行,這個節點可以計算所有父級分割槽。相反,寬依賴需要所有的父rdd資料可用,並且資料已經通過shuffle完成。第二:在窄依賴中,節點事變後的恢復更加高效,因為只有丟失的父級分割槽需要重新計算,並且這些丟失的父級分割槽可以並行地在不同節點上重新計算。相反,在寬依賴的繼承關係中,單個失敗的節點可能導致乙個rdd的所有先祖rdd中的一些分割槽丟失,導致計算的重新執行。

Spark程式設計模型 RDD

spark程式設計模型是彈性分布式資料集 resilient distributed dataset,rdd 是mapreduce模型的擴充套件和延伸 基於rdd機制實現了多類模型計算,如 1.迭代計算 2.互動式sql查詢 3.mapreduce rdd 4.流式資料處理。markdown 是一種...

spark學習 RDD程式設計

rdd建立 從從檔案系統中載入資料建立rdd 1.spark採用textfile 從檔案系統中載入資料建立rdd 可以使本地,分布式系統等 2.把檔案的url作為引數 可以是本地檔案系統的位址,分布式檔案系統hdfs的位址等等 從本地檔案中載入資料 sc為系統自動建立的sparkcontext,不用...

Spark 核心 RDD 剖析(上)

本文將通過描述 spark rdd 的五大核心要素來描述 rdd,若希望更全面了解 rdd 的知識,請移步 rdd rdd 基於記憶體的集群計算容錯抽象 spark 的五大核心要素包括 下面一一來介紹 rdd 由若干個 partition 組成,共有三種生成方式 那麼,在使用上述方法生成 rdd 的...