一般情况下用户不需要自行设置高级参数,但如果任务出现读取较慢或异常时可尝试通过高级参数进行优化。本文档主要覆盖以下常见的优化场景。
优化场景1:大表分块读取
当源端某个表的数据量较大,一次查询返回时间较长时,需要分块处理。根据表的条数和每条数据大小进行配置。通过以下分块参数设置可提升全量阶段性能。
Exactly-once 语义多分块:(单个表的数据量达到百万级建议调整)
scan.incremental.snapshot.chunk.size=80960 //每个分块的大小,每个分块的数据会缓存在TM的内存,建议根据每条数据的大小和TM的配置灵活调整。 默认8096,数据量较大时推荐配置:TM规格3CU,该参数设置为80960
At-least-once 语义多分块:(单个表的数据量达到千万级建议调整)
at-least-once-multi-split=true // 开启多分片时,该参数必须设置为: truescan.incremental.snapshot.chunk.size=809600 // 每个分块的大小,At-least-once语义下,数据不用缓存。默认8096,数据量较大时推荐配置:TM规格2CU,该参数设置为809600
优化场景2:设置 ORACLE 长事务超时时间
当 ORACLE 源端有长事务导致增量位点不推进时,可通过以下参数配置事务超时时间:
debezium.log.mining.transaction.retention.hours=5 //当oracle有长事务导致每次快照位点相同,任务暂停重启时会由于找不到位点报错。这种情况下需要设置事务超过一定时间则位点推进。
优化场景3:设置目标端写入速率
全量阶段和增量阶段都可以通过调整每次写入目标端的大小和间隔参数控制写入速率。如下参数对目标端非 ICEBERG/DLC/HIVE 均生效:
sink.batch.size=10240 //当目标端达到该数据条数时,将缓存数据写入DB。默认1024,数据量较大时可以设置为10240。sink.batch.bytes=10485760 //当目标端数据量达到该大小时,将缓存数据实际写入DB。默认10485760=10M,数据量较大时可调整为100M及以上。sink.batch.interval=1s //数据量较小时,和上一次写入时间达到该间隔,则将缓存数据写入DB。默认值为1秒,支持时间单位 ms、s、min、h 和 d。设置为0,表示关闭定期写入。
当目标端是 ICEBERG/DLC时,快照间隔内数据量较大时设置如下参数可以使用磁盘缓存数据:
use-spillable-map=true //TM有内存不足或者超时等报错时,可以设置该参数。
优化场景4:源端 akka 超过限制导致异常
当源端有某条数据较大导致 akka 超过限制异常时,可以添加运行高级参数:
akka.framesize=1048576000b //当任务日志中出现“exceeds the maximum akka framesize”异常时,需要设置该参数。可根据实际报错大小的2倍进行设置。1048576000b表示1G,该值越大,会导致TM内存消耗较高。