Spark核心——RDD
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