如何在Kafka Connect JDBC Source Connector和多个表中使用Single Message Transforms?

时间:2019-07-13 14:03:06

标签: apache-kafka apache-kafka-connect

我想在使用Kafka Connect Source JDBC Connector导入表时设置消息键。

当已定义要从JDBC连接器读取的多个表时,如何才能将Kafka Connect / Source中的单个消息转换(SMT)定位到正确的字段? SMT需要一个列名,当有多个表时,列名可能会有所不同。

我看不到根据表名或类似名称过滤SMT定义的方法。下面的代码示例仅工作一张表,因此效果很好。

但是如果您有不同的表,例如用户,订单,产品?

"table.whitelist" : "User"
"transforms":"createKey,extract",
"transforms.createKey.type":"org.apache.kafka.connect.transforms.ValueToKey",
                "transforms.createKey.fields":"user_id",
"transforms.extract.type":"org.apache.kafka.connect.transforms.ExtractField\$Key",
"transforms.extract.field":"user_id",

具有该配置的辅助任务遇到没有该user_id字段的表时,它将崩溃并保持为FAILED状态

org.apache.kafka.connect.errors.ConnectException: 
Tolerance exceeded in error handler
at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndHandleError(RetryWithToleranceOperator.java:178)
at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execute(RetryWithToleranceOperator.java:104)
at org.apache.kafka.connect.runtime.TransformationChain.apply(TransformationChain.java:50)
at org.apache.kafka.connect.runtime.WorkerSourceTask.sendRecords(WorkerSourceTask.java:293)
at org.apache.kafka.connect.runtime.WorkerSourceTask.execute(WorkerSourceTask.java:229)
at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:175)
at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:219)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)\nCaused by: java.lang.NullPointerException
at org.apache.kafka.connect.transforms.ValueToKey.applyWithSchema(ValueToKey.java:85)
at org.apache.kafka.connect.transforms.ValueToKey.apply(ValueToKey.java:65)
at org.apache.kafka.connect.runtime.TransformationChain.lambda$apply$0(TransformationChain.java:50)
at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndRetry(RetryWithToleranceOperator.java:128)
at org.apache.kafka.connect.runtime.errors.RetryWithToleranceOperator.execAndHandleError(RetryWithToleranceOperator.java:162)
... 11 more

这是合理的,因为无法通过工作台或目标光学器件进行定义,是吗?我希望能够将转换限制到给定的表或主题,例如像

transforms.<topic-name>.createKey.type

我错过了什么吗?还是Connect限制?

1 个答案:

答案 0 :(得分:2)

不可能将SMT仅应用于特定主题,因为这是连接器级别的配置,这意味着它将应用于所有已处理的消息。

我建议您为每个主题创建不同的连接器,以便仅将SMT应用于主题的子集。