Spark核心——RDD

jopen 8年前發布 | 8K 次閱讀 Spark 分布式/云計算/大數據

Spark中最核心的概念為 RDD(Resilient Distributed DataSets) 中文為: 彈性分布式數據集 ,RDD為對分布式內存對象的 抽象它表示一個 被分區不可變 且能 并行操作 的數據集;RDD為可序列化的、可緩存到內存對RDD進行操作過后還可以存到內存中,下次操作直接把內存中RDD作為輸入,避免了Hadoop MapReduce的大IO操作;

RDD生成

Spark所要處理的任何數據都是存儲在RDD之中,目前兩種方式可以生成一個RDD:

1、從RDD進行轉換操作

2、使用外部存儲系統創建,如:HDFS;

RDD操作

RDD支持兩種操作:

轉換(transformation operation)

轉換操作將一個RDD經過操作后返回一個全新的RDD,轉換操是lazy(惰性)的這期間不會產生任何數據的計算;

轉換函數有:distinct、filter、map、flatMap、union、groupByKey等;

行動(action operation)

每一個行動操作都會觸發Spark Job進行計算并返回最終的結果, 行動操作有這么幾類: 返回標量,count返回元素的個數;返回Scala集合,task(n)返回0到n-1組成的集合;寫入外部存儲,saveAsHadoopFile(path)存儲到HDFS;

行動函數有:count、top、task、saveAsHadoopFile等;

RDD為 不可變 的數據集,可以使用轉換操作“修改”一個RDD,但這操作過后返回的是一個全新的RDD 原本RDD并沒有改變;

RDD狀態轉換圖

Lineage

Spark RDD只支持 粗粒度 的操作,對一個RDD的操作都會被作用于該RDD的所有數據;為了保證RDD的高可用性RDD通過使用 Lineage(血統)記錄 了RDD演變流程(從其他RDD到當前RDD所做的操作) 當RDD分區數據丟失時可以通過Lineage的信息重新計算與恢復分區數據,或進行RDD的重建;

RDD的依賴關系(dependencies):

由于對RDD的操作都是粗粒度的一個轉換操作過后都會產生一個新的RDD,RDD之間會形成一個前后依賴關系;Spark中存在兩種依賴:窄依賴(Narrow Dependencies)、寬依賴(Wide Dependencies);

窄依賴(Narrow Dependencies):一個父RDD的分區只能被一個子RDD的一個分區使用;

寬依賴(Wide Dependencies):多個子RDD的分區依賴于一個父RDD的同一個分區;

窄依賴的節點(RDD)關系如果流水一般,所以當節點失敗后只需重新計算父節點的分區即可,寬依賴需要重新計算父節點的多個分區代價是非常昂貴的;

窄依賴Narrow

寬依賴Wide

參考資料:

http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf

http://spark.apache.org/docs/latest/programming-guide.html

來自: http://www.solinx.co/archives/548

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!