在進行大數據的面試過程中,經常會被問到一些比較相近的屬性區別是什么,提前了解一下幫助你更好的應對面試提問。
1.repartition和coalesce的區別
1.1. repartition只是coalesce接口中shuffle為true的實現
1.2. 不經過 shuffle,也就是coaleasce shuffle為false,是無法增加RDD的分區數的,比如你源RDD 100個分區,想要變成200個分區,只能使用repartition,也就是coaleasce shuffle為true。
1.3. 如果上游為Partition個數為N,下游想要變成M個Partition
N > M , 比如N=100 M=60, 可以使用coaleasce shuffle為false。但是如果N遠大于M,比如N=100, M=1, 分區有一個激烈的變化時,此時如果用coalesce就只有一個task處理數據,資源利用不夠, Executor空跑,這時repartition是一個比較好的選擇,雖然有shuffle但是和只有1個Task處理任務比起來效率還是較高。
N < M , coaleasce shuffle為false 不能增加分區,只能用repartition
2.groupByKey 和 reduceBykey 區別
reduceByKey 可以接收一個 func 函數作為參數,這個函數會作用到每個分區的數據上,即分區內部的數據先進行一輪計算,然后才進行 shuffle 將數據寫入下游分區,再將這個函數作用到下游的分區上,這樣做的目的是減少 shuffle 的數據量,減輕負擔。
groupByKey 不接收函數,Shuffle 過程所有的數據都會參加,從上游拉去全量數據根據 Key 進行分組寫入下游分區,這樣會消耗比較多的資源,數據傳輸會導致任務處理的延遲。
如果我們想要進行分組后進行聚合操作,使用 reduceByKey 會更高效, 因為reduceByKey 會在map階段合并分區內相同的key,而gourpByKey 則不會合并。
3.Cache,Presist,CheckPoint的區別
Persist 的 MEMORY_ONLY 級別的存儲等于 Cache,Persist 其他的配置只是存儲的方式不同,作用和原理是和 Cache 類似的,他們二者的區別如下:
*Cache、Persist 是轉化類算子,和其他算子一樣,觸發的時機是在對應分區的上游算子計算完成之后。
*Cache、Persist 會把 RDD 緩存到指定位置,這個操作不會改變 Lineage 血緣的依賴關系,且 Job 執行完成之后,緩存的數據會被清除。
*Cache、Persist 一般應用于需要訪問重復數據的應用(如迭代型算法和交互式應用)緩存可以運行得更快。
*CheckPoint 執行完畢后,會產生 CheckPointRDD,此時 lineage 血緣關系已經改變了,容錯會從CheckPointRDD 開始。
*CheckPoint 將 RDD 持久化到 HDFS ,會被永久保存,可以給其他的 Driver 使用
*雖然Presist 也可以持久化數據到磁盤,但是它有BlockManager管理,一旦Driver結束,BlockManager也會 stop,被 cache 到磁盤上的 RDD 也會被清空,而 checkpoint 將 RDD 持久化到HDFS或本地文件,如果不被手動 remove 掉,是一直存在的。
最后歡迎大家添加我們的大數據分享交流qq群:857910996 加群找管理領取免費的大數據學習資料,還可以交流學習心得,歡迎大家進群~~~