如何解決spark中的數據傾斜問題

發現數據傾斜的時候,不要急於提高executor的資源,修改參數或是修改程序,首先要檢查數據本身,是否存在異常數據。

  • 1、數據問題造成的數據傾斜

    • 找出異常的key

      • 如果任務長時間卡在最後最後1個(幾個)任務,首先要對key進行抽樣分析,判斷是哪些key造成的。選取key,對數據進行抽樣,統計出現的次數,根據出現次數大小排序取出前幾個。

      • 比如: df.select("key").sample(false,0.1).(k=>(k,1)).reduceBykey(+).map(k=>(k.2,k.1)).sortByKey(false).take(10)

      • 如果發現多數數據分佈都較爲平均,而個別數據比其他數據大上若干個數量級,則說明發生了數據傾斜。

    • 經過分析,傾斜的數據主要有以下三種情況:

      • 1、null(空值)或是一些無意義的信息()之類的,大多是這個原因引起。

      • 2、無效數據,大量重複的測試數據或是對結果影響不大的有效數據。

      • 3、有效數據,業務導致的正常數據分佈。

    • 解決辦法

      • 第1,2種情況,直接對數據進行過濾即可(因爲該數據對當前業務不會產生影響)。

      • 第3種情況則需要進行一些特殊操作,常見的有以下幾種做法

        • (1) 隔離執行,將異常的key過濾出來單獨處理,最後與正常數據的處理結果進行union操作。

        • (2) 對key先添加隨機值,進行操作後,去掉隨機值,再進行一次操作。

        • (3) 使用reduceByKey 代替 groupByKey(reduceByKey用於對每個key對應的多個value進行merge操作,最重要的是它能夠在本地先進行merge操作,並且merge操作可以通過函數自定義.)

        • (4) 使用map join。

    • 案例

      • 如果使用reduceByKey因爲數據傾斜造成運行失敗的問題。具體操作流程如下:

        • (1) 將原始的 key 轉化爲 key + 隨機值(例如Random.nextInt)

        • (2) 對數據進行 reduceByKey(func)

        • (3) 將 key + 隨機值 轉成 key

        • (4) 再對數據進行 reduceByKey(func)

    • 案例操作流程分析:

      • 假設說有傾斜的Key,我們給所有的Key加上一個隨機數,然後進行reduceByKey操作;此時同一個Key會有不同的隨機數前綴,在進行reduceByKey操作的時候原來的一個非常大的傾斜的Key就分而治之變成若干個更小的Key,不過此時結果和原來不一樣,怎麼破?進行map操作,目的是把隨機數前綴去掉,然後再次進行reduceByKey操作。(當然,如果你很無聊,可以再次做隨機數前綴),這樣我們就可以把原本傾斜的Key通過分而治之方案分散開來,最後又進行了全局聚合

      • 注意1: 如果此時依舊存在問題,建議篩選出傾斜的數據單獨處理。最後將這份數據與正常的數據進行union即可。

      • 注意2: 單獨處理異常數據時,可以配合使用Map Join解決。

  • 2、spark使用不當造成的數據傾斜

    • 提高shuffle並行度

      • dataFrame和sparkSql可以設置spark.sql.shuffle.partitions參數控制shuffle的併發度,默認爲200。

      • rdd操作可以設置spark.default.parallelism控制併發度,默認參數由不同的Cluster Manager控制。

      • 侷限性: 只是讓每個task執行更少的不同的key。無法解決個別key特別大的情況造成的傾斜,如果某些key的大小非常大,即使一個task單獨執行它,也會受到數據傾斜的困擾。

      • 使用map join 代替reduce join

      • 在小表不是特別大(取決於你的executor大小)的情況下使用,可以使程序避免shuffle的過程,自然也就沒有數據傾斜的困擾了.(詳細見http://blog.csdn.net/lsshlsw/article/details/50834858http://blog.csdn.net/lsshlsw/article/details/48694893

      • 侷限性: 因爲是先將小數據發送到每個executor上,所以數據量不能太大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章