Spark RDD解密
?
1.??基于數據集的處理:?從物理存儲上加載數據,然后操作數據,然后寫入數據到物理設備;?
? ? 基于數據集的操作不適應的場景:
2. RDD彈性數據集
???特點:?
? ? ? ?A)自動的進行內存和磁盤數據的存儲切換:
???????B)?基于lineage的高效容錯;
???????C)?Task如果失敗會自動進行重試
? ? ? ?D)?Stage如果失敗會自動進行重試,而且只會計算失敗的分片;
???????E)?Checkpoint和persist.
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:Int,shuffle:Boolean=false):RDD[T]?
? ? ? 他們兩個都是RDD的分區進行重新劃分,repartition只是coalesce接口中shuffle為true的簡易實現,(假設RDD有N個分區,需要重新劃分成M個分區)
1)、N<M。一般情況下N個分區有數據分布不均勻的狀況,利用HashPartitioner函數將數據重新分區為M個,這時需要將shuffle設置為true。
2)如果N>M并且N和M相差不多,(假如N是1000,M是100)那么就可以將N個分區中的若干個分區合并成一個新的分區,最終合并為M個分區,這時可以將shuff設置為false,在shuffl為false的情況下,如果M>N時,coalesce為無效的,不進行shuffle過程,父RDD和子RDD之間是窄依賴關系。
3)如果N>M并且兩者相差懸殊,這時如果將shuffle設置為false,父子RDD是窄依賴關系,他們同處在一個Stage中,就可能造成spark程序的并行度不夠,從而影響性能,如果在M為1的時候,為了使coalesce之前的操作有更好的并行度,可以講shuffle設置為true。
總之:如果shuff為false時,如果傳入的參數大于現有的分區數目,RDD的分區數不變,也就是說不經過shuffle,是無法將RDD的分區數變多的。
4. RDD的延遲加載.?Lazy.?構造的時候的第一個參數就是父RDD;
? ? ? 就相當于?f(x)?=?x?+?1;?x?=y+1;?y=z+1;?這就是依賴,最終的計算是先計算z的值,然后再計算y的值,最終計算出f(x);
? ? ? Spark不產生中間結果,但是需要手動cache,persist.?內存消耗比較大,最主要是spark的shuffle機制(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到計算節點內存當中.
總結
以上是生活随笔為你收集整理的Spark RDD解密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GPS UTC与北京时间的转换函数
- 下一篇: ASP.NET MVC 3 常用