INFO-离线传输并发读取与上游负载压力

适用场景
数据传输
参数设置
离线传输任务开启并行读取,设置切分键为 ID,设置并发数为 8
离线传输任务默认自定义参数 source.splitSize 为 1000000(1百万)
离线传输任务默认自定义参数 source.splitNum 为 10000
执行逻辑
以下为切分执行过程


SPARK UI 界面 driver-stderr日志

INFO-离线传输并发读取与上游负载压力 - 图1
1、首先查出切分键的最大最小值

SELECT
min(`id`) minVal,
max(`id`) maxVal
FROM
`test`.`netease_test`
WHERE
(1 = 1)

2、并发数
Partion num => 当前并发 (同一时刻可以启动的最大线程数,对应上面的并发数8)

3、基于切分键最大最小值切分
假设结果是 最小值 1,最大值 10000000 (1千万)
那么基于上面的 source.splitSize 为 1000000(1百万),会切分成 1千万/1百万 = 10个task

3.1、如果计算出来的切分task 数过大,超过 source.splitNum 即 10000,那么任务数会被设置为 10000

3.2、如果切分键的最大最小值过小,或者 source.splitSize 过大,导致除算出来的 split number (任务数)过小,小于partition num(并发数),那么并发数会被重置成 split number的大小:
比如 最小值 1,最大值10,source.splitSize 默认 1百万,计算得到 split number(任务数)=1,无论并发数设为多少,都会被 Reset 'partitionNum' to 1

Split Number => 总的任务量(任务区间)当前传输任务的总任务数

Partion num 每完成一个线程后 回拉起一个新的线程继续完成 Split Number 直到完全结束 比如10000/400 (直到任务结束 剩余总任务量小于partition number 完成剩余的线程前 都会有这么多的进程执行)

使用示例
场景一、设置多并发不生效
Partion num 大于 Split Number

建议给切分字段设置索引/建议使用数值型字段切分

需要注意:Split Number与数据量 和 切分键的均衡程度有关

场景二、并发数开的大,上游负载压力过高
这个得看源端的 日志 和数据库的DBA沟通

例: 任务: 100个并发 如果其他任务也是从这个源拉取并且同一时间开的很大的并发, 切分区间也够的话 大概率是会造成压力的

如果要求写入速率可以建议均衡下任务 和上游DBA要个并发压力的评估下

不完全要求写入速率 就建议把并发调小 可以适当给下资源(driver、exec)


作者:华柄印