为什么KSQL流不返回/显示来自代理中主题相关消息的数据?

时间:2018-11-02 16:16:43

标签: apache-kafka ksql

我有一个运行主题为raw_events的简单Kafka经纪人。

使用kafka-console-producer --topic raw_events --broker-list kafka:29092 < event.json,我将向事件添加事件,并成功显示kafka-console-consumer --bootstrap-server kafka:29092 --topic raw_events。因此,我知道这些事件都位于代理中(在正确的主题中),也可以从代理中消费**)。

在这种情况下,event.json文件包含一个非常简单的JSON:

{'event_type': 'issue', 'project': 'sample', 'user': {'name': 'John Doe', 'username': 'jdoe'} }

在KSQL中,主题在那里:

ksql> show topics;

 Kafka Topic           | Registered | Partitions | Partition Replicas | Consumers | ConsumerGroups
--------------------------------------------------------------------------------------------------
 raw_events            | true       | 1          | 1                  | 3         | 3

包含先前尝试的一些事件:

ksql> print 'raw_events';
Format:STRING
11/2/18 3:36:21 PM UTC , NULL , {'event_type': 'issue', 'project': 'sample', 'user': {'name': 'John Doe', 'username': 'jdoe'}}
11/2/18 3:43:05 PM UTC , NULL , {'event_type': 'issue', 'project': 'sample', 'user': {'name': 'John Doe', 'username': 'jdoe'}}
11/2/18 3:45:19 PM UTC , NULL , {'event_type': 'issue', 'project': 'sample', 'user': {'name': 'John Doe', 'username': 'jdoe'}}
11/2/18 3:45:43 PM UTC , NULL , {'event_type': 'issue', 'project': 'sample', 'user': {'name': 'John Doe', 'username': 'jdoe'}}
11/2/18 3:47:30 PM UTC , NULL , {'event_type': 'issue', 'project': 'sample', 'user': {'name': 'John Doe', 'username': 'jdoe'}}

(我正在关注https://docs.confluent.io/current/ksql/docs/developer-guide/create-a-stream.html,但有我自己的数据。)

现在,我在KSQL中创建一个成功的流:

create stream new_events (event_type varchar, project varchar) with (kafka_topic='raw_events', value_format='JSON');

流已创建:

ksql> show streams;

 Stream Name     | Kafka Topic | Format
----------------------------------------
 NEW_EVENTS      | raw_events  | JSON
----------------------------------------

尽管如此(这是我的问题,可能是PEBKAC或KSQL错误),该流上的SELECT只是停止并且不显示任何事件...即使当我继续将事件添加到主题:

ksql> select * from new_events;
[... nothing here ...]

选择诸如project之类的特定列也不会返回条目。


**)顺便说一句,对于我来说还不清楚为什么Produce CLI命令具有参数--broker-list,而Consumer CLI命令具有--bootstrap-server的原因似乎也是一样。

1 个答案:

答案 0 :(得分:0)

遵循https://www.confluent.io/blog/troubleshooting-ksql-part-1上的疑难解答提示...

  • 我在源主题中有数据
  • 我有新数据*)到达主题
  • KSQL正在使用正确偏移量的数据
  • 数据匹配*)指定的谓词
  • 我在读取数据时没有反序列化错误...报告*)

虽然您会注意到*)...我发现问题是我在JSON中使用了单引号,而有效的JSON正式指定(您猜对了)引号只是双引号,"。有人将JSON的某些内部表示形式导出为带有单引号的JSON,这使我走上了错误的轨道。

因此,我示例中的正确JSON应该是

{"event_type": "issue", "project": "sample", "user": {"name": "John Doe", "username": "jdoe"}}

一切都很好。

(KSQL服务器的日志中没有任何信号表明这是问题的原因。幸运的是,如果其他人遇到此问题,此处未将其记录为潜在的解决方案。)