我们的JavaScript程序每秒使用kafka-rest异步编写20条消息。 我们尝试对传入的消息进行聚合,但它会返回一些不一致的结果。
请在下面找到主题,流和汇总结果表定义。
主题:
./bin/kafka-avro-console-producer –broker-list localhost:9092 –topic order_flow –property value.schema='{“type”:”record”,”name”:”myrecord”,”fields”:[{“name”:”OrderID”,”type”:”int”},{“name”:”OrderDate”,”type”:”long”},{“name”:”Status”,”type”:”string”},{“name”:”ProductID”,”type”:”int”}]}’
流:
CREATE STREAM ORDERS_SRC WITH (KAFKA_TOPIC=’order_flow’, VALUE_FORMAT=’AVRO’);
NEW STREAM - 此流使用实际的事件日期,而不是消息在kafka中写入的时间。
CREATE STREAM ORDERS WITH (TIMESTAMP =’ORDERDATE’) AS SELECT ORDERDATE,ORDERID, STATUS, PRODUCTID FROM ORDERS_SRC;
现在我们使用以下方式基于状态汇总数据:
CREATE TABLE ORDERS_AGG_SEC as select Status,Count(*) from ORDERS_D WINDOW TUMBLING(SIZE 1 SECONDS) GROUP BY STATUS;
现在我们运行查询SELECT * FROM ORDERS_AGG_SEC;它返回结果
1522328177000 | Processing : Window{start=1522328177000 end=-} | Processing | 20
1522328178000 | Processing : Window{start=1522328178000 end=-} | Processing | 20
1522328179000 | Processing : Window{start=1522328179000 end=-} | Processing | 5
1522328179000 | Processing : Window{start=1522328179000 end=-} | Processing | 20
1522328180000 | Processing : Window{start=1522328180000 end=-} | Processing | 20
1522328181000 | Processing : Window{start=1522328181000 end=-} | Processing | 15
1522328181000 | Processing : Window{start=1522328181000 end=-} | Processing | 20
1522328182000 | Processing : Window{start=1522328182000 end=-} | Processing | 20
1522328183000 | Processing : Window{start=1522328183000 end=-} | Processing | 15
1522328183000 | Processing : Window{start=1522328183000 end=-} | Processing | 20
1522328184000 | Processing : Window{start=1522328184000 end=-} | Processing | 20
1522328185000 | Processing : Window{start=1522328185000 end=-} | Processing | 15
1522328185000 | Processing : Window{start=1522328185000 end=-} | Processing | 20
1522328186000 | Processing : Window{start=1522328186000 end=-} | Processing | 20
1522328187000 | Processing : Window{start=1522328187000 end=-} | Processing | 15
1522328187000 | Processing : Window{start=1522328187000 end=-} | Processing | 20
1522328188000 | Processing : Window{start=1522328188000 end=-} | Processing | 20
1522328189000 | Processing : Window{start=1522328189000 end=-} | Processing | 15
1522328189000 | Processing : Window{start=1522328189000 end=-} | Processing | 20
1522328190000 | Processing : Window{start=1522328190000 end=-} | Processing | 20
1522328191000 | Processing : Window{start=1522328191000 end=-} | Processing | 15
预期成果: 对于处理状态,我应该每1秒获得20个计数
实际结果: 对于相同的状态,我每1秒间隔获得一个以上的记录,如下所示:
1522328179000 | Processing : Window{start=1522328179000 end=-} | Processing | 5
1522328179000 | Processing : Window{start=1522328179000 end=-} | Processing | 20
请在下面找到我的javascript代码:
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max – min)) + min; //The maximum is exclusive and the minimum is inclusive
}
var orderdate = Date.now();
for (var i = 0; i < 20; i++) {
var data = {
"OrderID": getRandomInt(1, 20000),
"OrderDate": orderdate,
"Status": "Processing",
"ProductID": getRandomInt(1, 10)
}
node.send({payload:data}); // this function asynchronously call kafka-rest api producer.
}
注意:kafka rest api使用默认属性
运行答案 0 :(得分:4)
KSQL使用Kafka Streams运行查询,您描述的行为是聚合结果的预期行为。每次新记录到达时,查询都将执行,并且将发出相应记录的更新结果。您可以通过设置commit.interval.ms
和buffered.records.per.partition
来配置结果的发放频率。
您在聚合查询的输出中看到的结果确实是到目前为止的最新结果。例如
1522328179000 | Processing : Window{start=1522328179000 end=-} | Processing | 5
表示到目前为止计数为5(这是部分结果),当您收到同一组和窗口的更多记录时,计数将会更新,并会发出更新的结果:
1522328179000 | Processing : Window{start=1522328179000 end=-} | Processing | 20
这意味着现在计数更新为20。 如果要获得最新结果,可以在表格中实现结果。这样,表格将始终具有每个组的最新计数。