map-reduce階段中的資料傾斜問題
阿新 • • 發佈:2019-01-25
MapReduce資料傾斜:
mapreduce處理過程有一個特點,相同的key,只能是發給同一個reduce進行處理。
原因:hadoop原始碼中有一行程式碼,(key.hashcode())%numReduce,先把key進行hash然後除以reduce的個數取餘,相同的key的hashcode肯定一樣,而且reduce數也確認,那肯定是相同的key都發給了同一個reduce了
舉例:假設普通的key的value數是100個,而就有些個別的key的value數是10萬個,這時普通的key對應的reduce處理很快,而個別的key對應的reduce顯然會處理的很慢(它的處理10萬),這樣就會造成不平衡。
而對於提交的作業(job)什麼時候才算執行結束呢?是要等到最後一個reduce執行完,才算結束。所以執行量小的reduce先執行完了,也得等著,等著量最大的、最慢的執行完,才能夠算結束。
再說,造成資料傾斜的根本原因是什麼:2點
1.key分佈不均衡,有的則過於集中。傾斜在reduce階段
2.datanode上資料分佈不均衡。傾斜在map階段。解釋:datanode上的資料量大當然執行的時間要長。資料量小的則執行時間短。但是,這個地方有個特點:map執行完後,不用等其他map執行完,就開始執行下一個階段了,但reduce階段就不一樣了,整個作業的執行完成,必須要等到最後一個reduce跑完(合情合理)。