讀取hdfs文件之后repartition 避免數據傾斜


場景一:

api:

 textFile("hfds://....").map((key,value)).reduceByKey(...).map(實際的業務計算邏輯)

場景:hdfs的某個文件有183個block,他們的大小分布非常不均勻時,比如有的是200M,有的是1M,有的是10K。此時spark計算非常非常慢,通過web ui監視發現,有的task處理了好幾百M的數據,有的

task之處理了幾k,導致嚴重的數據傾斜。

其中stage0階段有183個task,這個階段幾乎沒有什么計算任務,主要就是從hdfs上讀取數據,stage0一共讀取了5.4G的壓縮后的lzo數據,耗時在9.3Min左右。

讓人痛苦的是,在reduceByKey時,reduce數量也是183個,從這里噩夢就開始了,耗時在2個多小時還沒有計算完畢。

 

原因:默認情況下,spark 的初始rdd的partition數量和hdfs的block 數量大小一致,在上面這個場景下,初始rdd的partition個數就是183,並且后面的reduceByKey等都是183,可以通過在textFile之后

repartition一下,可以將次數設置的小一點,這樣那些小的block就會聚合到一個parttion了。

2.場景2,groupByKey要比reduceByKey快


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM