rdd(resilient distributed dataset)叫做彈性分布式資料集,是spark中最基本也是最重要的概念之一。它是spark中一種基本的資料抽象,有容錯機制並可以被並行操作的元素集合,具有唯讀、分割槽、容錯、高效、無需物化、可以快取、rdd依賴等特徵。rdd的知識較為龐雜,這裡只能按我了解的做一些簡單介紹。
1、partition
乙份待處理的原始資料會被按照相應的邏輯(例如jdbc和hdfs的split邏輯)切分成n份,每份資料對應到rdd中的乙個partition,partition的數量決定了task的數量(乙個partition對應乙個task),影響著程式的並行度。乙個rdd是有n個partition組成。
2、operater運算元
運算元是spark中對一些資料處理的常用操作的抽象,spark運算元分為兩類:transform和action
transform運算元是一種延遲性操作,也就是把乙個rdd轉換成另外乙個rdd而不是馬上執行,不會提交job。常用的有:map,flatmap,join,groupbykey等。
action運算元會對rdd 計算出乙個結果,並把結果返回到驅動器程式中,或把結果儲存到外部儲存系統(如 hdfs)中。每有乙個action便會提交乙個job。常用的有reduce,collect,count,take等。
3、lineage和cache快取機制
但是考慮乙個問題,加入我在一系列轉化的中間步驟出了錯該怎麼辦,因為spark是基於記憶體計算的,不可能將出錯rdd前面的所有rdd都儲存下來,所以就需要重頭再來,這樣就花費了大量的時間。所以為了解決這個問題,spark採用快取的機制,也就是通過rdd.persist或者rdd.cache的方法將前面的計算結果快取,但是並不是這兩個方法被呼叫時立即快取,而是觸發後面的action時,該rdd將會被快取在計算節點的記憶體中,並供後面重用。
除了上面的原因外,當持久化乙個rdd後,每個節點都會把計算的分片的結果儲存在記憶體中,之後可以對此資料集在其他action中再次使用。這使得後續的action變得迅速(通常快10x)
快取有不同的級別,也可以選擇存放在記憶體或磁碟上,讀者可以自己去了解
1、工作原理
rdd運算元構建了rdd之間的關係,整個計算過程形成了乙個由rdd和關係構成的dag。
簡單理解為點和線構成圖。
點是某種資料結構,spark計算框架的點就是rdd(或者stage)
線就是關聯關係,spark計算框架的線就是rdd運算元(或者寬依賴運算元)
spark計算框架中dag分2種,getshuffledependencies dag 和 getmissingparentstages dag。
仔細看上兩張圖,圖2為圖1的一部分。
這2種dag的關係就是如此,外層的dag遍歷過程如果遇到內層 dag直接跳入內層檢索,整個過程可以看作乙個大的dag,實際作用是檢索rdd資料記憶體位置或磁碟位置的過程。
(插進來兩個概念:
寬依賴:父rdd的分割槽被子rdd的多個分割槽使用 例如 groupbykey、reducebykey、sortbykey等操作會產生寬依賴,會產生shuffle,dag中根據窄依賴劃分stage邊界。
窄依賴:父rdd的每個分割槽都只被子rdd的乙個分割槽使用 例如map、filter、union等操作會產生窄依賴)
它們的執行過程是這樣的:
2,getshuffledependencies遍歷寬依賴關係,遇到窄依賴放入hashmap visit,遇到寬依賴時直接跳轉到第3步。如果結束返回完成。
3,getmissingparentstages遍歷窄依賴,建立resultstage(方法createresultstage),遇到窄依賴放入hashmap visit,遇到寬依賴遞迴第2步驟 。如果結束跳入上一步繼續檢索。
4,遇到可計算的stage (finalstage ),可計算指的是stage中所有rdd都可以定址到記憶體或磁碟,提交stage任務到taskscheduler,taskscheduler負責分發任務到集群的worker中計算。如果結束跳入上一步繼續檢索。
注:2 3 步中分別維護自己的hashmap visit ,遇到寬依賴建立resultstage,為什麼寬依賴是劃分stage邊界的原因。
上面這些操作由dagschedule執行
2、dag的好處
比較hadoop,每執行乙個map或reduce都要開啟乙個新的程序,是不是很耗時,但是在spark中通過劃分rdd的依賴關係,可以讓多個窄依賴在乙個執行緒中以流水線執行,快速且節省資源。
dag將乙個job根據寬依賴劃分多個stage,乙個stage的父stage都執行完才能開始執行,通過這樣有邏輯地執行任務可以避免冗餘操作,合理安排執行順序,大大節約了時間。
Spark的RDD概要 DAG概述
彈性 rdd的資料預設是存放在記憶體中,但是記憶體資源存在不足的情況,spark會將rdd資料寫入磁碟 記憶體和磁碟切換 容錯 如果任務執行失敗,可以自動從失敗節點進行恢復,由於某個節點宕機了導致資料丟失,rdd會根據自己的資料 重新計算一遍,計算失敗的partition的資料 基於血緣關係 代表具...
spark認知理解(一)RDD與DAG
目錄 1.spark介紹 2.rdd理解 2.1 rdd概念 2.2 partition分片 2.3 partitioner 3.寬窄依賴 4.stage劃分 4.spark與dag 註腳 spark是基於記憶體計算的大資料平行計算框架。特性 dag執行引擎,可分布式,基於記憶體計算。rdd 是彈性...
spark學習 RDD程式設計
rdd建立 從從檔案系統中載入資料建立rdd 1.spark採用textfile 從檔案系統中載入資料建立rdd 可以使本地,分布式系統等 2.把檔案的url作為引數 可以是本地檔案系統的位址,分布式檔案系統hdfs的位址等等 從本地檔案中載入資料 sc為系統自動建立的sparkcontext,不用...