本文将为您介绍 DataSail 读写 ByteHouse CDW 时可配置的高级参数,涵盖 CDC Source 和 Sink 两侧,可以帮助您提升数据同步的实时性、优化吞吐量,并解决日常运维问题。
本章节详细介绍 ByteHouse CDW CDC Source 在读取数据时可供配置的高级参数。
job.reader.initial_offset_typelatestlatest。earliest。这会从数据源可追溯的最早位点开始读取,可能产生大量历史数据读取,请确保下游有能力处理。specified,并配合 job.reader.initial_offset_props 参数指定每个表的具体位点。job.reader.initial_offset_type: "latest"job.reader.initial_offset_type: "earliest"job.reader.initial_offset_type: "specified"job.reader.initial_offset_props: {"your_db.your_table1": 1234567890, "your_db.your_table2": 2345678901}job.reader.initial_offset_props:
job.reader.initial_offset_type 设置为 specified 时,此参数才生效。它是一个 Map<String, Long> 结构,其中 key 是数据库和表的完全限定名(如 db_name.table_name),value 是要启动的 BSN 位点。initial_offset_type 为 specified,但 initial_offset_props 中未包含某个表的条目,则该表会自动回退到 latest 模式启动。job.reader.initial_offset_type 保持了默认值 latest。此模式下,作业只会从启动时刻开始消费新的变更。如需同步历史数据,请将其设置为 earliest。earliest 后作业启动非常慢,并且源端负载很高,怎么办?earliest 模式会读取全部历史数据,对于大表来说会产生巨大的读 IO 和网络流量。建议在业务低峰期执行首次全量同步。如果源端无法承受压力,可以考虑先通过批量任务或其他方式导出历史数据,然后将 CDC 作业设置为 latest 来处理增量。earliest 模式前务必评估源端数据库的性能和网络带宽,避免对线上业务造成冲击。specified 模式的复杂性:使用 specified 模式需要准确获取 BSN,操作不当可能导致数据丢失或重复。这通常用于专业的故障恢复场景。job.reader.initial_offset_type 参数用于决定 CDC 作业首次启动时的数据读取起点。使用默认值 latest 可实现纯增量同步;设置为 earliest 则会进行全量历史数据同步;若需从特定位点恢复,可使用 specified 并配合 job.reader.initial_offset_props 参数。请注意,这是一个仅在作业首次启动时生效的初始化参数。job.reader.initial_offset_propsjob.reader.initial_offset_type 设置为 specified 时,为一张或多张表提供精确的 CDC 启动位点(BSN)。initial_offset_props 中指定不同的 BSN。配置格式:这是一个 JSON Map 结构,键(Key)为表的完全限定名 database.table,值(Value)为长整型的 BSN。
"job.reader.initial_offset_props": { "sales.orders": 1672502400000, "inventory.products": 1672512400000 }
获取 BSN:BSN 是 ByteHouse 内部的序列号,需要通过查询系统表或联系技术支持获取。切勿随意填写。
job.reader.initial_offset_type:此参数强依赖于 initial_offset_type 被设置为 specified。如果 initial_offset_type 为 latest 或 earliest,则 initial_offset_props 会被完全忽略。specified 模式下,initial_offset_props 中没有提供某张表的条目,那么该表将自动回退到 latest 模式,即从作业启动时开始消费增量。initial_offset_props,为什么没有生效?job.reader.initial_offset_type 是否已正确设置为 specified。同时,确认 Map 中的键 database.table 与您的实际库表名完全匹配(包括大小写)。job.reader.initial_offset_props 是一个高级参数,当且仅当 job.reader.initial_offset_type 为 specified 时生效。它允许您为 CDC 作业中的一张或多张表提供精确的启动位点(BSN),主要用于专业的故障恢复和数据回溯场景。使用此参数需要准确提供“库名.表名”和对应的 BSN 值。job.reader.scan_split_size10000Timeout waiting for response, Connection reset by peer2048 或 4096。减小单次拉取的数据量可以降低对源端的瞬时压力和网络传输压力。32768 或 65536。增大批次可以减少拉取数据的请求次数,从而降低 RPC 开销,提升吞吐。10000 是一个较为均衡的默认值,适用于大多数场景。job.reader.cdc_retry_times:当单次拉取(受 scan_split_size 影响)失败时,系统会进行重试。如果调大了 scan_split_size 导致超时概率增加,可能也需要关注重试次数的配置。job.reader.scan_split_size 参数控制 CDC 作业从 ByteHouse 拉取数据时每个批次的大小(行数),默认值为 10000。您可以根据需求调整此参数以平衡源端负载和同步吞吐量:为保护源端或解决超时问题,请适当调小该值;为在网络良好且源端空闲时提升吞吐,可适当调大。这是一个在降低单次请求压力与减少请求频率之间进行权衡的关键参数。job.reader.cdc_retry_times / job.reader.cdc_retry_interval_mscdc_retry_times (次) / cdc_retry_interval_ms (毫秒)cdc_retry_times: 5 / cdc_retry_interval_ms: 1000ConnectException, SocketTimeoutExceptionjob.reader.cdc_retry_times 的值,例如 10 或 20,以提高任务对网络抖动的容忍度。可以同时略微增加 cdc_retry_interval_ms(如 5000)来避免过于频繁的重试冲击。job.reader.cdc_retry_times 的值,例如 1 或 0。cdc_retry_times: 5, cdc_retry_interval_ms: 1000。这套默认配置提供了一个合理的容错窗口(总计约 5-6 秒的重试时间),能应对大部分短暂的网络问题。job.reader.cdc_retry_times: 30job.reader.cdc_retry_interval_ms: 10000 (10秒)job.reader.scan_split_size:如果调大了 scan_split_size 导致单次请求耗时增加,进而增加了超时的风险,那么一个更宽松的重试策略(更大的 cdc_retry_times)可能有助于提升作业稳定性。cdc_retry_interval_ms 参数在代码中似乎没有被完全透传,它实际生效吗?cdc_retry_times 在 CdwFlinkSourceBuilder 中被明确用于构建 CnchCdcSource,是生效的。而 cdc_retry_interval_ms 虽然在配置项中定义,但在当前的构建逻辑中可能未被直接使用,重试间隔可能由底层 CDC 连接器或框架的默认退避策略控制。尽管如此,保留此参数配置是向前兼容的良好实践。job.reader.cdc_retry_times 参数用于设定 CDC Source 在遇到网络抖动等可恢复的拉取错误时的最大重试次数,默认值为 5 次。您可以根据网络稳定性与故障恢复的期望,适当调大此值以提升任务容错性,或调小它以实现快速失败。此参数与 job.reader.cdc_retry_interval_ms(重试间隔)共同决定了作业在因临时性问题而彻底失败前的总容忍时长。参数概述
job.reader.src_meta_info_column_enabled / job.reader.src_meta_info_column_namesrc_meta_info_column_enabled: false / src_meta_info_column_name: _src_meta_info_适用场景
job.reader.src_meta_info_column_enabled: true。INSERT、UPDATE、DELETE 操作,例如将 DELETE 事件写入单独的归档表。message_type 或 row_kind 字段。timestamp 字段。调参建议 / 推荐配置
job.reader.src_meta_info_column_enabled: truejob.reader.src_meta_info_column_name: "my_cdc_meta" (可选,自定义列名)Row 中会增加一列,其内容为类似如下的 JSON 字符串:{ "db": "my_db", "table": "my_table", "bsn": 1234567890123, "message_type": "INSERT", "timestamp": 1672531200000 }
参数联动
job.reader.meta_db_seq_enabled:如果开启了元数据列,并且此参数也为 true(默认),元数据中还会包含一个 db_seq 字段,用于标识数据源于哪个数据库(按配置顺序的索引)。注意事项
总结说明job.reader.src_meta_info_column_enabled 参数控制是否在 CDC 数据流中附加一列包含源端元数据(如数据库名、表名、操作类型、BSN等)的 JSON 字符串。当您需要进行数据溯源、实现依赖于操作类型(增/删/改)的复杂 ETL 逻辑或进行数据审计时,应将此参数设为 true。您还可以通过 job.reader.src_meta_info_column_name 自定义该元数据列的名称。
参数概述
job.reader.meta_db_seq_enabledtruedb_seq 的字段。该字段是一个从 0 开始的整数,用于唯一标识事件来源于哪个数据库。适用场景
marketing_db, sales_db)中读取表,并写入到同一个下游系统。下游需要一种高效的方式来区分和路由来自不同源库的数据。true。下游可以直接使用 db_seq 字段(0, 1, 2...)作为分区键、索引或路由逻辑的判断依据,这比直接比较字符串形式的库名更高效。false 以减少元数据的大小,但通常保持默认值也无妨。调参建议 / 推荐配置
默认推荐:保持 true。这是一个低开销但高价值的元数据字段,尤其在未来可能扩展到多库同步时,能提供很好的扩展性。
配置示例:
"job.reader.meta_db_seq_enabled": true
开启后,_src_meta_info_ 列的 JSON 内容将包含 db_seq:
{ "db": "sales_db", "table": "orders", "db_seq": 1, ... }
参数联动
job.reader.src_meta_info_column_enabled:meta_db_seq_enabled 必须在 src_meta_info_column_enabled 为 true 的前提下才能生效。如果元数据列本身被禁用了,db_seq 也就无处安放。job.reader.database_include_list:db_seq 的值与数据库在 database_include_list 中出现的顺序相关。列表中的第一个数据库对应的 db_seq 为 0,第二个为 1,以此类推。注意事项
db_seq 的值依赖于配置中数据库列表的顺序。如果调整了 database_include_list 中数据库的顺序,同一个数据库的 db_seq 值可能会发生变化。总结说明job.reader.meta_db_seq_enabled 参数控制是否在 CDC 事件的元数据中添加一个 db_seq 字段,用于标识事件来源于哪个数据库(根据其在配置列表中的顺序)。在多数据库同步场景下,这个从0开始的整数序列号为下游提供了稳定、高效的来源区分和排序依据。该参数默认开启,建议保持,但需确保 job.reader.src_meta_info_column_enabled 也已启用。
job.common.cdc_multiplex_record_case_insensitivetruemy_table 和 My_Table,或者字段有 userId 和 userid 等大小写混用的情况。在下游进行 schema 映射或处理时,希望能将它们视为同一个对象。true。系统会自动将所有标识符转换为小写进行处理,从而屏蔽源端的大小写差异。my_table 和 My_Table 这两个不同的表,它们存储的是不同业务含义的数据。false。此时,系统将严格按照原始的大小写来匹配和处理库、表、字段名。job.common.cdc_multiplex_record_case_insensitive: truejob.common.cdc_multiplex_record_case_insensitive: falsejob.reader.initial_offset_props 中的 database.table 键。cdc_multiplex_record_case_insensitive 默认开启。系统将 my_table 和 My_Table 都处理为 my_table,导致它们被视为同一个对象。如果您确实需要区分它们,请将此参数设为 false。true 改为 false 可能会导致现有作业因找不到表或字段而失败,需要仔细检查并修正所有相关配置的大小写。true 是最佳实践。job.common.cdc_multiplex_record_case_insensitive 是一个全局性的兼容性参数,用于控制 CDC 数据同步过程中是否忽略库、表、字段名的大小写,默认值为 true(忽略大小写)。强烈建议保持此默认设置,它可以自动处理因开发不规范或异构数据库差异引起的大小写不匹配问题。仅在您需要严格区分如 myTable 和 mytable 这类仅大小写不同的对象时,才考虑将其设为 false。本章节详细介绍 ByteHouse CDW Sink 在写入数据时可供配置的高级参数。
job.writer.atomic_writefalseATTACH PARTITION 命令将数据原子性地迁移到目标表,从而实现“all-or-nothing”的写入语义。true。这可以有效避免作业运行到一半失败,导致目标表数据处于不一致的“半新半旧”状态。false。非原子写入路径更简单,开销更低。流式作业会忽略此参数。job.writer.atomic_write: trueCREATE TABLE 和 DROP TABLE 的权限,因为框架需要创建和清理临时表。job.writer.atomic_write: falsejob.common.job_type:atomic_write 仅在 job.common.job_type 为 BATCH 时生效。job.writer.atomic_write_retry_*:在原子提交阶段(ATTACH PARTITION),如果遇到可重试错误,atomic_write_retry_limits 和 atomic_write_retry_wait_millis 将控制重试行为。job.writer.table_name:开启原子写后,写入过程中实际操作的是一个临时表(如 __your_table_temporary_for_job_id__),table_name 指定的原始表名仅在最终提交阶段被使用。job.writer.atomic_write 参数仅在批处理(Batch)模式下生效,用于提供端到端的原子写入保证,默认关闭。当您需要确保一个批次作业的产出要么完整替换目标分区、要么在失败时完全不留痕迹,可以将其设为 true。请注意,这会带来额外的权限要求和性能开销,且对流式作业无效。job.writer.atomic_write_retry_limits / job.writer.atomic_write_retry_wait_millisatomic_write_retry_limits (次) / atomic_write_retry_wait_millis (毫秒)atomic_write_retry_limits: 30 / atomic_write_retry_wait_millis: 10000ATTACH PARTITION 等命令时),如果遇到临时性、可恢复的错误,这对参数将控制系统的重试行为。ETIMEDOUT (Connection timed out)job.writer.atomic_write_retry_limits: 30job.writer.atomic_write_retry_wait_millis: 10000job.writer.atomic_write_retry_limits: 3job.writer.atomic_write_retry_wait_millis: 5000job.writer.atomic_write:这对参数仅在 job.writer.atomic_write 为 true 时才有意义。如果未开启原子写,它们将被完全忽略。job.writer.atomic_write_retry_limits 和 job.writer.atomic_write_retry_wait_millis 这组参数仅在启用原子写入(atomic_write=true)时生效。它们用于控制在向事务协调器发起全局提交的阶段,如果遇到网络超时等临时性错误时的重试策略。默认配置提供了长达5分钟的重试窗口(重试30次,每次间隔10秒),足以应对大多数临时故障,通常无需修改。job.writer.buffer_count / job.writer.flush_intervalbuffer_count (行数) / flush_interval (毫秒)buffer_count: 8192 / flush_interval: 60000buffer_count,或者自上次刷写以来的时间超过 flush_interval,就会触发一次从内存到 ByteHouse 的实际写入操作。job.writer.flush_interval,例如 5000 (5秒) 或 10000 (10秒)。这会使数据在内存中停留的时间更短。job.writer.buffer_count(如 65536)和 job.writer.flush_interval(如 120000)。这使得每次写入的批次更大,能有效利用网络和数据库资源,提升总吞吐。job.writer.buffer_count,例如 4096。减少缓冲区大小可以显著降低 Sink 端的内存占用。job.writer.flush_interval: 5000 (5s)job.writer.buffer_count: 8192 (可保持默认或略微调小)job.writer.flush_interval: 120000 (2min)job.writer.buffer_count: 65536job.writer.flush_interval: 60000 (1min)job.writer.buffer_count: 8192buffer_count 通常会先被触发。flush_interval 将作为兜底,确保数据不会无限期地滞留在内存中。buffer_count 会增加 Flink TaskManager 的内存消耗,请确保集群资源充足。flush_interval 和 buffer_count 会导致频繁的小批量写入,增加数据库的查询(QPS)和连接压力,可能反而降低整体性能。job.writer.buffer_count 和 job.writer.flush_interval 共同决定了数据写入 ByteHouse 的时机和批次大小。您可以根据业务需求在数据实时性、写入吞吐量和内存消耗之间进行权衡:若需降低延迟,请调小 flush_interval;若需提升吞吐,请调大 buffer_count;若内存紧张,请调小 buffer_count。job.writer.connection_validity_timeout10Broken pipe, Connection is closed10。这确保了每次写入前都会用一个合理的超时时间来快速验证连接。如果连接失效,框架会自动尝试重新建立连接,从而提升作业的健壮性。5 或 3。但不建议完全关闭或设置得过小,因为连接有效性检查是保障写入可靠性的重要一环。10 即可。这是一个在可靠性与性能之间取得良好平衡的值。isValid() 方法行为相关。一个合理的超时设置可以防止作业在等待一个失效连接的响应时被长时间卡住。job.writer.connection_validity_timeout 参数用于设定在写入数据前检查数据库连接是否仍然有效的超时时间(秒),默认值为 10。这是一个保障作业在网络不稳定环境下稳定运行的“健康检查”参数,它能帮助系统及时发现并替换掉已失效的“僵尸连接”。对于绝大多数场景,保持默认值即可。job.writer.max_partitions_per_insert_block10000SET max_partitions_per_insert_block = xxx 的方式,为当前会话设置单次 INSERT 操作能够涉及的最大分区数量。这是一个保护性参数,旨在防止因单次写入过于分散而触达 ByteHouse 服务端的默认限制。Too many partitions for single insert block 错误。1000 或更高,以放宽服务端的限制。10000。这个值远大于服务端默认的 100,足以应对绝大多数场景,通常无需修改。Too many partitions 错误时,才需要关注和调整此参数。max_partitions_per_insert_block 设置为一个大于该值的数值。job.writer.buffer_count 和 job.writer.flush_interval:这两个参数决定了刷写批次的大小和频率。一个更大的 buffer_count 可能会导致一个批次中包含更多样化的数据,从而更容易触及分区数量限制。job.writer.max_partitions_per_insert_block 参数用于限制单次写入操作能涉及的最大分区数,默认值为 10000。这是一个保护性参数,旨在防止因数据写入过于分散而导致的服务端性能问题。当您遇到 “Too many partitions for single insert block” 错误时,如果确认业务上确实需要一次性写入更多分区,可以根据实际需求调大此值。但更推荐的做法是优化上游数据或表的分区键设计,以提高数据写入的局部性。job.writer.query_timeout180000 (3分钟)Statement 的执行超时时间。如果在指定时间内,一个 SQL 查询(包括 INSERT)没有执行完成,客户端将主动中断它。buffer_count 设置得很高),或者目标表结构复杂、有较重的写入时计算,导致 INSERT 语句执行时间超过默认的 3 分钟,从而引发超时失败。Query timed out600000 (10分钟)。180000。对于大多数场景,3 分钟的写入超时是比较宽裕的。buffer_count 非常大,或者单条记录很大,可以相应地增加 query_timeout。一个粗略的估算方法是:在测试环境尝试一次大的 flush,观察其耗时,然后设置一个大于该耗时 2-3 倍的值作为安全边际。job.writer.connection_validity_timeout(连接检查超时)和 job.writer.flush_interval(刷写间隔)区分开。job.writer.query_timeout 参数用于设置单次数据写入 SQL 操作的最大允许执行时间(单位:毫秒),默认值为 3 分钟。当您处理超大规模数据批次或遇到写入超时错误时,可以适当调大此值。它为写入操作提供了一个“熔断”机制,防止作业因数据库长时间无响应而被永久阻塞。job.writer.secure / job.writer.cnch_enginetruesecure: 控制是否启用安全连接(SSL/TLS)。cnch_engine: 告知驱动程序目标是 CNCH(Cloud Native ClickHouse)架构。true。这是与 CDW 服务正确、安全通信的基础。job.writer.secure 设置为 false。job.writer.cnch_engine 设置为 false。job.writer.secure: truejob.writer.cnch_engine: truesecure 会使数据在网络中以明文传输,存在安全风险。cnch_engine 去连接一个真正的 CDW 实例,可能会导致某些依赖 CNCH 架构的功能(如原子写、多副本写入策略)行为异常或性能下降。job.writer.secure 和 job.writer.cnch_engine 是连接 ByteHouse CDW 的两个基础性关键参数,默认均为 true。secure 确保了数据传输的安全性,cnch_engine 则保证了与 CDW 云原生架构的正确适配。在任何情况下,除非有明确的技术指导和特殊需求,您都应保持这两个参数的默认设置。job.writer.bh_connection_properties / job.writer.session_propertiesbh_connection_properties:作用于连接建立时。其中的键值对会作为属性附加到 JDBC 连接串上。session_properties:作用于每次 SQL 执行前。其中的键值对会通过 SET key = value 的方式在当前会话中生效。sslrootcert。job.writer.bh_connection_properties。INSERT 语句的性能,需要临时关闭某个去重开关。insert_deduplicate, enable_optimizerjob.writer.session_properties。格式:两个参数都是 JSON Map 结构。
"job.writer.bh_connection_properties": { "sslmode": "verify-full", "sslrootcert": "/path/to/ca.pem" }, "job.writer.session_properties": { "insert_deduplicate": "0" }
按需使用:这两个都是高级参数,仅在您明确知道需要配置哪个具体参数时才使用。请参考 ByteHouse/ClickHouse 官方文档或在技术支持的指导下进行配置。
bh_connection_properties 和 session_properties 的内容可能会被打印在作业的 INFO 级别日志中。请避免在其中放置任何敏感信息(如密码、token 等)。bh_connection_properties 只在建连时生效一次;session_properties 则在每次 flush 前都可能被重新设置,作用范围是当前会话。bh_connection_properties 和 session_properties 是两个专家级的“透传”参数,分别用于在建立连接时和执行查询前向 ByteHouse 传递自定义属性。当您需要配置 BitSail 未直接封装的底层驱动参数或临时调整会话行为时,可以使用它们。请在查阅官方文档或在技术支持指导下使用,并注意避免在其中配置敏感信息。注意
以下参数组主要控制 Sink 端的写入行为(追加 vs. 更新),以及在下游目标表不存在时,如何根据上游 schema 自动创建表(DDL)。
job.writer.write_mode / job.writer.unique_keyswrite_mode: 定义写入模式。INSERT(默认)表示纯粹的追加写入;UPSERT 表示根据主键进行更新或插入。unique_keys: 在 UPSERT 模式下,指定用于判断数据唯一性的一个或多个字段,多个字段用逗号分隔。job.writer.write_mode: "INSERT"。这是性能最高的模式。UPDATE 和 DELETE,下游需要保持一致。job.writer.write_mode: "UPSERT"job.writer.unique_keys: "id,other_unique_col"UPSERT 语义的引擎(如 CnchMergeTree 家族),并且 unique_keys 必须与表定义中的主键或唯一键一致。UPSERT 模式相比 INSERT 会有额外的合并开销。unique_keys 未配置,系统会尝试从 Catalog 中获取表的主键定义。如果两者都没有,UPSERT 模式将无法正常工作。write_mode 用于选择数据写入模式。对于只需追加新数据的场景,使用默认值 INSERT 可获得最佳性能。当需要同步来自业务数据库的变更(包括更新和删除)或实现数据去重时,应设置为 UPSERT,并配合 unique_keys 参数指定唯一键。UPSERT 模式强依赖于表引擎和主键定义。job.writer.ddl_create_table_order_by_fieldsjob.writer.ddl_create_table_partition_by_fieldsjob.writer.ddl_create_table_cluster_by_fields & job.writer.ddl_create_table_bucketsjob.writer.ddl_create_table_sample_by_expressionjob.writer.ddl_create_table_ttl_expressionjob.writer.ddl_create_table_settingsjob.writer.table_without_primary_key_strategyORDER BY, PARTITION BY, CLUSTER BY, TTL 等物理存储属性。ddl_create_table_order_by_fields: (强烈建议) 指定排序键,这是影响查询性能最重要的物理属性。ddl_create_table_partition_by_fields: (强烈建议) 指定分区键,用于数据裁剪和生命周期管理。TTL 用于数据自动过期,CLUSTER BY 用于更细粒度的数据组织,请根据高级需求配置。table_without_primary_key_strategy:在 UPSERT 模式下,如果上游 schema 没有主键,此参数决定了建表行为。SKIP(默认)表示跳过建表并丢弃数据,CREATE_AS_APPEND 表示降级为 INSERT 模式创建一张普通追加表。本章节介绍在 Source 和 Sink 两端都可能用到的通用参数。
job.common.global_timezoneAsia/Shanghai 或 UTC)。job.common.global_timezone 为您的业务标准时区。例如,如果业务数据都以北京时间为基准,应设置为 Asia/Shanghai。Asia/Shanghai 时区)运行结果正确,部署到服务端(可能是 UTC 时区)后出现时间偏差。job.common.global_timezone: "Asia/Shanghai"Date, Timestamp 类型的字符串转换、JDBC 驱动的时区处理等。job.common.global_timezone 参数用于为 BitSail 作业设置一个统一的 JVM 默认时区(如 Asia/Shanghai 或 UTC),以确保所有时间相关类型(如 Date, Timestamp)的解析和格式化都基于一个确定的基准。强烈建议在所有生产作业中显式配置此参数,以消除对运行环境的依赖,避免因时区不一致导致的数据偏差问题,并确保时间函数和分区表达式的行为符合预期。说明
以下参数组是一套高级实验性功能,用于在 ByteHouse CDW Sink 中实现天级分区的近实时滚动快照,作为对传统 T+1 批量作业的一种替代方案。请在充分理解其机制和风险后使用。
job.common.is_merge_jobjob.writer.init_with_previous_partitionjob.writer.event_time_partition_column_namejob.common.time_unitjob.common.start_event_timestampjob.common.is_merge_job: truejob.writer.init_with_previous_partition: truejob.writer.event_time_partition_column_name: "your_date_partition_col" (目标表中必须有此 Date 类型分区列)job.common.time_unit: "DAY" (当前仅支持天级别)job.common.start_event_timestamp: (可选) 提供一个基准时间戳,用于计算“今天”和“昨天”。init_with_previous_partition 的那次运行)在每个自然日只被精确执行一次。重复执行会导致数据重复。event_time_partition_column_name 指定的列必须是 Date 类型。job.common.is_merge_job 和 job.writer.init_with_previous_partition 设置为 true,并提供分区列名和基准时间戳,您可以让 CDC 作业在每日分区切换时,自动将前一天的最终数据状态复制到当天分区作为初始数据。此功能可替代传统的每日全量 T+1 批量任务,但需要精细的调度策略来保证其幂等性。在配置 DataSail ByteHouse CDW 连接器时,性能调优通常围绕以下几个核心权衡展开:
job.writer.flush_interval,让数据更快地从内存写入数据库。job.writer.buffer_count 和 job.writer.flush_interval,用更大的批次来摊薄单次写入的开销。同时,在源端(如果资源允许),可以尝试增大 job.reader.scan_split_size。job.writer.buffer_count 是 Sink 端内存消耗的主要来源。如果遇到 OOM,优先降低此值。flush_interval)或拉取(小 scan_split_size)会增加网络和 CPU 的开销。job.reader.cdc_retry_times 可以让作业更能容忍暂时的网络抖动。说明
initial_offset_type:确认是否为 latest 且源端确实没有新数据。如果需要同步历史数据,应改为 earliest。database_include_list 和 table_include_list 是否正确配置,是否无意中排除了目标表。host, port, token, virtual_warehouse 等连接参数是否正确,作业是否有权限访问源端。No tables are matched 或 Offset for table ... is set to latest 等日志,确认表的发现和位点设置情况。说明
job.reader.scan_split_size,降低对源端的单次请求压力。job.writer.buffer_count,让每次 INSERT 的数据量变小。job.writer.query_timeout 以给予更长的执行时间。说明
job.common.global_timezone: "Asia/Shanghai",统一作业运行的 JVM 时区。这是解决此类问题的最根本方法。DATETIME, TIMESTAMP),以及它们是否带有时区信息。说明
Too many partitions 失败job.writer.max_partitions_per_insert_block 的值,例如设置为 1000。