1. 程式人生 > >Spark資料傾斜及解決方案

Spark資料傾斜及解決方案

一.場景

  1.絕大多數task執行得都非常快,但個別task執行極慢。比如,總共有100個task,97個task都在1s之內執行完了,但是剩餘的task卻要一兩分鐘。這種情況很常見。

  2.原本能夠正常執行的Spark作業,某天突然報出OOM(記憶體溢位),觀察異常棧,是我們寫的業務程式碼造成的。這種情況比較少見。

二.原理

  在進行shuffle的時候,必須將各個節點上相同的key拉取到某個節點上的一個task來進行處理,比如按照key進行group或join等操作。此時如果某個key對應的資料量特別大的話,就會發生資料傾斜。比如大部分key對應1萬條資料,但是個別key卻對應了100萬條資料,那麼大部分task可能就只會分配到1萬條資料,然後1s就執行完了;但是個別task可能分配到了100萬資料,要執行一兩分鐘。因此,整個Spark作業的執行進度是由執行時間最長的那個task決定的。

  因此出現數據傾斜的時候,Spark作業看起來會執行得非常緩慢,甚至可能因為某個task處理的資料量過大導致記憶體溢位。

比如下面這個例子:

  

三.程式碼實現

 1 package big.data.analyse.dataskew
 2 
 3 import org.apache.spark.sql.SparkSession
 4 
 5 /**
 6   * Created by zhen on 2019/1/12.
 7   */
 8 object DataSkew {
 9   def main(args: Array[String]) {
10     val spark = SparkSession.builder().appName("資料傾斜").master("local[2]").getOrCreate()
11 val sqlContext = spark.sqlContext 12 // 資料路徑 13 val dataPath = "./src/big/data/analyse/dataskew/data.csv" 14 // spark讀取csv資料 15 val data = sqlContext.read.format("com.databricks.spark.csv") 16 .option("header", "true") // 在csv第一行有屬性true,沒有就是false 17 .option("inferSchema", true
) // 這是自動推斷屬性列的資料型別 18 .load(dataPath) 19 // 實現wordCount 20 // 轉化data,對data進行擴容 21 val data_left = data.rdd.flatMap( row =>{ 22 for(i <-0 until 10) yield (i +"_"+ row.getAs("XMMC"), row) 23 }) 24 // 生成隨機數拼接key,避免資料傾斜 25 val data_right = data.rdd 26 .map(row => ((Math.random()* 10).toInt +"_"+ row.getAs("XMMC"), row)) 27 // 關聯資料 28 val mid = data_left.join(data_right) 29 //去掉拼接隨機數 30 val result = mid.map(row => row._2) 31 // 列印結果 32 result.foreach(println) 33 } 34 }

四.使用資料部分展示

"ROWNUM","XMMC","RWMC","FZR","BMMC","RWCJSJ","RWQSSJ","SJCLSJ"
"1","220kV變電站消防火災報警系統大修等兩個專案","招標方案/招標方案編制","***","繼保自動化一班","2017/1/3 9:15:34","2017/1/3 9:15:34","2017/1/17 8:20:45"
"2","220kV變電站消防火災報警系統大修等兩個專案","招標方案/承辦單位主管稽核","***","生產裝置管理部","2017/1/17 8:20:46","2017/1/17 14:37:01","2017/1/17 14:37:18"
"3","220kV變電站消防火災報警系統大修等兩個專案","招標方案/承辦單位主要負責人稽核","***","領導班子","2017/1/17 14:37:18","2017/1/17 15:03:17","2017/1/17 15:03:26"
"4","220kV變電站消防火災報警系統大修等兩個專案","招標方案/承辦人流轉","***","繼保自動化一班","2017/1/17 15:03:26","2017/1/17 17:19:11","2017/1/19 8:30:09"
"5","220kV變電站消防火災報警系統大修等兩個專案","招標方案/專案管理部門專責稽核","***","資產管理部(與生產裝置管理部合署)","2017/1/19 8:30:09","2017/1/20 15:26:43","2017/1/20 15:28:05"
"6","220kV變電站消防火災報警系統大修等兩個專案","招標方案/專案管理部門科長稽核","***","生產管理科","2017/1/20 15:28:05","2017/1/25 10:23:13","2017/1/25 10:23:33"
"7","220kV變電站消防火災報警系統大修等兩個專案","招標方案/招標專業小組副組長稽核","***","資產管理部(與生產裝置管理部合署)","2017/1/25 10:23:33","2017/2/8 12:03:01","2017/2/8 12:03:24"
"8","220kV變電站消防火災報警系統大修等兩個專案","招標方案/招標專業小組組長稽核","***","資產管理部(與生產裝置管理部合署)","2017/2/8 12:03:24","2017/2/8 12:03:24","2017/2/8 12:03:37"
"9","220kV變電站消防火災報警系統大修等兩個專案","招標方案/專案分管局領導稽核","***","局領導","2017/2/8 12:03:37","2017/2/17 9:24:25","2017/2/17 9:24:30"
"10","220kV變電站消防火災報警系統大修等兩個專案","招標方案/招標管理小組組長稽核","***","局領導","2017/2/17 9:24:30","2017/2/17 13:06:06","2017/2/17 13:06:21"

五.部分結果展示

([22528,2017年普法專項——法治文化宣傳片,結果公告/結果公告,***,null,2017/11/16 16:25:59,2017/11/17 13:05:59,2017/11/21 16:21:38],[22528,2017年普法專項——法治文化宣傳片,結果公告/結果公告,***,null,2017/11/16 16:25:59,2017/11/17 13:05:59,2017/11/21 16:21:38])
([54441,2018年輸變電裝置狀態評價系統檢測,採購方案/承辦人流轉,***,安全生產部,2017/12/6 19:55:15,2017/12/7 8:00:36,2017/12/7 8:00:44],[54450,2018年輸變電裝置狀態評價系統檢測,專案發售/專案發售,***,null,2017/12/11 12:03:25,2017/12/11 12:03:26,2017/12/21 16:32:03])
([22529,2017年普法專項——法治文化宣傳片,結果通知/結果通知,***,null,2017/11/21 16:21:38,2017/11/21 16:21:39,2017/11/24 16:21:28],[22506,2017年普法專項——法治文化宣傳片,採購方案/承辦部門科長稽核,***,法務一科,2017/8/18 15:56:08,2017/8/18 15:57:08,2017/8/18 15:57:31])
([54441,2018年輸變電裝置狀態評價系統檢測,採購方案/承辦人流轉,***,安全生產部,2017/12/6 19:55:15,2017/12/7 8:00:36,2017/12/7 8:00:44],[54454,2018年輸變電裝置狀態評價系統檢測,結果公示/結果公示,***,null,2017/12/22 10:52:16,2017/12/22 10:52:17,2017/12/22 10:52:21])
([22529,2017年普法專項——法治文化宣傳片,結果通知/結果通知,***,null,2017/11/21 16:21:38,2017/11/21 16:21:39,2017/11/24 16:21:28],[22512,2017年普法專項——法治文化宣傳片,採購方案/招標專業小組組長稽核,***,企業管理部,2017/9/1 10:14:08,2017/9/4 15:30:00,2017/9/4 15:30:16])
([54441,2018年輸變電裝置狀態評價系統檢測,採購方案/承辦人流轉,***,安全生產部,2017/12/6 19:55:15,2017/12/7 8:00:36,2017/12/7 8:00:44],[54455,2018年輸變電裝置狀態評價系統檢測,專案定標/專案定標,***,安全生產部,2017/12/22 10:52:21,2017/12/22 11:17:11,2018/1/2 9:48:07])
([22529,2017年普法專項——法治文化宣傳片,結果通知/結果通知,***,null,2017/11/21 16:21:38,2017/11/21 16:21:39,2017/11/24 16:21:28],[22515,2017年普法專項——法治文化宣傳片,採購檔案/招標檔案編制,***,null,2017/9/4 16:27:51,2017/10/19 11:03:53,2017/10/23 8:52:32])
([54442,2018年輸變電裝置狀態評價系統檢測,採購檔案/採購專案負責人指定,****工程監理有限公司,null,2017/12/7 8:00:44,2017/12/7 9:57:47,2017/12/7 9:58:19],[54437,2018年輸變電裝置狀態評價系統檢測,採購方案/專案管理部門專責稽核,***,資產管理部(與生產裝置管理部合署),2017/11/23 16:56:58,2017/11/29 13:11:09,2017/11/29 13:12:06])
([22529,2017年普法專項——法治文化宣傳片,結果通知/結果通知,***,null,2017/11/21 16:21:38,2017/11/21 16:21:39,2017/11/24 16:21:28],[22521,2017年普法專項——法治文化宣傳片,採購釋出/公佈釋出,***,null,2017/10/27 9:58:58,2017/10/27 11:46:44,2017/10/27 11:46:55])
([54442,2018年輸變電裝置狀態評價系統檢測,採購檔案/採購專案負責人指定,****工程監理有限公司,null,2017/12/7 8:00:44,2017/12/7 9:57:47,2017/12/7 9:58:19],[54440,2018年輸變電裝置狀態評價系統檢測,採購方案/招標專業小組組長稽核,***,資產管理部(與生產裝置管理部合署),2017/12/5 17:31:46,2017/12/6 19:55:09,2017/12/6 19:55:15])