本文主要是介绍Flink源码阅读:流中的四种值类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在DataStream中流动有的元素有四种类型,分别是Watermark,StreamStatus,StreamRecord和LatencyMarker.它们都是StreamElement的子类.下面分别介绍一下,对以后理解其他内容会有帮助.
继承关系图:
下面是对注释的翻译以及自己的理解
Watermark
指示元素timestamp小等于watermark的值都已经到了,算子通过调用org.apache.flink.streaming.api.operators.Output.emitWatermark(Watermark),将watermark发送到下游.
watermark在时间窗口上非常有用,窗口根据watermark触发,另外watermark可以用来处理迟到数据.
当source关闭的 时候会发送一个timestamp为Long.MAX_VALUE的watermark,当算子收到这个MAX_VALUE的watermark的时候就会知道不会再有输入了.
StreamStatus
StreamStatus可以代表两种状态,一种是IDLE,一种是ACTIVE.
以StreamStatus的角度会将任务分成SourceTask和StreamTask,StreamStatus从SourceTask生成并发出用来通知StreamTask是否会继续收到数据元素或者watermark.
当SourceTask读取不到输入数据的时候它会通过发送一个IDEL状态表示暂时停止提交数据元素和watermark,一旦SourceTask发现可以读取到数据的时候他会发送一个ACTIVE状态
当StreamTask的所有SourceTask 全部 处于IDEL状态的时候认为这个StreamTask处于IDEL状态
由于SourceTask保证在IDEL状态和ACTIVE状态之间不会发生数据元素,所以StreamTask可以在不需要检查当前的状态的情况下安全的处理和传播收到数据元素.但是由于拓扑的任何地方都可以产生watermark,所以当前StreamTask在发送watermark之前必须检查当前的状态,如果当前的状态是IDEL,则watermark会被阻塞.
对于有多个输入的StreamTask,输入流的watermark暂时处于IDEL状态或刚恢复到ACTIVE状态但是它的watermark落后于所有operator中最小的watermark,它的watermark不应该用来绝定是否提高watermark,也不能通过operator链向下传播.(注释的句子写的太长没读太懂)
注意:当source通知下游SourceTask永久关闭的时候会发送一个前面说的值为Watermark.MAX_WATERMARK的watermark而不是一个IDEL状态.
StreamRecord
DataStream中的数据的一个包装,在你自己写的代码中实际可能是POJO,Tuple,Row或你自定义的值类型,一般情况会用Flink自带的Row类型,StreamRecord就是将你用的数据类型包装一下然后带了一个可选的关联的时间戳.
LatencyMarker
一种特殊的类型,它携带一个从source被创造出来的时间戳,vertexId和source的subtask index.
在sink中,这个marker可以用来近似的估计一条数据经过整个dataflow的时间.
这篇关于Flink源码阅读:流中的四种值类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!