Spark RDD解密
?
1.??基于數(shù)據(jù)集的處理:?從物理存儲上加載數(shù)據(jù),然后操作數(shù)據(jù),然后寫入數(shù)據(jù)到物理設備;?
? ? 基于數(shù)據(jù)集的操作不適應的場景:
2. RDD彈性數(shù)據(jù)集
???特點:?
? ? ? ?A)自動的進行內(nèi)存和磁盤數(shù)據(jù)的存儲切換:
???????B)?基于lineage的高效容錯;
???????C)?Task如果失敗會自動進行重試
? ? ? ?D)?Stage如果失敗會自動進行重試,而且只會計算失敗的分片;
???????E)?Checkpoint和persist.
3.??數(shù)據(jù)分片的高度彈性.?Partition合并可以提升效率(數(shù)據(jù)比較小的適合),??數(shù)據(jù)大的時候可以提高partition設置,避免OOM.?如果小的分片變大的時候,一般需要shuffle.?可以使用coalesce.
??????def?coalesce(numPartitions:?Int,?shuffle:?Boolean?=?false)
(implicit?ord:?Ordering[T]?=?null):?RDD[T]
? ? ? 返回一個新的RDD,且該RDD的分區(qū)個數(shù)等于numPartitions個數(shù)。如果shuffle設置為true,則會進行shuffle.
? ? ? def?repartition(numPartitions:?Int)(implicit?ord:?Ordering[T]?=?null):?RDD[T]
? ? ?該函數(shù)其實就是coalesce函數(shù)第二個參數(shù)為true的實現(xiàn)
? ? ? repartition(numPartitions:Int):RDD[T]和coalesce(numPartitions:Int,shuffle:Boolean=false):RDD[T]?
? ? ? 他們兩個都是RDD的分區(qū)進行重新劃分,repartition只是coalesce接口中shuffle為true的簡易實現(xiàn),(假設RDD有N個分區(qū),需要重新劃分成M個分區(qū))
1)、N<M。一般情況下N個分區(qū)有數(shù)據(jù)分布不均勻的狀況,利用HashPartitioner函數(shù)將數(shù)據(jù)重新分區(qū)為M個,這時需要將shuffle設置為true。
2)如果N>M并且N和M相差不多,(假如N是1000,M是100)那么就可以將N個分區(qū)中的若干個分區(qū)合并成一個新的分區(qū),最終合并為M個分區(qū),這時可以將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時,如果傳入的參數(shù)大于現(xiàn)有的分區(qū)數(shù)目,RDD的分區(qū)數(shù)不變,也就是說不經(jīng)過shuffle,是無法將RDD的分區(qū)數(shù)變多的。
4. RDD的延遲加載.?Lazy.?構(gòu)造的時候的第一個參數(shù)就是父RDD;
? ? ? 就相當于?f(x)?=?x?+?1;?x?=y+1;?y=z+1;?這就是依賴,最終的計算是先計算z的值,然后再計算y的值,最終計算出f(x);
? ? ? Spark不產(chǎn)生中間結(jié)果,但是需要手動cache,persist.?內(nèi)存消耗比較大,最主要是spark的shuffle機制(spark1.x以前有數(shù)據(jù)規(guī)模的限制.現(xiàn)在沒有,原因主要是shuffle的原因,但是最新版本以來shuffle支持更多的方式.)
5. ?容錯的兩種方式:?數(shù)據(jù)檢查點和記錄數(shù)據(jù)的更新;
? ? ? ? ?Spark采取的是記錄數(shù)據(jù)更新方式容錯為什么更高效:
? ? ? ? A)?RDD是不可變?+?lazy:數(shù)據(jù)的恢復需要checkpoint.?比如從第900步恢復的前提是要在900步進行checkpoint.
? ? ? ? B)?RDD是粗粒度.??寫操作是粗粒度.但是rdd讀操作既可以是粗粒度也可以是細粒度的.?高效率的.?簡化復雜度.?但有部分場景不適合spark?rdd.?爬蟲就不合適.
?
6. 關于數(shù)據(jù)本地性問題,?如果讀取的是比如mysql,?hbase,那么需要這些集群和spark集群在一個集群里;?這樣都是內(nèi)網(wǎng)進行讀取;?針對不同機房數(shù)據(jù)不同步問題可以采用Tachyon?內(nèi)存同步.
7. 實時事物性處理不適用spark.
8.??如果是scala集合的話,那么針對數(shù)據(jù)本地性,是數(shù)據(jù)集合會被copy到計算節(jié)點內(nèi)存當中.
總結(jié)
以上是生活随笔為你收集整理的Spark RDD解密的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GPS UTC与北京时间的转换函数
- 下一篇: node.js学习笔记(21) expr