更新时间:2024-12-18 GMT+08:00

性能过慢处理方案

实时处理集成作业各链路如果速度过慢(查看作业监控指标速率不符合实时处理集成作业提供的性能规格),需要考虑以下几点:

  • 目的端写入过慢。
  • 源端抽取过慢。
  • 其他问题(请联系技术支持人员协助解决)。

因为目的端写入过慢会影响至源端,导致源端抽取速度下降,因此链路速度过慢请优先排查目的端写入速度,在排除目的端因素后再排查上游。

目的端写入慢

  1. 检查目的端负载是否已达到目的端数据源上限,如DWS、Doris,优先查看目的端监控指标,查看CPU、内存、IO等参数是否处于高负载状态。
  2. 在排除目的端负载的情况下,加大作业并发,以提高写入速度。
  3. 如果第2步也无法有效提升性能,请根据源端抽取慢排查源端的性能因素。
  4. 如果排除了源端的情况下,请根据目的端优化尝试进行参数优化。
  5. 如果上述步骤仍然无法提升作业速度,请联系技术支持人员协助解决。

源端抽取慢

  1. 检查源端负载是否已到达源端数据源上限,如Mysql、Oracle、SqlServer数据源,优先查看源端数据源的监控指标,查看CPU、内存、IO等参数是否处于高负载状态。
  2. 在排除源端负载的情况下,如果源端是Mysql\Oracle\SqlServer\PostGres\OpenGauss等的全量+增量作业且作业处于全量抽取阶段,或者Kafka\hudi等数据源抽取速度慢,请优先尝试加大作业并发数,以提高作业的并发抽取速率。

    Mysql\Oracle\SqlServer\PostGres\OpenGauss等关系型数据为保证事务有序,在增量阶段是单并发抽取,加大并发一般不会提升抽取性能。

  3. 如果第2步也无法有效提升性能,请根据源端优化尝试进行参数优化。
  4. 如果上述步骤仍然无法提升作业速度,请联系技术支持人员协助解决。

源端优化

  • Mysql优化
    表1 全量阶段

    参数名

    类型

    默认值

    说明

    scan.incremental.snapshot.backfill.skip

    boolean

    true

    全量阶段是否跳过读取binlog数据,默认为true。跳过读取binlog数据可以有效降低内存使用。需要注意的是,跳过读取binlog功能只提供at-least-once保证。

    scan.incremental.snapshot.chunk.size

    int

    50000

    分片大小,决定了全量阶段单个分片最大数据的数据条数以及分片个数。分片大小越大,单个分片数据条数越多,分片个数越小。

    当表的条数过多时,作业会划分较多的分片,从而占用过多的内存导致内存问题,请解决表的条数适当调整该值。

    当scan.incremental.snapshot.backfill.skip为false时,实时处理集成作业会缓存单个分片的数据,此时分片越大,占用内存越多,引发内存溢出,在此场景下,可以考虑降低分片大小。

    scan.snapshot.fetch.size

    int

    1024

    全量阶段抽取数据时,从Mysql侧单次请求抽取数据的最大条数,适当增加请求条数可以减少对Mysql的请求次数提升性能。

    debezium.max.queue.size

    int

    8192

    数据缓存队列条数,默认为8192,当源表中单条数据过大时(如1MB),缓存过多数据会导致内存溢出,可以考虑减小该值。

    debezium.max.queue.size.in.bytes

    int

    0

    数据缓存队列大小,默认为0,即表示缓存队列不考虑数据大小,只按照数据条数计算。在debezium.max.queue.size无法有效限制内存占用时,考虑显式设置该值来限制缓存数据的大小。

    jdbc.properties.socketTimeout

    int

    300000

    全量阶段连接Mysql的socket超时时间,默认为5分钟。当Mysql负载较高,作业出现SocketTimeout异常时,考虑增大该值。

    jdbc.properties.connectTimeout

    int

    60000

    全量阶段连接Mysql的连接超时时间,默认为1分钟。当Mysq负载较高,作业出现ConnectTimeout异常时,考虑增大该值。

    表2 增量阶段

    参数名

    类型

    默认值

    说明

    debezium.max.queue.size

    int

    8192

    数据缓存队列条数,默认为8192,当源表中单条数据过大时(如1MB),缓存过多数据会导致内存溢出,可以考虑减小该值。

    debezium.max.queue.size.in.bytes

    int

    0

    数据缓存队列大小,默认为0,即表示缓存队列不考虑数据大小,只按照数据条数计算。在debezium.max.queue.size无法有效限制内存占用时,考虑显式设置该值来限制缓存数据的大小。

  • Oracle优化
    表3 全量阶段

    参数名

    类型

    默认值

    说明

    scan.incremental.snapshot.backfill.skip

    boolean

    true

    全量阶段是否跳过读取Redo log数据,默认为true。由于Oracle初始化LogMiner 较慢,因此在Oracle场景下,跳过读取Redo log数据可以有效提升全量抽取的性能,同时减低内存的使用。需要注意的是,跳过读取binlog功能只提供at-least-once保证。

    scan.incremental.snapshot.chunk.size

    int

    50000

    分片大小,决定了全量阶段单个分片最大数据的数据条数以及分片个数。分片大小越大,单个分片数据条数越多,分片个数越小。

    当表的条数过多时,作业会划分较多的分片,从而占用过多的内存导致内存问题,请解决表的条数适当调整该值。

    当scan.incremental.snapshot.backfill.skip为false时,实时处理集成作业会缓存单个分片的数据,此时分片越大,占用内存越多,引发内存溢出,在此场景下,可以考虑降低分片大小。

    scan.snapshot.fetch.size

    int

    1024

    全量阶段抽取数据时,从Mysql侧单次请求抽取数据的最大条数,适当增加请求条数可以减少对Oracle的请求次数而提升性能。

目的端优化

  • Hudi优化
    实时处理集成作业是基于Flink的实时链路,由于Hudi bloom需要消耗效果的Flink内存,因此推荐客户使用Bucket索引。下面为实时处理集成作业产品常见的优化参数。
    表4 全量阶段

    参数名

    类型

    默认值

    说明

    hoodie.sink.flush.tasks

    int

    1

    Hudi flush数据时的并发数,默认为1,即顺序写入。当Hud单次commit涉及FleGroup较多时(如源端表较多更新历史数据的场景),考虑增大该值。

    已知单线程flush的FileGroup的数据 = 单次Commit的FileGroup数量 / 作业并发数。

    单线程flush的FileGroup的数量 <= 5,推荐值2。

    单线程flush的FileGroup的数量 <= 10,推荐值5。

    单线程flush的FileGroup的数量 <= 25,推荐值10。

    单线程flush的FileGroup的数量 <= 50,推荐值20。

    单线程flush的FileGroup的数量 > 50,推荐值30。

    flush的并发数越大,flush时内存会响应升高,请结合实时处理集成作业内存监控适当调整该值。

    hoodie.context.flatmap.parallelism

    int

    1

    Hudi在commit时,会进行分区扫描操作,默认是单并发操作,当Hudi单次commit涉及的分区较多时,考虑增大该值以提升commit速度。

    单次Commit的分区数量 <= 10,推荐值5。

    单次Commit的分区数量 <= 25,推荐值10。

    单次Commit的分区数量 <= 50,推荐值20。

    单次Commit的分区数量 > 50,推荐值30。

    compaction.async.enabled

    boolean

    true

    是否开启compaction,默认为true,即默认开启hudi的compaction操作。compaction操作一定程度会影响实时任务的写入性能,如果用户使用外置的compaction操作对hudi进行compaction,可以考虑设置为false关闭实时处理集成作业的compaction操作。

    compaction.delta_commits

    int

    40

    实时处理集成生成compaction request的频率,默认为40时,即每40次commit生成一个compaction request。compaction request生成频率降低可以使得compaction频率降低从而提升作业性能。如果hudi增量数据较小。可以考虑增大该值。

  • DWS优化

    DWS的主要目标端配置中有如下参数。

    表5 全量阶段

    参数名

    类型

    默认值

    说明

    写入模式

    enum

    UPSERT MODE

    DWS的写入模式,可在“目的端配置”中设置。

    UPSERT MODE:为批量更新入库模式。

    COPY MODE:为DWS专有的高性能批量入库模式。

    实时处理集成作业推荐使用Copy Mode。

    批写最大数据量

    int

    50000

    DWS单次写入的最大条数,可在“目的端配置”中设置。

    当缓存的数据达到"批写最大数据量"和“定时批写时间间隔”之一的条件时,触发数据写入。

    单次写入条数增大可以减少请求DWS的次数,但可能导致单次请求时长增加,同时也可能导致缓存的数据增加进而影响内存使用。请综合考虑DWS规格和负载, 适当调整该值。

    定时批写时间间隔

    int

    3

    DWS单次写入的时间间隔,可在“目的端配置”中设置。

    当缓存的数据达到定时批写时间间隔的条件,触发数据写入。

    增大该值有助于增加单次写入时缓存的数据条数,但由于写入频率降低,会提升DWS数据可见的时延。

    sink.buffer-flush.max-size

    int

    512

    DWS单次写入的数据大小,默认为512MB,可在“目的端配置”高级配置中配置。

    当缓存的数据达到数据大小限制时,触发数据写入。

    与批写最大数据量类似,单次写入大小增大可以减少请求DWS的次数,但可能导致单次请求时长增加,同时也可能导致缓存的数据增加进而影响内存使用。请综合考虑DWS规格和负载, 适当调整该值。