SparkCore解析2

1、RDD任務劃分

RDD任務切分分爲:Application、Job、Stage和Task

1)Application:初始化一個SparkContext即生成一個Application

2)Job:一個Action算子就會生成一個Job

3)Stage:根據RDD之間的依賴關係的不同將Job劃分成不同的Stage,遇到一個寬依賴則劃分一個Stage。

4)Task:Stage是一個TaskSet,將Stage劃分的結果發送到不同的Executor執行即爲一個Task。

注意:Application->Job->Stage-> Task每一層都是1對n的關係。

2、 RDD緩存(每次取用RDD不需要重複計算,還是之前的RDD對象)

RDD通過persist方法或cache方法可以將前面的計算結果緩存,默認情況下 persist() 會把數據以序列化的形式緩存在 JVM 的堆空間中。

緩存有可能丟失,或者存儲於內存的數據由於內存不足而被刪除

RDD的緩存容錯機制保證了即使緩存丟失也能保證計算的正確執行。通過基於RDD的一系列轉換,丟失的數據會被重算,由於RDD的各個Partition是相對獨立的,因此只需要計算丟失的部分即可,並不需要重算全部Partition。

3、RDD CheckPoint

Spark中對於數據的保存除了持久化操作之外,還提供了一種檢查點的機制,檢查點(本質是通過將RDD寫入Disk做檢查點)是爲了通過lineage做容錯的輔助,lineage過長會造成容錯成本過高,這樣就不如在中間階段做檢查點容錯,如果之後有節點出現問題而丟失分區,從做檢查點的RDD開始重做Lineage,就會減少開銷。檢查點通過將數據寫入到HDFS文件系統實現了RDD的檢查點功能。

4、鍵值對RDD數據分區器

Spark目前支持Hash分區和Range分區,用戶也可以自定義分區

注意:

(1)只有Key-Value類型的RDD纔有分區器的,非Key-Value類型的RDD分區器的值是None
(2)每個RDD的分區ID範圍:0~numPartitions-1,決定這個值是屬於那個分區的。

Hash分區

HashPartitioner分區的原理:對於給定的key,計算其hashCode,併除以分區的個數取餘,如果餘數小於0,則用餘數+分區的個數(否則加0),最後返回的值就是這個key所屬的分區ID。

Ranger分區

HashPartitioner分區弊端:可能導致每個分區中數據量的不均勻,極端情況下會導致某些分區擁有RDD的全部數據。

自定義分區

需要繼承 org.apache.spark.Partitioner 類並實現下面三個方法。 numPartitions: Int,getPartition(key: Any): Int:,equals():Java

使用自定義的 Partitioner 是很容易的:只要把它傳給 partitionBy() 方法即可

5、數據的存儲與保存

Spark的數據讀取及數據保存可以從兩個維度來作區分:文件格式以及文件系統。

文件格式分爲:Text文件Json文件、Csv文件、Sequence文件以及Object文件;

文件系統分爲:本地文件系統、HDFSHBASE以及數據庫。

文件類數據讀取與保存

1) Text文件

數據讀取:textFile(String)

數據保存: saveAsTextFile(String)

2)Json文件(應用中多是採用SparkSQL處理JSON文件。)

如果JSON文件中每一行就是一個JSON記錄,那麼可以通過將JSON文件當做文本文件來讀取

3)Sequence文件

 SequenceFile文件是Hadoop用來存儲二進制形式的key-value對而設計的一種平面文件(Flat File)。Spark 有專門用來讀取 SequenceFile 的接口。在 SparkContext 中,可以調用 sequenceFile[ keyClass, valueClass](path)。

注意:SequenceFile文件只針對PairRDD

4)對象文件

對象文件是將對象序列化後保存的文件,採用Java的序列化機制。

​​​​​​​文件系統類數據讀取與保存

1) HDFS

2) MySQL

3)HBase數據庫​​​​​​​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章