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

2021-09-09 07:12:55 字數 2383 閱讀 7476

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優化之重構rdd架構及rdd持久化

什麼是rdd持久化?spark最重要的乙個功能,就是把乙個資料集快取在記憶體,磁碟或者分布式檔案系統中。如果持久化了這乙個資料集,那麼對此資料集進行操作的其他操作可以直接復用該資料集,不用重新計算,這會使該操作執行的迅速。因為要不進行持久化的話,如果多次對乙個rdd執行運算元的話,spark缺省會重...

Spark 基礎及RDD基本操作

什麼是rdd rdd resilient distributed dataset 叫做分布式資料集,是spark中最基本的資料抽象,它代表乙個不可變 可分割槽 裡面的元素可平行計算的集合。rdd具有資料流模型的特點 自動容錯 位置感知性排程和可伸縮性。rdd允許使用者在執行多個查詢時顯式地將工作集快...

簡述Spark基礎及架構

五 spark資料核心 rdd 六 建立rdd spark是基於記憶體的分布式計算框架,特點是快速 易用 通用及多種執行模式。spark架構主要由以下元件構成 cluster manager 在集群 standalone mesos yarn 上獲取資源的外部服務 task 被送到某個 execut...