从MySQL抽取Hive表XXX ,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_${order}
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个小文件会对服务器造成很大压力
Spark抽取MySQL分表优化
最新推荐文章于 2023-11-16 19:14:22 发布
针对从MySQL的128张分表中抽取数据到Hive的场景,原SQL在MySQL端进行GROUP BY+MAX操作导致执行时间长。优化方案包括:1)仅过滤所需字段;2)数据拉取后注册为临时表;3)逻辑处理后写入Hive。优化后,执行时间从3.7小时缩短至7分钟,避免了大量的IO和小文件问题。
摘要由CSDN通过智能技术生成