Spark RDD解密

 

1.  基於數據集的處理: 從物理存儲上加載數據,而後操做數據,而後寫入數據到物理設備mysql

    基於數據集的操做不適應的場景:sql

  1. 不適合於大量的迭代:
  2. 不適合交互式查詢:每次查詢都須要對磁盤進行交互.
  3. 基於數據流的方式不可以複用曾經的結果或者中間的結果; 

2. RDD彈性數據集函數

   特色: 性能

       A)自動的進行內存和磁盤數據的存儲切換:spa

       B) 基於lineage的高效容錯;scala

       C) Task若是失敗會自動進行重試接口

       D) Stage若是失敗會自動進行重試,並且只會計算失敗的分片;內存

       E) Checkpointpersist.ci

3.  數據分片的高度彈性. Partition合併能夠提高效率(數據比較小的適合),  數據大的時候能夠提升partition設置,避免OOM. 若是小的分片變大的時候,通常須要shuffle. 可使用coalesce.同步

      def coalesce(numPartitions: Int, shuffle: Boolean = false)

    (implicit ord: Ordering[T] = null): RDD[T]

      返回一個新的RDD,且該RDD的分區個數等於numPartitions個數。若是shuffle設置爲true,則會進行shuffle.

      def repartition(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T]

     該函數其實就是coalesce函數第二個參數爲true的實現

      repartition(numPartitions:Int):RDD[T]coalesce(numPartitions:Intshuffle:Boolean=false):RDD[T] 

      他們兩個都是RDD的分區進行從新劃分,repartition只是coalesce接口中shuffletrue的簡易實現,(假設RDDN個分區,須要從新劃分紅M個分區)

1)、N<M。通常狀況下N個分區有數據分佈不均勻的情況,利用HashPartitioner函數將數據從新分區爲M個,這時須要將shuffle設置爲true

2)若是N>M而且NM相差很少,(假如N1000M100)那麼就能夠將N個分區中的若干個分區合併成一個新的分區,最終合併爲M個分區,這時能夠將shuff設置爲false,在shufflfalse的狀況下,若是M>N時,coalesce爲無效的,不進行shuffle過程,父RDD和子RDD之間是窄依賴關係。

3)若是N>M而且二者相差懸殊,這時若是將shuffle設置爲false,父子RDD是窄依賴關係,他們同處在一個Stage中,就可能形成spark程序的並行度不夠,從而影響性能,若是在M1的時候,爲了使coalesce以前的操做有更好的並行度,能夠講shuffle設置爲true

總之:若是shufffalse時,若是傳入的參數大於現有的分區數目,RDD的分區數不變,也就是說不通過shuffle,是沒法將RDD的分區數變多的。

4. RDD的延遲加載. Lazy. 構造的時候的第一個參數就是父RDD;

      就至關於 f(x) = x + 1; x =y+1; y=z+1; 這就是依賴,最終的計算是先計算z的值,而後再計算y的值,最終計算出f(x);

      Spark不產生中間結果,可是須要手動cachepersist. 內存消耗比較大,最主要是sparkshuffle機制(spark1.x之前有數據規模的限制.如今沒有,緣由主要是shuffle的緣由,可是最新版本以來shuffle支持更多的方式.

5.  容錯的兩種方式: 數據檢查點和記錄數據的更新;

         Spark採起的是記錄數據更新方式容錯爲何更高效:

        A) RDD是不可變 + lazy:數據的恢復須要checkpoint. 好比從第900步恢復的前提是要在900步進行checkpoint.

        B) RDD是粗粒度.  寫操做是粗粒度.可是rdd讀操做既能夠是粗粒度也能夠是細粒度的高效率的簡化複雜度但有部分場景不適合spark rdd. 爬蟲就不合適.

 

6. 關於數據本地性問題若是讀取的是好比mysql, hbase,那麼須要這些集羣和spark集羣在一個集羣裏這樣都是內網進行讀取針對不一樣機房數據不一樣步問題能夠採用Tachyon 內存同步.

7. 實時事物性處理不適用spark.

8.  若是是scala集合的話,那麼針對數據本地性,是數據集合會被copy到計算節點內存當中.

相關文章
相關標籤/搜索