Kafka Streams联接-表太大

时间:2019-08-08 09:44:19

标签: apache-kafka apache-kafka-streams apache-kafka-connect ksql confluent-platform

我想使用Kafka Streams API在带有KTable的KStream上执行左连接,以将表的某些字段添加到流中。

对于包含所有相关条目的较小版本的表(大约1300个条目),一切都可以正常工作。

一旦我使用了整个表(大约200,000个条目),就会在得到KTable的Avro消息(GenericRecord)的相关字段的行中得到NullPointerException

当我在KSQL中执行相同的左联接操作时,从表中添加的字段为NULL。表中存在相关的联接键,但是在KSQL中查询它们大约需要花费时间。直到它们出现20秒。

表是否可能太大而无法执行左联接? 如果是这样,我有什么办法可以使用整个表进行联接工作?

出于开发目的,我目前将Confluent Platform与单个Kafka代理一起使用,并且所有主题都只有一个分区。

堆栈跟踪:

[myclass-68507371-7b8e-4bdc-8715-73d0307c9058-StreamThread-1] ERROR org.apache.kafka.streams.processor.internals.AssignedStreamsTasks - stream-thread [myclass-68507371-7b8e-4bdc-8715-73d0307c9058-StreamThread-1] Failed to process stream task 3_0 due to the following error:
java.lang.NullPointerException
  at MyClass.lambda$main$6(MyClass.java:184)
  at org.apache.kafka.streams.kstream.internals.KStreamKTableJoinProcessor.process(KStreamKTableJoinProcessor.java:73)
  at org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:117)
  at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:183)
  at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:162)
  at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:122)
  at org.apache.kafka.streams.processor.internals.SourceNode.process(SourceNode.java:87)
  at org.apache.kafka.streams.processor.internals.StreamTask.process(StreamTask.java:364)
  at org.apache.kafka.streams.processor.internals.AssignedStreamsTasks.process(AssignedStreamsTasks.java:199)
  at org.apache.kafka.streams.processor.internals.TaskManager.process(TaskManager.java:420)
  at org.apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.java:890)
  at org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:805)
  at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:774)

该字段在Avro架构中为空。

1 个答案:

答案 0 :(得分:0)

如堆栈跟踪所示(错误源自MyClass.lambda$main$6(MyClass.java:184)),您自己的代码中的异常必须是您的ValueJoiner实现。在执行leftJoin()时,传入的“ KTable”值可能为null。我假设您的代码无法正确处理null。如果要避免完全获取null并在没有对应的KTable记录的情况下删除KStream记录,则可以使用join()而不是leftJoin()