Spark抽取MySQL分表優化

2021-10-17 03:18:19 字數 1375 閱讀 6801

從mysql抽取hive表*** ,mysql中有128張分表

原抽數邏輯sql為

select

concat(good_sn, 「#」, wh_code) as goodsid,

max(ship_price/exchange_rate) as shipprice,

max(ship_fee/exchange_rate) as shipfee,

price_type as shiptype

pipeline_code

from

goods_price_factor_s_$

where site_code=『gb』

and is_latest = 1

and (price_type = 1 or price_type = 4)

group by good_sn,wh_code,price_type,pipeline_code

這樣group by+max操作就會在mysql端進行

2019-01-06抽數結果值有347691263條

抽數任務執行了3.7h

將sql修改為只根據where條件過濾並抽取所需要的字段

將需要的資料通過jdbc直接拉取過來後再進行邏輯操作

但需要注意的是,合併成大表時不能做group by 操作,否則會產生shuffle切割stage,導致每一張單錶會序列執行,且每張mysql的單錶會生成乙個stage

該錶有128張分表,即會產生128個小的stage,產生大量io,且在合併時會生成乙個25600個task的stage(128個task*預設200並行度)

這個stage如果不做重分割槽處理還會寫出25600個小檔案會對伺服器造成很大壓力

修改:① 抽數不做邏輯處理

② 將抽取過來的資料先註冊成臨時表

③ 處理邏輯,寫入hive

修改後抽數任務從3.7h縮短為7min:

Spark抽取多分表資料效能

使用spark.read.jdbc讀取表後註冊成臨時表,再將表union all起來可不形成寬依賴,將多張分表合併成總表的job放在乙個stage中 從而可以根據任務啟用資源的調整 主要是core數 將從mysql抽數的任務並行處理 下圖為任務執行的的dag圖,可以看到128個分表雖然在 中是迴圈讀...

Mysql使用Merge引擎分表 方式及優缺點

merge 是sql語句的一種。具體來說,merge語句會檢查原資料表記錄和目標表記錄。如果記錄在原資料表和目標表中均存在,則目標表中的記錄將被原資料表中的記錄所更新 執行update操作 如果目標表中不存在的某 些 記錄,在原資料表中存在,則原資料表的這 些 記錄將被插入到目標表中 執行inser...

mysql分表準則 Mysql分表準則

mysql分表準則 在大量使用mysql時,資料量大 高訪問時,為了提高效能需要分表處理,簡介下mysql分表的標準,後續會繼續補充 環境 業務型別 oltp 硬體 cpu 8cpu 2.4ghz mem 48g 磁碟 raid5 6 sas 什麼樣的表需要拆分 根據表的體積 表的行數 訪問特點來衡...