物联网 - KSQL翻滚问题

时间:2018-03-30 14:10:44

标签: apache-kafka iot ksql

我们的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使用默认属性

运行

1 个答案:

答案 0 :(得分:4)

KSQL使用Kafka Streams运行查询,您描述的行为是聚合结果的预期行为。每次新记录到达时,查询都将执行,并且将发出相应记录的更新结果。您可以通过设置commit.interval.msbuffered.records.per.partition来配置结果的发放频率。 您在聚合查询的输出中看到的结果确实是到目前为止的最新结果。例如

1522328179000 | Processing : Window{start=1522328179000 end=-} | Processing | 5

表示到目前为止计数为5(这是部分结果),当您收到同一组和窗口的更多记录时,计数将会更新,并会发出更新的结果:

1522328179000 | Processing : Window{start=1522328179000 end=-} | Processing | 20

这意味着现在计数更新为20。 如果要获得最新结果,可以在表格中实现结果。这样,表格将始终具有每个组的最新计数。