RDD理解及寬依賴和窄依賴

2021-08-04 21:58:25 字數 2584 閱讀 2242

1)rdd概念:resilient distributed datasets  彈性分布式資料集,是乙個容錯的、並行的資料結構,可以讓使用者顯式地將資料儲存到磁碟和記憶體中,並能控制資料的分割槽。同時,rdd還提供了一組豐富的操作來操作這些資料。rdd是唯讀的記錄分割槽的集合,只能通過在其他rdd執行確定的轉換操作(transformation操作)而建立。rdd可看作乙個spark的物件,它本身存在於記憶體中,如對檔案計算是乙個rdd,等。

乙個rdd可以包含多個分割槽,每個分割槽就是乙個dataset片段。rdd可以相互依賴。如果rdd的每個分割槽最多只能被乙個child rdd的乙個分割槽使用,則稱之為narrow dependency;若多個child rdd分割槽都可以依賴,則稱之為wide dependency。

rdd抽象出來的東西裡面實際的資料,是分散在各個節點上面的,rdd可分割槽,分割槽的個數是我們可以指定的。但是預設情況下,乙個hdfs塊就是乙個分割槽。

且大部分操作在記憶體裡面,少部分在磁碟,例如reducebykey操作,就需要放在磁碟,為了保證資料的安全性,然後再從磁碟被讀取出到記憶體上面。容錯性好。

2)rdd如何保障資料處理效率?

rdd提供了兩方面的特性persistence和patitioning,使用者可以通過persist與patitionby函式來控制rdd的這兩個方面。rdd的分割槽特性與平行計算能力(rdd定義了parallerize函式),使得spark可以更好地利用可伸縮的硬體資源。若將分割槽與持久化二者結合起來,就能更加高效地處理海量資料。例如:

input.map(parsearticle _).partitionby(partitioner).cache()

partitionby函式需要接受乙個partitioner物件,如:

val partitioner = new hashpartitioner(sc.defaultparallelism)

rdd本質上是乙個記憶體資料集,在訪問rdd時,指標只會指向與操作相關的部分。例如存在乙個面向列的資料結構,其中乙個實現為int的陣列,另乙個實現為float的陣列。如果只需要訪問int欄位,rdd的指標可以只訪問int陣列,避免了對整個資料結構的掃瞄。

rdd將操作分為兩類:

transformation

與action

。無論執行了多少次

transformation

操作,rdd

都不會真正執行運算,只有當

action

操作被執行時,運算才會觸發。而在

rdd的內部實現機制中,底層介面則是基於迭代器的,從而使得資料訪問變得更高效,也避免了大量中間結果對記憶體的消耗。

這些繼承自rdd的類都定義了compute函式。該函式會在action操作被呼叫時觸發,在函式內部是通過迭代器進行對應的轉換操作:

private[spark]

extends rdd[u](prev) {

override def getpartitions:array[partition] = firstparent[t].partitions

override def compute(split:partition, context: taskcontext) =

firstparent[t].iterator(split, context).map(f)

總結:

rdd是spark的核心,也是整個spark的架構基礎。它的特性可以總結如下:

它是不變的資料結構儲存

它是支援跨集群的分布式資料結構

可以根據資料記錄的key對結構進行分割槽

提供了粗粒度的操作,且這些操作都支援分割槽

它將資料儲存在記憶體中,從而提供了低延遲性

3)寬依賴和窄依賴:

寬依賴:父rdd的分割槽被子rdd的多個分割槽使用   例如 groupbykey、reducebykey、sortbykey等操作會產生寬依賴,會產生shuffle

窄依賴:父rdd的每個分割槽都只被子rdd的乙個分割槽使用  例如map、filter、union等操作會產生窄依賴

注意:join操作有兩種情況:如果兩個rdd在進行join操作時,乙個rdd的partition僅僅和另乙個rdd中已知個數的partition進行join,那麼這種型別的join操作就是窄依賴,例如圖1中左半部分的join操作(join with inputsco-partitioned);其它情況的join操作就是寬依賴,例如圖1中右半部分的join操作(join with inputsnot co-partitioned),由於是需要父rdd的所有partition進行join的轉換,這就涉及到了shuffle,因此這種型別的join操作也是寬依賴。

寬依賴和窄依賴 Spark 寬依賴和窄依賴

1.前言 上一節spark dag概述 spark中rdd的高效與dag圖有著莫大的關係,在dag排程中需要對計算過程劃分stage,暴力的理解就是stage的劃分是按照有沒有涉及到shuffle來劃分的,沒涉及的shuffle的都劃分在乙個stage裡面,這種劃分依據就是rdd之間的依賴關係。針對...

spark架構基礎 RDD理解及寬依賴和窄依賴

1 rdd概念 resilient distributed datasets 彈性分布式資料集,是乙個容錯的 並行的資料結構,可以讓使用者顯式地將資料儲存到磁碟和記憶體中,並能控制資料的分割槽。同時,rdd還提供了一組豐富的操作來操作這些資料。rdd是唯讀的記錄分割槽的集合,只能通過在其他rdd執行...

寬依賴和窄依賴

寬依賴和窄依賴如下圖所示 相比於寬依賴,窄依賴對優化很有利 主要基於以下兩點 寬依賴往往對應著shuffle操作,需要在執行過程中將同乙個父rdd的分割槽傳入到不同的子rdd分割槽中,中間可能涉及多個節點之間的資料傳輸 而窄依賴的每個父rdd的分割槽只會傳入到乙個子rdd分割槽中,通常可以在乙個節點...