【Spark篇】---Spark中控制運算元

LHBlog發表於2018-02-02

一、前述

 

Spark中控制運算元也是懶執行的,需要Action運算元觸發才能執行,主要是為了對資料進行快取。

控制運算元有三種,cache,persist,checkpoint以上運算元都可以將RDD持久化持久化的單位是partitioncache和persist都是懶執行的。必須有一個action類運算元觸發執行。checkpoint運算元不僅能將RDD持久化到磁碟,還能切斷RDD之間的依賴關係。

 

二、具體運算元

 

1、 cache

 

預設將RDD的資料持久化到記憶體cache是執行

chche () = persist()=persist(StorageLevel.Memory_Only)

 

 SparkConf conf = new SparkConf();
 conf.setMaster("local").setAppName("CacheTest");
 JavaSparkContext jsc = new JavaSparkContext(conf);
 JavaRDD<String> lines = jsc.textFile("./NASA_access_log_Aug95");

 lines = lines.cache();
 long startTime = System.currentTimeMillis();
 long count = lines.count();//count是action運算元,到這裡才能觸發cache執行,所以這一次coun載入是從磁碟讀資料,然後拉回到drive端。
 long endTime = System.currentTimeMillis();
 System.out.println("共"+count+ "條資料,"+"初始化時間+cache時間+計算時間="+ 
          (endTime-startTime));
        
 long countStartTime = System.currentTimeMillis();
 long countrResult = lines.count();//這一次是從記憶體種中讀資料
 long countEndTime = System.currentTimeMillis();
 System.out.println("共"+countrResult+ "條資料,"+"計算時間="+ (countEndTime-
           countStartTime));
        
 jsc.stop();

 

2、persist(可以指定持久化的級別

 

解釋:

 

1、MEMORY_AND_DISK 意思是先往記憶體中放資料,記憶體不夠再放磁碟

2、最常用的是MEMORY_ONLYMEMORY_AND_DISK”_2”表示有副本數。

3、選擇的原則是:首先考慮記憶體,然後考慮序列化之後再放入記憶體,最後考慮記憶體加磁碟。

4、儘量避免使用“_2”和DISK_ONLY級別。

5、deserialized是不序列化的意思。

 

注意事項:

 

  1. 1、cache和persist都是懶執行,必須有一個action類運算元觸發執行。
  2. 2、cache和persist運算元的返回值可以賦值給一個變數,在其他job中直接使用這個變數就是使用持久化的資料了。持久化的單位是partition。
  3. 3、cache和persist運算元後不能立即緊跟action運算元。

錯誤:

rdd.cache().count() 返回的不是持久化的RDD,而是一個數值了

 

3、 Checkpoint(對Lineage非常長時使用

 

     1、概念和特徵:

 

           不僅可以將資料持久化到磁碟,還可以切斷RDD之間的依賴關係,checkpoint也是懶執行。

            Checkpoin不僅儲存結果,還會儲存邏輯,還可以儲存後設資料。

            Persisit切斷不了RDD的依賴關係。

 

     2、checkpoint 的執行原理:

 

           2.1.Spark job執行完之後,spark會從finalRDD從後往前回溯。

           2.2.當回溯到對某個RDD進行了checkpoint,會對這個RDD標記。

           2.3.回溯完成之後,Spark會重新計算標記RDD的結果,然後將結果儲存到Checkpint目錄中。

 

   3、優化checekpoint

 

  • 因為最後是要觸發當前application的action運算元,所以在觸發之前加一層cache操作,一樣會往前執行cache操作,實現對資料的cache ,所以考慮將cache優化到checkpoin的優化流程裡。
  • RDD執行checkpoint之前,最好對這個RDD先執行cache,這樣新啟動的job(回溯完成之後重新開的job)只需要將記憶體中的資料(cache快取好的checkpoint那個點的資料)拷貝到HDFS上就可以。
  • 省去了重新計算這一步,不需要重頭開始來走到checkpoint這個點了。

 

總結:

 

持久化的最小單位是partition!!!

 

 

相關文章