基本概念

流式计算针对的是无限的(unbounded)数据流,之所以能实时地计算出结果,其本质是用窗口去把无限的数据流,切分成一个个有限的数据集,并且针对这每个有限的数据集,进行计算,并且输出结果。

关于如何切分无限的数据流,涉及到如下几个关键的概念。

窗口

窗口有多种类型,目前支持如下4种窗口:

固定窗口

指定固定的时间间隔,将数据流切割成相邻但不重叠的窗口。比如5分钟的窗口可以将一个小时的数据切分成12个窗口,一个消息仅且仅属于一个窗口。SQL表达如: Tumble(rowtime, INTERVAL '5' MINUTE。

滑动窗口

指定窗口大小以及一个滑动步长,将消息切分到可能重叠的一个或多个窗口。比如窗口大小为5分钟,滑动步长为1分钟,则意味着,每1分钟处理过去5分钟的数据。即每个消息被分配到5个窗口。SQL表达如:Hop(rowtime, INTERVAL '1' MINUTE, INTERVAL '5' MINUTE)。

会话窗口

指定一个时间间隔,将时间相距小于该间隔的消息划分成一个窗口,如果相邻2个消息的时间差,大于该间隔,则将后者分配到一个新的窗口。SQL表达如:SESSION(rowtime, INTERVAL '30' MINUTE)。

OVER窗口

每个消息都对应一个窗口,窗口里面的消息是数据流上相邻的消息集合。每个消息都触发一次窗口的计算。例如,前面3个元素的平均温度;前面5秒钟内设备的最低温度,等。

时间

百度智能云流式计算支持EVENTTIME和PROCESSTIME两种。系统自动为每个数据源增加一个名为rowtime的字段,该字段的含义根据任务时间类型不同而不同。

EVENTTIME

根据用户是否指定了时间戳字段与否分为两种情况:

1)指定了消息中的时间戳字段,则用每个消息自带的时间戳作为时间,此方式计算结果最准确,此时rowtime取值时间戳字段;

2)没有指定时间戳字段,则用户消息到达百度智能云的时间作为时间戳,此时rowtime取值用户消息到达百度智能云(Kafka服务器,物接入服务器)的时间。特别说明,对于Kafka数据源,如果发送消息的Kafka client的版本为0.9.x或者以下,则没有时间戳。

PROCESSTIME

即以处理节点当前的CPU时间作为时间戳,此方式处理效率最高,此时rowtime取值处理节点当前CPU时间。

Watermark

Watermark是一个以秒为单位的时间,是为了一定程度的容忍消息的乱序到达问题。

消息自带的时间戳,通常为事件发生的时间。消息到达流式计算中间需要经过传输,或者还经过缓存,那么消息到达流式计算的顺序可能与发生的顺序不一致。比如10:01:30发生的消息比10:01:25发生的消息早到达,那么这里就存在乱序的问题,乱序程度为5秒。Watermark就是为了容忍一定程度的乱序,在一个窗口结束的时间(记为window_end),再等待window_end + watermark的消息到来,才将窗口关闭,这样那些事件时间小于window_end,但是到达时间介于window_end和window_end + watermark之间的消息能够被正确地统计到该窗口中。

watermark通常这样确定:当时间戳为ts的消息到达时,那么可以断定时间戳为ts-n的消息肯定已经到达了,那么n就可以设置为watermark。但是,这个watermark的生效有一个周期(毫秒级),而不是每个消息到来都会更新,因此,在调试期间,watermark往往在所有的消息都处理完后才生效。

Watermark设置得越大,能容忍消息乱序的程度越高,但是,结果输出越晚。

并发度

并发度为每个算子运行实例的个数。对于数据量非常大的数据源,增加并发度,能提高处理速度。一个并发度通常可以处理约10w msg/s。