1. 基於數據集的處理: 從物理存儲上加載數據,而後操做數據,而後寫入數據到物理設備; mysql
基於數據集的操做不適應的場景:sql
2. RDD彈性數據集函數
特色: 性能
A)自動的進行內存和磁盤數據的存儲切換:spa
B) 基於lineage的高效容錯;scala
C) Task若是失敗會自動進行重試接口
D) Stage若是失敗會自動進行重試,並且只會計算失敗的分片;內存
E) Checkpoint和persist.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: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到計算節點內存當中.