验证和错误处理

本主题介绍 Snowflake Connector for Kafka 在引入期间如何验证数据以及如何处理错误。

验证模式

该连接器支持两种验证模式,由 snowflake.validation 配置属性控制。

服务器端验证(默认)

snowflake.validation=server_side

使用服务器端验证时,数据会发送到 Snowflake,而不进行客户端类型检查。Snowflake 后端会执行验证和模式演化,这与 COPY 和 Snowpipe 的行为一致。

  • 无效记录会被捕获到与目标表关联的 Snowflake 错误表 中。

  • 在此模式下,DLQ 不用于引入验证错误。请改用错误表。但是,如果进行了配置,无法被 Kafka 转换器反序列化(在到达 Snowflake 之前)的记录仍会被路由到 DLQ。

  • 通过将验证工作从连接器上卸载,从而实现最大吞吐量。

  • 支持默认管道和用户定义管道两种模式。

何时使用服务器端验证:

  • 您希望获得最大吞吐量。

  • 您可以在 Snowflake 中管理错误表。

  • 您正在使用用户自定义管道进行传输中的转换。

客户端验证

snowflake.validation=client_side

使用客户端验证时,连接器会在将行数据发送到 Snowflake 之前验证数据类型和模式兼容性。

  • 无效记录会根据 errors.tolerance 设置进行处理(参见下文)。

  • 当检测到新字段时,连接器会执行模式演化 DDL。

  • 支持使用死信队列 (DLQ) 来路由无效记录。

  • 仅适用于默认管道 ({tableName}-STREAMING)。如果存在用户创建的管道且客户端验证已启用,则连接器会失败并返回 ERROR_5030

何时使用客户端验证:

  • 您需要一个死信队列来处理错误。

  • 您正在从 v3 迁移,希望保持熟悉的行为。

  • 您需要连接器来控制验证。

错误处理

错误容忍度

errors.tolerance 属性控制连接器对错误的响应方式:

``errors.tolerance=none``(默认)

连接器任务在遇到第一个错误时失败。如果配置了 DLQ,失败记录仍会在任务中止之前发送到 DLQ。

errors.tolerance=all

连接器继续引入数据。无效记录会被路由到 DLQ(如果已配置),或者被静默丢弃。

警告

设置 errors.tolerance=all 而不配置 DLQ 主题会导致无效记录被静默丢弃。这是一种不安全的配置,可能会导致数据丢失。

死信队列 (DLQ)

如需配置 DLQ,请执行以下操作:

errors.deadletterqueue.topic.name=my_topic_dlq
errors.log.enable=true

以下记录会被路由到 DLQ(如果已配置):

  • **转换器错误**(两种验证模式):无论使用哪种验证模式,无法被 Kafka 转换器反序列化的记录都会被发送到 DLQ。这适用于 ``errors.tolerance=none``(记录被推送到 DLQ,然后任务失败)和 ``errors.tolerance=all``(记录被推送到 DLQ,任务继续)两种情况。

  • 客户端验证错误:当 snowflake.validation=client_side 时,未通过客户端数据转换或模式验证的记录会被发送到 DLQ。

未通过 Snowflake 服务端引入的记录不会被路由到 DLQ。请改用 错误表

备注

连接器对遇到验证错误的记录提供 至多一次 的传递。这意味着在某些故障情况下,记录可能无法到达 DLQ。

错误表(服务器端验证)

使用 snowflake.validation=server_side 时,未通过服务器端引入(类型不匹配、约束冲突)的记录会被记录在错误表中,以供检查和重放。

备注

由连接器自动创建的表默认启用错误表。

有关错误表以及 Snowpipe Streaming 错误处理的更多信息,请参阅 Error handling in Snowpipe Streaming high-performance architecture

通道状态检查(服务器端验证)

使用服务器端验证时,连接器会在提交 Kafka 偏移量之前检查 Snowpipe Streaming 通道状态。如果通道报告 rows_error_count 不断增加:

  • errors.tolerance=none 情况下:连接器会引发致命错误 (ERROR_5030),任务失败。

  • errors.tolerance=all 情况下:连接器会继续运行,并记录错误计数。无效行之后的记录仍可以被引入。如果启用了错误表,无效记录会存储在其中。

使用客户端验证时,连接器会在将记录发送到 Snowflake 之前检测无效记录。无效记录要么导致任务立即失败 (errors.tolerance=none),要么被路由到 DLQ (errors.tolerance=all)。

要使用服务器端验证调查损坏的记录,请查看渠道历史记录并使用 使用元数据偏移检测并恢复错误 中描述的间隙查找技术。该技术所需的 Kafka 偏移量信息可在 RECORD_METADATA 列中找到。