大數據開發:你真的了解Hadoop數據傾斜嗎?

尚硅谷教育 發佈 2023-06-08T09:26:28.472929+00:00

數據傾斜顧名思義就是數據分派不均勻,是對分布式系統或者集群產生的海量數據分配問題。對應大數據行業,處理的數據量可能都是BP或者TP級的,需要多台機器進行集群處理,如果存在分配不合理的情況,就會極大的影響集群任務處理的效率。

數據傾斜顧名思義就是數據分派不均勻,是對分布式系統或者集群產生的海量數據分配問題。對應大數據行業,處理的數據量可能都是BP或者TP級的,需要多台機器進行集群處理,如果存在分配不合理的情況,就會極大的影響集群任務處理的效率。故數據傾斜,就是由於數據處理任務在任務分配時,對擁有相同處理資源的機器,數據量分配不均造成的集群整體處理效率低下的問題。

Hadoop的數據分配主要有數據分片,數據分區和數據下載,其中分片是按照文件數量和文件大小來分片的,所以不會傾斜,而數據分區Hadoop默認是採用key.HashCode&Integer.MaxValue % numReduceTask來進行分區號分配,後面的分區下載數據也是根據分區號來的,所以如果key的hashcode值不均勻,其分區號分配就會傾斜,數據在進行按分區號歸併時就會產生傾斜。

那麼接下來我們就詳細介紹一下Hadoop的數據傾斜原因以及解決辦法。

一、Hadoop數據傾斜表現

Reduce

有一個或者幾個Reduce卡在99.9%,一直無法結束。某些Reduce讀取的數據量過大,遠遠大於其他正常的Reduce。

OOM

Container是YARN中資源的抽象,它封裝了某個節點上一定量的資源(CPU和內存兩類資源),如果發生數據傾斜,他會報錯OOM(out of memory)。

Kill任務

如果發生數據傾斜,可能會伴隨著很多任務被Kill掉。

二、Hadoop數據傾斜原因

在做數據運算的時候,經過Shuffle的時候,所有相同的Key會被拉到一個或者幾個Reduce上,容易發生單點問題,導致數據傾斜。

Key分布不均

比如我們處理的數據中,某一個Key的數據量極大,就會導致數據傾斜。

業務數據本身的特性

比如說訂單,假如我們在上海或者北京做了一些活動,導致兩個地區的下單量激增,其餘的不變,這樣我們在處理這些數據的時候也會導致數據傾斜。

操作相關

如果數據操作過程中處理不當,產生大量的NULL值,或者不同數據類型之間進行關聯,也會產生數據傾斜。

三、Hadoop數據傾斜解決辦法

Key導致

hadoop默認的分區方案按Key的HashCode來進行分區,所以數據傾斜主要就是Key名的鍋。

採用局部聚合加全局聚合。

第一次在Map階段對那些導致了數據傾斜的Key 加上1到n的隨機前綴,這樣本來相同的Key 也會被分到多個Reducer中進行局部聚合,數量就會大大降低。

第二次MapReduce,去掉Key的隨機前綴,進行全局聚合。

空值導致

① 在操作數據的時候,過濾掉空值數據。

② 給空值數據加上隨機數,避免Key為空。

提前預聚合

提前在Map端進行Combine,減少傳輸的數據量。

在Mapper加上Combiner相當於提前進行Reduce,即把一個Mapper中的相同Key進行了聚合,減少Shuffle過程中傳輸的數據量,以及Reducer端的計算量。

增加Reduce並行度

通過JobConf.setNumReduceTasks(int num),增加Reduce的個數,讓數據可以更細化,發往更多不同的Reduce,減少數據傾斜的可能性。

自定義分區

Hadoop默認按照Key的Hash值取分區,我們在操作數據的過程中可以手動控制分區方式,人為定義一種分區方式,只需要繼承Partitioner,實現getPartition()方法即可。通過Jobconf.setPartitionerClass(class)設置。

四、總結

使Map的輸出數據更均勻的分布到Reduce中去,是我們的最終目標。由於Hash算法的局限性,按Key Hash會或多或少的造成數據傾斜。大量經驗表明數據傾斜的原因是人為的建表疏忽或業務邏輯可以規避的,所以各位程序猿們多多注意!

關鍵字: