流计算的触发时间

【TDengine 使用环境】
生产环境 /测试/ Poc/预生产环境

测试环境

【TDengine 版本】

3.3.8.1

【操作系统以及版本】

centos7

【部署方式】容器/非容器部署

容器

【集群节点数】

【集群副本数】

【描述业务影响】

【问题复现路径/shan】做过哪些操作出现的问题

【遇到的问题:问题现象及影响】

超级表如下

流语句如下:

create stream if not exists lute_iot_device.t31_daily_stats_stream_min_max_avg interval(1d) sliding (1d) from lute_iot_device.product_property_3yhuya partition by tbname stream_options (watermark (5m) | fill_history (1) | max_delay(10m)) into lute_iot_device.t31_daily_stats output_subtable (concat(‘t31_daily_’, lower(tbname))) ( ts, uid composite key, calculate_time, window_end, avg_temperature, max_temperature, min_temperature ) tags ( device_name varchar(64) as replace (tbname, ‘device_property_’, ‘’) ) as select _twstart as ts, uid as uid, cast(_tlocaltime / 1000000 as timestamp) as calculate_time, _twend as window_end, round(avg(temperature), 2) as avg_temperature, max( case when identifier = ‘high_temperature_alarm’ then temperature else null end ) as max_temperature, min( case when identifier = ‘low_temperature_alarm’ then temperature else null end ) as min_temperature from %%tbname where ts >= _twstart and ts <= _twend partition by device_name, uid;

我昨天是有数据的,但是流计算的结果如下:

有2个问题:

1.流计算的开始时间延迟很高但是我已经设置了max_delay时间

2.今天是11月4号为什么会把今天的数据也算出来

【资源配置】

【报错完整截图】

  1. 创建流之后任务的部署会有一定延迟,和max_delay 没有关系
  2. 这是因为 max_delay 的原因,当窗口未关闭的时候,会每过 max_delay 时间触发一次计算。如果不需要您应该去掉 max_delay 设置

这个延迟为什么会这么久,昨天就一点测试数据,是有其他方面的原因吗

初次创建流之后,到流运行会有一些延时,主要是为了整体性能方面的平衡考虑所做的设计,这是一次性的,只是第一次建流会碰到。
事件触发,到结果写入,也会有一定延时,这个是重复性的。
您说的延时指的是那一部分,延时的时间是多少?

我的流是一天一次的,按道理来说应该是早上8点左右就可以触发了,上面那个截图的的calculate_time到了9点才开始计算数据。

两个可能:

  1. 触发是根据写入数据的时间戳判断的,实际写入的时间比数据时间有延迟,比如,9点钟写了8点多的数据(东八区),当天最后一次触发就会在九点钟而不是八点钟
  2. 出现异常,8点到9点流有错误,重新补偿计算,计算的时间在9点。
    您检查一下,大概率是第一种情形

数据是昨天下午我让测试测得我看到了数据写进去然后就没测试了,数据肯定不会延迟这么高,这个是不是因为第二天9点写入了记录才会导致上一天的窗口进行触发

还有一种情形,写入第一条 4号的数据的时候,会触发3号数据的关窗计算;

看起来是这样的第二天的数据写入了才导致了第一天的数据窗口关闭然后进行计算,有什么参数是可以强制进行计算的吗 max_delay参数看起来不生效

max_delay 的定义是窗口未关闭的时候就能进行计算,并不是窗口未关闭前就结束计算。
目前 interval 的窗口结束只有在收到下一个窗口的数据时,才可以认为上一个窗口已结束,否则没办法确定没有后续数据。
如果就想在固定时间触发,也许您应该使用 period 定时触发

好的 谢谢大佬的解答。