Kafka Connect 接收到不在公共模式中的 Redshift 表

Posted

技术标签:

【中文标题】Kafka Connect 接收到不在公共模式中的 Redshift 表【英文标题】:Kafka Connect sink to Redshift table not in public schema 【发布时间】:2019-02-26 06:43:11 【问题描述】:

我无法使 Kafka Connect 接收器为不在公共架构中的表工作。

我正在使用 Kafka Connect 通过使用 JdbcSinkConnector 的接收器操作将记录发送到 Redshift 数据库。

我在 Redshift 中创建了我的目标表,但它不在 public 架构中。 (my_schema.test_table。注意:auto.create & auto.evolve 在连接器配置中处于关闭状态)

当我尝试在连接器配置中指定表的位置时,像这样......

"table.name.format": "my_schema.test_table",

...接收器连接器的任务在尝试自行运行时遇到此错误:

“表 my_schema.test_table 丢失,自动创建功能被禁用”

来自 Caused by: org.apache.kafka.connect.errors.ConnectException: Table my_schema.test_table is missing and auto-creation is disabled at io.confluent.connect.jdbc.sink.DbStructure.create(DbStructure.java:86) at io.confluent.connect.jdbc.sink.DbStructure.createOrAmendIfNecessary(DbStructure.java:63) at io.confluent.connect.jdbc.sink.BufferedRecords.add(BufferedRecords.java:78) ...

我尝试了以下格式来提供表名:

my_schema.test_table dev.my_schema.test_table test_table “org.apache.kafka.connect.errors.RetriableException: java.sql.SQLException: java.sql.SQLException: Amazon Invalid operation: 关系“test_table”不存在;” 可能是因为test_table 不在公共架构中。 : (

而且它似乎代码正试图正确解析这个表名,但不幸的是它没有记录它的结果。

这是我的连接字符串:"connection.url": "jdbc:redshift://xxx.xxx.xxx.xxx:5439/dev"

我一直在尝试在连接字符串中指定currentSchema=my_schema...既适用于redshift jdbc 驱动程序,也适用于postgresql。没有运气。

我使用的是 Kafka Connect 1.1.0 版

Redshift JDBC JAR:RedshiftJDBC42-1.2.16.1027.jar

我可以通过将表放入public 架构并指定没有架构的表名:"table.name.format": "test_table" 来获得数据流动。 不幸的是,这不是我们需要数据的地方。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

我注意到源代码似乎在尝试做正确的事情……然后意识到我们使用的 JDBC 接收器连接器的版本没有那些修改,这些修改是最近的。我从 JDBC 接收器连接器 jar 的 4.1.0 版本移动到 5.0.0 版本,瞧,数据正在流入我指定的模式中的表中。 ?

【讨论】:

以上是关于Kafka Connect 接收到不在公共模式中的 Redshift 表的主要内容,如果未能解决你的问题,请参考以下文章

Kafka Connect - 不适用于更新操作

如何处理 Kafka Connect Sink 中的背压?

kafka-connect JDBC PostgreSQL Sink Connector 显式定义 PostgrSQL 模式(命名空间)

Kafka Connect:一个接收器连接器,用于从一个主题写入多个表

不使用 Kafka Connect 复制架构更改

Kafka Connect有没有办法忽略模式文件中的1个字段并将其他字段读入数据库