将Kafka KTable同步到SQL数据库的最简单方法是什么?

时间:2019-01-03 20:10:16

标签: sql-server apache-kafka ksql

我已经使用KSQL创建了一个流,并从该流中创建了一个聚合表。

  {  
   "ksql":"DROP Stream IF EXISTS StreamLegacyNames; DROP Stream IF EXISTS StreamLegacy; CREATE Stream  StreamLegacy (payload  STRUCT<AgeYr  varchar>)WITH (KAFKA_TOPIC='eip-legacy-13',VALUE_FORMAT='JSON' );  CREATE Stream  StreamLegacyNames As Select payload->AgeYr Age from StreamLegacy; Create Table DimAge As SELECT Age FROM StreamLegacyNames Group By Age;",
   "streamsProperties":{  
      "ksql.streams.auto.offset.reset":"earliest"
   }
}

将此代码导出到sql表的最简单方法是什么?我们正在使用jdbc连接器作为主题,但是我不清楚这是否适用于聚合的KSQL表(在本示例中为DIMAGE)。

即使我在jdbc connect配置文件中将主题设置为DIMAGE以及以下内容。

value.converter.schemas.enable=false

完整的配置文件是

connector.class=io.confluent.connect.jdbc.JdbcSinkConnector
connection.password=PASSWORD
auto.evolve=true
topics=DIMAGE
tasks.max=1
connection.user=USER
value.converter.schemas.enable=false
auto.create=true
connection.url=jdbc:sqlserver://SERVER

我在连接器中收到以下错误。

Caused by: org.apache.kafka.connect.errors.DataException: JsonConverter with schemas.enable requires "schema" and "payload" fields and may not contain additional fields. If you are trying to deserialize plain JSON data, set schemas.enable=false in your converter configuration.

通过邮递员进行的KSQL查询将KTABLE的格式显示为

{"row":{"columns":["83"]},"errorMessage":null,"finalMessage":null}
{"row":{"columns":["74"]},"errorMessage":null,"finalMessage":null}
{"row":{"columns":["36"]},"errorMessage":null,"finalMessage":null}

2 个答案:

答案 0 :(得分:2)

在KSQL中CREATE STREAM foo AS SELECT(“ CSAS”)时,您将创建一个新的Kafka主题,并用SELECT语句的结果连续填充它。

因此,您只有一个Kafka主题,在您的情况下称为STREAMLEGACYNAMES(KSQL通常将对象强制为大写)。您可以使用JDBC Sink connector将此主题流式传输到目标RDBMS,包括MS SQL。

答案 1 :(得分:0)

最后,KTable只是另一个主题。您可以使用KSQL PRINTkafka-console-consumer来查看JDBC Sink连接器将获取哪些数据。

如果您假设KSQL表将与SQL Server表完全匹配,则不会。在SQL Server表中,您将拥有出现在KTable上的每个“事件行”,包括空值,因为JDBC接收器尚不支持删除。


不确定要获得的数据是什么,但是可以做的是对要捕获的事件执行窗口化输出,那么实际上是在向下游数据库中插入了一个小批处理。