??spark提供了對數據的核心抽象——彈性分布式數據集(Resilient Distributed Dataset,簡稱RDD)。RDD是一個分布式的數據集合,數據可以跨越集群中的多個機器節點,被分區并行執行。
??在spark中,對數據的所有操作不外乎創建RDD、轉化已有RDD及調用RDD操作進行求值。spark會自動地將RDD中的數據分發到集群中并行執行。
??spark提供了兩種創建RDD的方式:讀取外部數據源、將驅動器程序中的集合進行并行化。
??使用sparkContext的parallelize()方法將集合并行化。
??parallelize()方法第二個參數可指定分區數。spark會為每個分區創建一個task任務,通常每個cpu需要2-4個分區。spark會自動地根據集群大小設置分區數,也支持通過parallelize()方法的第二個參數手動指定。
val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data)
List<Integer> data = Arrays.asList(1, 2, 3, 4, 5);
JavaRDD<Integer> distData = sc.parallelize(data);
data = [1, 2, 3, 4, 5]
distData = sc.parallelize(data)
??注:除了開發和測試外,這種方式用得不多。這種方式需要把整個數據集先放到一臺機器的內存中。
??spark可接入多種hadoop支持的數據源來創建分布式數據集。包括:本地文件系統、HDFS、Cassandra、HBase、Amazon S3等。
??spark支持多種存儲格式,包括textFiles、SequenceFiles及其他hadoop存儲格式。
scala> val distFile = sc.textFile("data.txt")
distFile: org.apache.spark.rdd.RDD[String] = data.txt MapPartitionsRDD[10] at textFile at <console>:26
JavaRDD<String> distFile = sc.textFile("data.txt");
>>> distFile = sc.textFile("data.txt")
??RDD支持兩種操作:轉化操作和行動操作。
??RDD的轉化操作會返回一個新的RDD。轉化操作是惰性求值的,只有行動操作用到轉化操作生成的RDD時,才會真正進行轉化。
??spark使用lineage(血統)來記錄轉化操作生成的不同RDD之間的依賴關系。依賴分為窄依賴(narrow dependencies)和寬依賴(wide dependencies)。
寬依賴
對兩個RDD基于key進行合并和重組,如join
??行動操作則會向驅動器程序返回結果或把結果寫入外部系統,會觸發實際的計算。
??RDD通過persist方法或cache方法可以將前面的計算結果緩存,但是并不是這兩個方法被調用時立即緩存,而是觸發后面的action時,該RDD將會被緩存在計算節點的內存中,并供后面重用。
??cache最終也是調用了persist方法,默認的存儲級別是僅在內存存儲一份。
??Spark的存儲級別還有好多種,存儲級別在object StorageLevel中定義的。
??緩存有可能丟失,RDD的緩存容錯機制保證即使緩存丟失也能保證計算正確執行。通過基于RDD的一系列轉換,丟失的數據會被重算,由于RDD的各個Partition是相對獨立的,因此只需要計算丟失的部分即可,并不需要重算全部Partition。
Lineage機制
RDD的Lineage記錄的是粗粒度的特定數據Transformation操作行為。當RDD的部分分區數據丟失時,可以通過Lineage來重新運算和恢復丟失的數據分區。這種粗顆粒的數據模型,限制了Spark的運用場合,所以Spark并不適用于所有高性能要求的場景,但同時相比細顆粒度的數據模型,也帶來了性能的提升。
Spark Lineage機制是通過RDD的依賴關系來執行的
窄依賴可以在某個計算節點上直接通過計算父RDD的某塊數據計算得到子RDD對應的某塊數據。
Checkpoint機制
簡介
實現方式(checkpoint有兩種實現方式,如果代碼中沒有設置checkpoint,則使用local的checkpoint模式,如果設置路徑,則使用reliable的checkpoint模式。)
LocalRDDCheckpointData:臨時存儲在本地executor的磁盤和內存上。該實現的特點是比較快,適合lineage信息需要經常被刪除的場景(如GraphX),可容忍executor掛掉。
忠于技術,熱愛分享。歡迎關注公眾號:java大數據編程,了解更多技術內容。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。