1. 程式人生 > >spark rdd詳解一(rdd入門)

spark rdd詳解一(rdd入門)

1.rdd簡介

與許多專有的大資料處理平臺不同,Spark建立在統一抽象的RDD之上,使得它可以以基本一致的方式應對不同的大資料處理場景,包括MapReduce,Streaming,SQL,Machine Learning以及Graph等。這即Matei Zaharia所謂的“設計一個通用的程式設計抽象(Unified Programming Abstraction)。
RDD的全稱為Resilient Distributed Datasets,是一個並行的,容錯的資料結構,方便讓使用者顯式地儲存於記憶體中(當記憶體不夠只有儲存在磁碟上),並且方便使用者控制資料的分割槽。
RDD是spark中的核心概念,是一個只讀的分散式記憶體資料集。與hadoop不一樣的地方在於這個資料集是快取在記憶體之中,特別方便於資料的迭代計算。在使用者訪問RDD時,指標只會指向與操作相關的部分,這樣就避免了對整個資料集進行全域性掃描。

2.transformation與action

RDD中提供了兩種型別的操作:transformation與action。
首先需要明確的一點是:rdd無論執行了多少次的transformation操作,rdd都沒有真正執行運算,只是從一個rdd轉換成另一個rdd而已。只有當某一個action操作被執行後,才真正觸發運算。這就是所謂的transformation採取的是懶載入策略(lazy)。
transformation,顧名思義,是得到一個新的rdd。生成一個rdd有兩種方法:1.從資料來源生成一個rdd。2.由一個rdd生成一個新的rdd。
常見的transformation有map,filter,flatMap,union,join,reduceByKey等操作,後續再進行詳細的介紹。
action,是得到一個值,或者得到一個結果直接cache到記憶體中。
常見的action操作有take,count,collect,reduce,foreach,saveAsTextFile,saveAsSequenceFile等。

3.窄依賴與寬依賴

RDD作為資料結構,本質上是一個只讀的分割槽記錄集合。一個RDD可以包含多個分割槽,每個分割槽就是一個dataset片段。RDD可以相互依賴。如果RDD的每個分割槽最多隻能被一個Child RDD的一個分割槽使用,則稱之為窄依賴narrow dependency;若多個Child RDD分割槽都可以依賴,則稱之為寬依賴wide dependency。不同的操作依據其特性,可能會產生不同的依賴。例如map操作會產生narrow dependency,而join操作則產生wide dependency。
這裡寫圖片描述

Spark之所以將依賴分為narrow與wide,基於兩點原因:一個結點上得管道化執行與更好地處理失敗恢復。

首先,narrow dependencies可以支援在同一個cluster node上以管道形式執行多條命令,例如在執行了map後,緊接著執行filter。相反,wide dependencies需要所有的父分割槽都是可用的,可能還需要呼叫類似MapReduce之類的操作進行跨節點傳遞。
其次,則是從失敗恢復的角度考慮。narrow dependencies的失敗恢復更有效,因為它只需要重新計算丟失的parent partition即可,而且可以並行地在不同節點進行重計算。而wide dependencies牽涉到RDD各級的多個Parent Partitions。(此部分內容摘自於網路)

4.容錯

一般來說,分散式資料集的容錯性有兩種方式:資料檢查點和記錄資料的更新。
面向大規模資料分析,資料檢查點操作成本很高,需要通過資料中心的網路連線在機器之間複製龐大的資料集,而網路頻寬往往比記憶體頻寬低得多,同時還需要消耗更多的儲存資源。
因此,Spark選擇記錄更新的方式。但是,如果更新粒度太細太多,那麼記錄更新成本也不低。Spark RDD只支援粗粒度的操作,對一個RDD的操作都會被作用於該RDD的所有資料;為了保證RDD的高可用性RDD通過使用Lineage(血統)記錄了RDD演變流程(從其他RDD到當前RDD所做的操作) 當RDD分割槽資料丟失時可以通過Lineage的資訊重新計算與恢復分割槽資料,或進行RDD的重建。