第14課:Spark RDD解密
1 RDD:基於工作集的應用抽象
2 RDD內幕解密
3 RDD 思考
MapReduce是基於數據集的
位置感知,容錯 負載均衡
基於數據集的處理:從物理存儲上加載數據,然後操作數據 然後寫入物理存儲設備,具體例子:Hadoop MapReduce
基於數據集的操作不適應的場景:
1,不適合於大量的迭代
2,交互式查詢
重點是:基於數據流的方式 不能夠複用曾經的結果或者中間計算結果
RDD是基於工作集的
RDD:ResillientDistributed Dataset
1、彈性之一:自動的進行內存和磁盤數據存儲的切換;
2、彈性之二:基於Lineage的高效容錯(第n個節點出錯,會從第n-1個節點恢復,血統容錯);
3、彈性之三:Task如果失敗會自動進行特定次數的重試(默認4次);
4、彈性之四:Stage如果失敗會自動進行特定次數的重試(可以值運行計算失敗的階段);只計算失敗的數據分片
5,checkpoint和persist
6,數據調度彈性:DAG TASK和資源 管理無關
7,數據分片的高度彈性
def repartition(numPartitions: Int)(implicit ord:Ordering[T] = null): RDD[T] = withScope {
coalesce(numPartitions, shuffle = true)
}
def coalesce(numPartitions: Int, shuffle: Boolean =false)(implicit ord: Ordering[T] = null)
一個Stage,有1000個RDD,默認情況下只產生一個結果
RDD:是分佈式函數式編程的抽象
基於函數式編程一般都會使用高階函數
RDD 核心之一lazy級別
Flatmap:
new MapPartitionsRDD[U, T](this, (context, pid, iter)=> iter.flatMap(cleanF))
最低使用1.3版本,建議使用1.6版本
常規的容錯方式,有哪些:
1:數據檢查點,2:記錄數據的更新
數據中心的網絡,檢查所有節點,需要有一個拷貝,是通過網絡,網絡帶寬是分佈式瓶頸,對存儲資源很大消耗
問題之一是複雜度
問題之二是耗性能
RDD通過記錄數據跟新的方式爲何很高效
1,RDD是不可變的+Lazy
2,RDD是粗粒度
RDD的寫操作是粗粒度的!
但是 RDD讀操作既可以是粗粒度的也可以是細粒度的!
RDD的寫操作是粗粒度除了效率以外,是否還有簡化複雜度
數據本地性的問題getPreferredLocations
南北數據中心不同步數據的 Tachyon去處理
Rdd所有的操作都返回iterator
this.type 從java的角度,是不能調用子類的方法
spark是可以調用
Spark要統一數據計算領域 除了實時事務性處理