從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 什麼樣的表需要拆分 根據表的體積 表的行數 訪問特點來衡...