kafka KStream - 采用n秒计数的拓扑

时间:2016-09-14 22:07:23

标签: java apache-kafka apache-kafka-streams

我有一个JSON对象流,我正在键入几个值的哈希值。我希望在n秒(10?60?)间隔内按键计数,并使用这些值进行一些模式分析。

我的拓扑:K->aggregateByKey(n seconds)->process()

process - init()步骤中,我呼叫ProcessorContent.schedule(60 * 1000L),希望.punctuate()被调用。从这里开始,我将遍历内部哈希中的值并相应地执行操作。

我看到值通过聚合步骤并点击process()函数,但.punctuate()永远不会被调用。

代码:

KStreamBuilder kStreamBuilder = new KStreamBuilder();
KStream<String, String> opxLines = kStreamBuilder.stream(TOPIC);

KStream<String, String> mapped = opxLines.map(new ReMapper());

KTable<Windowed<String>, String> ktRtDetail = mapped.aggregateByKey(
            new AggregateInit(),
            new OpxAggregate(),
            TimeWindows.of("opx_aggregate", 60000));

ktRtDetail.toStream().process(new ProcessorSupplier<Windowed<String>, String>() {
                            @Override
                            public Processor<Windowed<String>, String> get() {
                                 return new AggProcessor();
                            }
                       });

KafkaStreams kafkaStreams = new KafkaStreams(kStreamBuilder, streamsConfig);

kafkaStreams.start();

AggregateInit()返回null。

我想我可以使用简单的计时器进行.punctuate()等效,但我想知道为什么这段代码不会像我希望的那样工作。

1 个答案:

答案 0 :(得分:0)

我认为这与kafka集群的不正确设置有关。将文件描述符计数更改为比默认值(1024 - > 65535)高得多的值后,这似乎符合规范。