点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!
前 言
众所周知,当一个程序需要传输数据的时候,它肯定会想尽办法占用掉设备的资源,但是,随着对DataX深入使用可以发现,DataX并不会全力吃掉资源,所以究竟DataX是如何做到限速的?传输缓慢到底是限速原因还是其他原因?本文来一起探讨下。
限 速




Channel类里实现限速:


statPush整个流程的描述:
判断byteSpeed(bps)和recordSpeed(tps)是否都大于0?如果不是,则退出; 根据当前的byteSpeed和设定的byteSpeed对比,求出睡眠时间(公式:currentByteSpeed * interval this.byteSpeed- interval;) 根据当前的recordSpeed和设定的recordSpeed对比,求出睡眠时间(公式:currentRecordSpeed * interval / this.recordSpeed - interval;) 取休眠时间最大值; Thread.sleep(sleepTime)来休眠; 实现限速。

调 优
首先我们知道,传输受两个因素影响:
网络本身的带宽等硬件因素造成的影响; DataX本身的参数。
3.1 网络本身的带宽等硬件因素造成的影响
此部分主要需要了解网络本身的情况,即从源端到目的端的带宽是多少(实际带宽计算公式),平时使用量和繁忙程度的情况,从而分析是否是本部分造成的速度缓慢。以下提供几个思路:
可使用从源端到目的端scp,python http,nethogs等观察实际网络及网卡速度; 结合监控观察任务运行时间段时,网络整体的繁忙情况,来判断是否应将任务避开网络高峰运行; 观察任务机的负载情况,尤其是网络和磁盘IO,观察其是否成为瓶颈,影响了速度。
3.2 DataX本身的参数
1)全局
Json:
{
"core":{
"transport":{
"channel":{
"speed":{
"channel": 2, 此处为数据导入的并发度,建议根据服务器硬件进行调优
"record":-1,此处解除对读取行数的限制
"byte":-1,此处解除对字节的限制
"batchSize":204每次读取batch的大小
}
}
}
},
"job":{
...
}
}
2)局部
提升job内Channel并发有三种配置方式:
配置全局Byte限速以及单Channel Byte限速,Channel个数 = 全局Byte限速 / 单Channel Byte限速。 配置全局Record限速以及单Channel Record限速,Channel个数 = 全局Record限速 / 单Channel Record限速。 直接配置Channel个数。
配置含义:
job.setting.speed.channel : channel并发数; job.setting.speed.record : 全局配置channel的record限速; job.setting.speed.byte:全局配置channel的byte限速。

core.transport.channel.speed.record:单channel的record限速; core.transport.channel.speed.byte:单channel的byte限速。

Json:
"setting": {
"speed": {
"channel": 2,
"record":-1,
"byte":-1,
"batchSize":2048
}
}
}
}
DEFAULT_JVM = "-Xms1g -Xmx1g -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=%s/log" % (DATAX_HOME)
注意事项:
当提升DataX Job内Channel并发数时,调整JVM堆参数,原因如下:
当一个Job内Channel数变多后,内存的占用会显著增加,因为DataX作为数据交换通道,在内存中会缓存较多的数据。 例如Channel中会有一个Buffer,作为临时的数据交换的缓冲区,而在部分Reader和Writer的中,也会存在一些Buffer,为了防止jvm报内存溢出等错误,调大jvm的堆参数。 通常我们建议将内存设置为4G或者8G,这个也可以根据实际情况来调整。 调整JVM xms xmx参数的两种方式:一种是直接更改datax.py;另一种是在启动的时候,加上对应的参数,如下:python datax/bin/datax.py --jvm="-Xms8G -Xmx8G" XXX.json。
Channel个数并不是越多越好,原因如下:
Channel个数的增加,带来的是更多的CPU消耗以及内存消耗。 如果Channel并发配置过高导致JVM内存不够用,会出现的情况是发生频繁的Full GC,导出速度会骤降,适得其反。
备注:
结语:

本文作者:孙振兴(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。