Spark中最核心的概念為 RDD(Resilient Distributed DataSets) 中文為: 彈性分散式數據集 ,RDD為對分散式記憶體對象的 抽象它表示一個 被分區不可變 且能 並行操作 的數據集;RDD為可序列化的、可緩存到記憶體對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
文章首發地址:Solinx
http://www.solinx.co/archives/548