spark2原理分析-RDD基本原理分析
概述
RDD是spark的基礎,本文描述了RDD的基本概念,和RDD的性質。
RDD基本原理
(Resilient Distributed Dataset) 彈性分散式資料集,又稱RDD,是spark中資料的基本抽象,它是spark的核心。最早的rdd的設計思想可以參考論文:可伸縮性分散式資料集(Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing)。它代表一個可以並行操作的,不可修改的,分割槽元素的集合。
一個RDD是一個彈性的分散式記錄集,它分佈在一個或多個分割槽上。(可以把RDD和scala的collections 進行類比,不過scala的collections是在單個jvm上,而RDD是分佈在多個jvm上。)
spark的rdd隱藏資料分割槽和資料分佈,因此可以使用高階語言設計並行的計算框架。
RDD的基本特性
- 彈性(Resilient)(容錯性)
通過RDD血緣關係圖(RDD lineage graph)來保證容錯性。當由於節點宕機而導致計算失敗,可以通過RDD的血緣關係圖來重新計算丟失和損壞的分割槽。
- 分散式(Distributed)
資料分佈在叢集的多個節點上。
- 不可變(Immutable)
RDD的資料一旦建立就不能修改,只能通過transformations函式建立新的RDD。
RDD的其他特性
RDD除了介紹的基本特性,RDD還具有以下特性:
- 資料集(Dataset)
多個RDD可以構成一個數據集。資料集是多個分割槽的集合,這些資料可能是主型別的值,或者是值的值。比如字串的RDD,或者是陣列的RDD。
- 基於記憶體的(In-Memory)
RDD的資料儘可能多、儘可能長時間的儲存在記憶體中。
- 懶評估(Lazy evaluated)
transformations函式不會執行,直到執行action函式。(RDD的這兩種函式後面會有文章專門講解)
- 可以持久化:
RDD的資料可以儲存在快取中,也可以持久化到硬碟。
- 並行(Parallel)
RDD的資料處理是並行的。
- 分割槽的(Partitioned)
RDD的資料是分割槽的,資料被分佈在叢集的多個節點上。
- RDD是型別(Typed)
每個RDD都是有型別的,比如:RDD[Long]中的Long型別,RDD[(Int,String)]中的(Int, String)型別。
- 本地粘性
RDD可以定義首選的位置,讓計算過程儘可能接近資料分割槽。
- 其他說明
在RDD中,分割槽的計算被設計成一個分散式的過程,是為了實現資料的均勻分佈以及利用資料本地化(如HDFS分散式系統的資料分割槽)。
分割槽是並行處理的單元,你可以通過重新分割槽(repartition)或合併轉換(coalesce)來控制分割槽的數量。 spark試圖儘可能靠近需要訪問的資料,而不浪費時間通過RDD shuffling傳送資料在網路上,建立的分割槽儘可能和儲存系統的保持一致,從而優化資料訪問。
RDD的操作型別
RDDS支援兩種操作:
- transformations(轉換)
RDD的轉換操作由RDD的轉換函式來實現,它們是懶操作函式(lazy operations functions),用來返回另一個RDD。 之所以是lazy的,是由於,當呼叫它們時不會立即執行,只有等到actions函式執行時,才被執行。
- actions(動作/操作)
當呼叫RDD的action函式時,將會觸發計算,並返回計算結果。
總結
本文介紹了spark RDD的基本概念和RDD的特性。通過本文介紹應該對Spark的核心:RDD有一個比較全面的瞭解。