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分割槽中,通常可以在乙個節點...