1. 程式人生 > >spark的調優

spark的調優

evel 重新 清除 效率 外部 負責 取數 拉取 可能性

一、持久化

1、概念

一個RDD,執行多次操作,每次操作都需要計算得到這個RDD,

持久化就是第一次計算的時候,把這個執行多次的RDD持久化到內存或磁盤,這個RDD就只計算一次,以後的多次操作都只需要從內存或磁盤讀取這個RDD就可以了

那麽我們就不需要多次計算同一個RDD,從而在很多場景下,可以大幅度提升我們spark應用程序的性能

官方文檔說,合理使用RDD持久化機制,甚至可以提升spark應用程序的性能,10倍

2、實現持久化的方法

RDD.cache() cache()的底層就是調用了persist()方法的無參版本

RDD.persist(StorageLevel.MEMORY_ONLY) MEMORY_ONLY----持久化的級別

3、持久化級別

spark提供的多種持久化級別,主要是為了在cpu和內存消耗之間進行取舍

(1)、MEMORY_ONLY,persist()方法默認的策略,也是持久化優先選擇的策略,如果可以緩存所有數據的話,那麽就使用這種策略。因為純內存速度最快,而且沒有序列化,不需要消耗cpu進行反序列化操作。

(2)、MEMORY_ONLY_SER,這種策略如果緩存不了所有數據的話,會進行序列化存儲,純內存操作還是非常快的,只是要消耗cpu進行反序列化

(3)、後綴為_2,這種策略會進行數據的備份,可以進行快速的失敗恢復,這樣在失敗時,就不需要重新計算了

(4)、DISK,持久化到磁盤,能不使用DISK相關的策略,就不用使用,有的時候,從磁盤讀取數據,還不如重新計算一次

二、廣播變量

1、廣播變量的使用場景

如果在rdd中使用了外部變量,那麽每個task都會拷貝外部變量的一個副本到executor上去執行。

例如,一個job會產生100個task,這100個task加入都發送到同一個executor上去執行,那麽意味著每個task都需要帶一個外部變量的副本到executor上執行,如果這個外部變量大小是1G,就意味著總共會有100G的數據通過網絡傳輸到executor上執行,這樣會大大

消耗網絡流量和浪費executor的內存,降低Spark的運行效率,增加了spark作業的運行時間

2、使用廣播變量的優點

如果把外部變量做成廣播變量,同樣的一個job產生的100個task,發送到executor上執行,此時spark會將這個廣播變量保存到每個executor的blockManager中,那麽當task執行的時候就不需要從driver上拉取這個外部變量,這樣的話會大大降低傳輸到executor上

的數據(100G--->1G),降低網絡傳輸流量和降低executor的內存消耗

3、廣播變量的運行機制

(1)、當executor上的第一個task運行的時候,首先去executor的blockManager上獲取這個廣播變量,如果不存在,會去鄰居的executor的blockManager中獲取,如果都獲取不到,就會去Driver端拉取這個廣播變量,然後將其保存到executor的blockManager中

(2)、當executor在執行之後的task任務時,則直接從executor的blockManager中獲取這個廣播變量

4、註意

廣播變量是只讀的,不可進行修改


三、Checkpoint(容錯機制)

1、Chcekpoint的原理剖析

(1)、RDD.checkpoint(),對RDD調用checkpoint()方法之後,它就接受RDDCheckpointData對象的管理

(2)、RDDCheckpointData對象,會負責將調用了checkpoint()方法的RDD的狀態,設置為MarkedForCheckpoint

(3)、RDD所在job運行結束了,會調用job中,最後一個RDD的doCheckpoint()方法,該方法沿著finalRDD的lineage(RDD血緣關系,依賴鏈條)向上查找,標記為MarkedForCheckpoint的RDD,並將其標記為CheckpointingInProgress

(4)、啟動一個單獨的job,來將lineage中,標記為CheckpointingInProgress的RDD,進行checkpoint操作,也就是,將其數據,寫入SparkContext.setCheckpointDir()方法設置的文件系統中。

(5)、將RDD的數據進行checkpoint之後,會改變RDD的lineage。也就是說,會清除掉rdd所有的依賴rdd,並強行將其父rdd設置為一個CheckpointRDD,而且RDD狀態變成Checkpointed

2、Checkpoint和持久化的區別

(1)、血緣關系

持久化,只是把數據持久化到內存或磁盤中,rdd的血緣關系是不變的。但是checkpoint執行完之後,rdd已經沒有之前所謂的依賴rdd了,而只有一個強行為其設置的CheckpointRDD,那麽也就是說,checkpoint之後,rdd的lineage就改變了

(2)、數據丟失

持久化的數據丟失的可能性更大,磁盤,或者是內存,可能丟失,但是checkpoint的數據,通常是保存在容錯、高可用的文件系統,所以checkpoint的數據丟失的可能性非常低。

spark的調優