应用场景
超大数据量抽取性能无法满足需求,需要优化
实施步骤
ETL部署服务器配置
数据抽取性能优化的关键是尽可能多线程并行抽取,多线程就要求有多核cpu,每个线程执行的时候,也需要消耗内存,数据抽取的时候,会有数据落盘,对磁盘容量跟IO性能也有一定要求。
总体而言,越高的服务器配置越能优化出更好的性能,如果服务器配置过低,通过调整其它配置,性能优化空间有限。为了保证有一定优化效果,配置要求:
CPU | 内存 | 硬盘 |
---|---|---|
8核+ | 32G+ | 300G+ |
ETL引擎配置
为了最大利用服务器硬件资源,ETL执行引擎需要做下面几个配置:
分配内存:
如果不设置,默认只分配了5G,为了充分利用服务器内存,需要手工进行设置.
操作步骤如下:
1. 修改 ETL引擎部署目录/conf/engine-env.sh (注意:该文件是ETL引擎启动后自动生成的,如果ETL引擎没有启动过,需要先启动)
主要修改上图两个值,删除开头的#号,同时修改分配内存,分配内存推荐设置为服务器内存70%--75%,最好这两个值设置为一样。
假如服务器内存为32G,修改如下:
2. 重启ETL引擎
3. 检验是否修改成功
进入到bi 系统监控–-实验监控
如果这里显示分配的内存跟改的一样,那就是修改成功
分配CPU:
如果不设置,默认分配了服务器所有cpu核数,这个值的设置跟分配给etl引擎内存有关,推荐的配比是1核cpu配4G内存(这个配比系统更为稳定)。
详细参考下表进行设置。(注意:这说的核数是指cpu逻辑核数)
服务器cpu核数 | 分配给etl引擎内存 | 设置值 | 备注 |
---|---|---|---|
小于24 | 内存紧张情况(内存大小(单位G)小于cpu核数): 1核cpu配1G内存(例如:服务器cpu核数16核,分配etl引擎内存8G,那就设置成local[8], 注意:如果这里设置核数大于内存大小(单位为G),容易出现内存溢出) 内存比较充足情况: 1核cpu配置4G内存(例如:服务器cpu核数16核,分配etl引擎内存64G,那就设置成local[16]) | 注意:任何情况,local 后面的数字 都不能设置比服务器cpu核数大 | |
大于等于24 | 大于等于96G | local[24] | 因为设置更多核数,对性能提升有限, 以免并发过大对数据库造成压力过大, 出现稳定性问题。 |
如需设置,参考下图,红框中local后面的数字,就表示分配cpu核数。默认值local[*] 表示分配了服务器所有cpu核数
磁盘空间:
因为数据量大,要求把ETL引擎部署在容量300G+的目录上。
关系数据源节点配置
提升关系数据源节点执行性能,主要通过两个设置,分区设置跟选择列
分区设置
分区设置为了把表数据相对平均分成多个分区,抽取程序会尽可能一个分区分配一个线程进行并行抽取,这样能够极大的提高大数据量情况下的数据抽取性能。
这里关键在于如何把表数据相对平均分成多个分区,具体按照下面步骤进行:
1. 查询数据分布
查询数据分布是为了通过数据分布图表,直观展现出每个字段数据分布情况,帮助挑选出数据分布最为均匀的字段
分区数量:表示把数据切分成多少个分区,系统会提供默认值,一般不需要修改,系统提供的默认值取决于分配给ETL执行引擎的cpu核数。
采样条数:对表数据进行采样条数,因为全量数据做数据分布计算性能较差,所以只能做数据采样
点击刷新按钮,就展现出数据分布图表,并默认选中数据分布最为均匀的字段。因为是基于采样的数据进行计算,所以展现出来的结果不是绝对准确的,
如果对表的数据比较了解的话,可以换选更加合适的字段作为分区字段,比如这里我们换选LO_ORDERDATE字段作为分区字段:
2. 生成分区条件
如图所示,点击生成分区条件按钮,便根据上面设置的分区数量跟选中的分区字段,生成分区条件,每个分区条件对应到一个数据分区。
3. 计算分区条数
由于生成的分区条件不确定是否可以把表的数据均匀切分,可以点击计算分区条数按钮进行计算每个分区的记录条数
4. 调整分区条件(可选)
如果觉得数据分区并不均匀,可以对分区条件进行修改,每个分区条件都可以修改,不过这里修改要注意,要保证这些分区条件
能覆盖到所有的数据。
至此,完成了分区设置,以上图的例子,已经比较均匀把数据分成8个分区,执行的时候每个分区就会有对应一个线程对数据进行抽取,
总共就有8个线程并行抽取,理论上性能随着并行数量线性提升。
注意:如果表的数据量比较大,上面每个步骤的操作可能会有一定耗时,请耐心等待。
选择列
选择列是为了只选择需要的字段,减少数据传输,从而提升性能。如果需求上要求所有字段都是需要的,那这里无需设置。
关系目标表节点配置
一般不需要做特别设置,根据不同场景选择不同节点。全量数据抽取,使用关系目标表(覆盖) 节点,增量数据追加,使用关系目标表(追加),
增量数据更新,使用关系目标表(插入或更新)。
如果是mysql 协议的数据库,建议在数据源url 上加上rewriteBatchedStatements=true 这个参数,这个参数对应写的性能提升非常显著。
其它高级配置
一般其它的高级配置,保持默认值,就能跑出比较好的性能,如果还想优化到极致,可以尝试调整
关系数据源节点高级配置
关系目标表节点高级配置