当记录从多个源插入源主题中时,Kafka源连接器未按预期提取记录

时间:2019-03-23 17:33:31

标签: apache-kafka kafka-producer-api apache-kafka-connect

在我的一个用例中,我正在尝试创建管道

每当我从自定义分区发送消息时,我都会以毫秒为单位发送带有LONG数据类型的时间戳,因为在架构中,timestamp列已定义为long。

我先前在自定义分区中拥有的代码:

Date date = new Date();
long timeMilli = date.getTime();
System.out.println("date = " + date.toString() + " , time in millis = " + timeMilli);

在发送记录之前显示结果:

  

日期= 2019年3月26日星期二22:02:04,以毫秒为单位的时间= 15536​​52124063

在表2的时间戳列中插入了

值:

  

2019/3/27下午2:02:04.063000

由于采用了英国时区(我认为),因此我暂时将其定为从当前时间戳中减去4个小时,以便与美国EST时间戳匹配。

Date date = new Date();
Date adj_date = DateUtils.addHours(date,-4);
long timeMilli = adj_date.getTime();
System.out.println("date = " + date.toString() + " , time in millis = " + timeMilli);

显示结果:

  

date = 2019年3月26日星期二22:04:43,以毫秒为单位的时间= 15536​​37883826

在表2的时间戳列中插入了

值:

  

2019/3/26下午10:04:43.826000

请让我知道是否丢失了任何内容,因为我不确定从自定义分区发送消息时为什么会发生这种情况。

1 个答案:

答案 0 :(得分:1)

Jdbc Source Connector内幕使用以下查询:

SELECT * FROM someTable
WHERE
someTimestampColumn < $endTimetampValue
AND (
    (someTimestampColumn = $beginTimetampValue AND someIncrementalColumn > $lastIncrementedValue)
    OR someTimestampColumn > $beginTimetampValue)
ORDER BY someTimestampColumn, someIncrementalColumn ASC

总结:如果行的时间戳列的值比当前时间戳早 且比上次检查的 晚,则查询将检索行。

>

以上参数是:

  1. beginTimetampValue-最后导入的记录的时间戳列的值
  2. endTimetampValue-根据数据库的当前时间戳记
  3. lastIncrementedValue-最后导入的记录的增量列的值

我认为在您的情况下,Producer将时间戳记设置为更高的表记录,而不是稍后(使用查询)手动插入

当Jdbc Connector检查要导入到Kafka的新记录时,它会跳过这些记录(因为它们未填写someTimestampColumn < $endTimetampValue 时间戳条件

您还可以将日志级别更改为DEBUG,并查看日志中发生的事情