RDD簡介算法
RDD(Resilient Distributed Dataset)叫作分佈式數據集,是Spark中最基本的數據抽象,它表明一個不可變、可分區、裏面的元素可並行計算的集合。RDD是一個類數組
RDD的屬性緩存
1.一個列表,存儲存取每一個Partition的優先位置(preferred location)。對於一個HDFS文件來講,這個列表保存的就是每一個Partition所在的塊的位置。按照「移動數據不如移動計算」的理念,Spark在進行任務調度的時候,會盡量地將計算任務分配到其所要處理數據塊的存儲位置。
2.保存了計算每一個分區的函數,這個計算方法會應用到每個數據塊上,Spark中RDD的計算是以分片爲單位的,每一個RDD都會實現compute函數以達到這個目的。compute函數會對迭代器進行復合,不須要保存每次計算的結果。
3.RDD之間的依賴關係。RDD的每次轉換都會生成一個新的RDD,因此RDD之間就會造成相似於流水線同樣的先後依賴關係。在部分分區數據丟失時,Spark能夠經過這個依賴關係從新計算丟失的分區數據,而不是對RDD的全部分區進行從新計算。
4.RDD的分片函數(Partitioner),一個是基於哈希的HashPartitioner,另一個是基於範圍的RangePartitioner。只有對於於key-value的RDD,纔會有Partitioner,非key-value的RDD的Parititioner的值是None。Partitioner函數不但決定了RDD自己的分片數量,也決定了parent RDD Shuffle輸出時的分片數量。
5.一組分片(Partition),即數據集的基本組成單位。對於RDD來講,每一個分片都會被一個計算任務處理,並決定並行計算的粒度。用戶能夠在建立RDD時指定RDD的分片個數,若是沒有指定,那麼就會採用默認值。默認值就是程序所分配到的CPU Core的數目。框架
如何建立RDD分佈式
1.經過序列化集合的方式建立RDD(parallelize,makeRDD)
2.經過讀取外部的數據源(testFile)
3.經過其餘的rdd作transformation操做轉換成行的RDD函數
RDD的兩種算子:oop
1.Transformationspa
2.Actionorm
RDD的依賴關係排序
1.窄依賴
窄依賴指的是每個父RDD的Partition最多被子RDD的一個Partition使用
總結:窄依賴咱們形象的比喻爲獨生子女
2.寬依賴
寬依賴指的是多個子RDD的Partition會依賴同一個父RDD的Partition
總結:寬依賴咱們形象的比喻爲超生
3.Lineage(血統)
RDD只支持粗粒度轉換,即在大量記錄上執行的單個操做。將建立RDD的一系列Lineage(即血統)記錄下來,以便恢復丟失的分區。RDD的Lineage會記錄RDD的元數據信息和轉換行爲,當該RDD的部分分區數據丟失時,它能夠根據這些信息來從新運算和恢復丟失的數據分區。
DAG的生成
DAG(Directed Acyclic Graph)叫作有向無環圖,原始的RDD經過一系列的轉換就就造成了DAG,根據RDD之間的依賴關係的不一樣將DAG劃分紅不一樣的Stage,對於窄依賴,partition的轉換處理在Stage中完成計算。對於寬依賴,因爲有Shuffle的存在,只能在parent RDD處理完成後,才能開始接下來的計算,所以寬依賴是劃分Stage的依據。
RDD的緩存
Spark速度很是快的緣由之一,就是在不一樣操做中能夠在內存中持久化或緩存個數據集。當持久化某個RDD後,每個節點都將把計算的分片結果保存在內存中,並在對此RDD或衍生出的RDD進行的其餘動做中重用。這使得後續的動做變得更加迅速。RDD相關的持久化和緩存,是Spark最重要的特徵之一。能夠說,緩存是Spark構建迭代式算法和快速交互式查詢的關鍵。
找依賴關係劃分stage的目的之一就是劃分緩存, 如何經過stage的劃分設置緩存?
(1)在窄依賴想設置緩存時用cache
(2)在寬依賴想設置緩存時用checkpoint
如何設置cache和checkpoint?
cache:someRDD.cache()就添加成功緩存,放入到內存中
someRDD.persist(StorageLevel.MEMORY_AND_DISK):根據本身的須要設置緩存的位置(內存和硬盤)
checkpoint:能夠把RDD計算後的數據存儲在本地磁盤上,也能夠是hdfs
sc.setCheckpointDIr("hdfs://hadoop1:9000/checkpoint")設置checkpoint的路徑 在寬依賴前設置
someRDD.checkpoint()設置checkpoint
cache 和checkpoint的區別
cache只是緩存數據,不改變RDD的依賴關係,checkpoint生成了一個新的RDD,後面的RDD將依賴新的RDD依賴關係已經改變 。數據恢復的順序:checkpoint ---》cache--》重算