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