RDD(Resilient Distributed Datasets) [1] ,彈性分佈式數據集, 是分佈式內存的一個抽象概念,RDD提供了一種高度受限的共享內存模型,即RDD是隻讀的記錄分區的集合,只能通過在其他RDD執行確定的轉換操作(如map、join和group by)而創建,然而這些限制使得實現容錯的開銷很低。對開發者而言,RDD可以看作是Spark的一個對象,它本身運行於內存中,如讀文件是一個RDD,對文件計算是一個RDD,結果集也是一個RDD ,不同的分片、 數據之間的依賴 、key-value類型的map數據都可以看做RDD。
RDD定義
RDD,Resilient Distributed DataSet:是一個容錯的,並行的數據結構,可以顯示制定數據存儲的位置(磁盤、內存【堆內內存,堆外內存】),能夠控制分區,提供豐富的數據處理操作。
彈性的體現方式:
- 自動的進行內存和磁盤數據存儲的切換
- 基於Lineage的高效容錯(第n個節點出錯,會從第n-1個節點回復,血統容錯)
- Task如果失敗會自動進行特定次數的重試
- 將每一個計算階段記爲一個Stage,Stage如果失敗會自動進行特定次數的重試(可以只運行計算失敗的階段);只計算失敗的數據分片
- checkpoint 和 persist,斷點與持久化
- 數據調度彈性:DAG TASK 和資源管理無關
- 數據分片的高度彈性(人工自由設置分片函數),repartition
RDD五大特性
- 數據存儲結構不可變
- 支持跨集羣的分佈式數據操作
- 可對數據記錄按Key進行分區
- 提供了粗粒度的轉換操作
- 數據存儲在內存中,保證了低延遲性
RDD內部五大接口:
-
partition:
-
preferredLocation§:
-
dependencies():
-
compute§:
-
paritioner():
創建RDD的常見方式
-
通過Scala集合創建
val rdd1 = sc.makeRDD(1 to 1000); val rdd2 = sc.parallelize(1 to 100,3);
-
通過本地文件創建
VAL DATA = SC.TEXTfILE("file:///home/hadoop/datas/data"):注意:各個節點相同目錄都需要存一份相同的文件,不然創建任務的時候會失敗。
-
通過HDFS文件創建
val hdfsdata = sc.textFile("hdfs://master:8082/datas/data") // 從hdfs加載文件創建RDD。注意:必須寫明從哪個文件系統加載問價,寫清楚url
-
通過其他RDD轉換得到
val hdfsrdd = sc.textFile("hdfs://master:8082/datas/data") hdfsrdd.map(row=>{row.split("").mkString("--")}).collect()
-
通過其他方式創建(如數據流,讀取NoSQL如HBase中的數據等,讀取關係型數據庫等)
RDD算子操作
map
flatmap
fliter
…