Flink中流动的四种元素

栏目: IT技术 · 发布时间: 4年前

内容简介:—END—

Flink中流动的四种元素

点击箭头处 “蓝色字” ,关注我们哦!!

在Flink DataStream中流动着不同的元素,统称为StreamElement,StreamElement可以是StreamRecord、Watermark、StreamStatus、LatencyMarker中任何一种类型, S treamElement 是一个抽象类,其他四种类型继承 S treamElement

StreamElement

public abstract class StreamElement {

//判断是否是Watermark

public final boolean isWatermark() {

return getClass() == Watermark.class;

}

//判断是否为StreamStatus

public final boolean isStreamStatus() {

return getClass() == StreamStatus.class;

}

//判断是否为StreamRecord

public final boolean isRecord() {

return getClass() == StreamRecord.class;

}


//判断是否为LatencyMarker

public final boolean isLatencyMarker() {

return getClass() == LatencyMarker.class;

}

//转换为StreamRecord

public final <E> StreamRecord<E> asRecord() {

return (StreamRecord<E>) this;

}


//转换为Watermark

public final Watermark asWatermark() {

return (Watermark) this;

}

//转换为StreamStatus

public final StreamStatus asStreamStatus() {

return (StreamStatus) this;

}


//转换为LatencyMarker

public final LatencyMarker asLatencyMarker() {

return (LatencyMarker) this;

}

}

StreamRecord

StreamRecord包含value、timestamp、hasTimestamp三个属性,其中value 可以 理解为我们处理的业务数据, timestamp 表示数据的时间,也就是eventTime, hasTimestamp 标识是否具有timestamp。

public final class StreamRecord<T> extends StreamElement {


/** The actual value held by this record. */

private T value;


/** The timestamp of the record. */

private long timestamp;


/** Flag whether the timestamp is actually set. */

private boolean hasTimestamp;

...}

Watermark

Watermark在eventTime语义中产生的一类数据类型,内部包含一个时间戳timestamp,标识当前数据的时间进度。

public final class Watermark extends StreamElement {


/** The watermark that signifies end-of-event-time. */

public static final Watermark MAX_WATERMARK = new Watermark(Long.MAX_VALUE);


// ------------------------------------------------------------------------


/** The timestamp of the watermark in milliseconds. */

private final long timestamp;


/**

* Creates a new watermark with the given timestamp in milliseconds.

*/

public Watermark(long timestamp) {

this.timestamp = timestamp;

}

.../

StreamStatus

先了解一下StreamStatus结构:

public final class StreamStatus extends StreamElement {


public static final int IDLE_STATUS = -1; //闲置状态

public static final int ACTIVE_STATUS = 0; //激活状态


public static final StreamStatus IDLE = new StreamStatus(IDLE_STATUS);

public static final StreamStatus ACTIVE = new StreamStatus(ACTIVE_STATUS);


public final int status;


假设一个任务开启了两个并行度读取kafka数据的任务,每一个并行度都被分配了一个topic的partition,下游是一个事件时间窗口操作,那么窗口的触发与上游两个输入都有关系,如果现在出现了topic的一个partition没有数据了,那么就会导致窗口的一个输入没有数据,那么其watermark也就不会改变,根据watermark对齐机制可知,在window端处理的watermark取最小值,也就是其watermark不会改变,导致窗口也就永远无法触发,StreamStatus就是为了解决这种机制而产生的。

StreamS tatus 有ACTIVE、IDEL两种状态, AC TIVE 表示激活状态, IDEL 表示闲置状态,如果一个没有数据产生或者是在一个指定的时间内没有数据产生那么就会发送 IDEL 状态,通常是在Source端发送的,例如kafka线程没有分配到partition就会发送 ,如下

//FlinkKafkaConsumerBase run方法中

if (subscribedPartitionsToStartOffsets.isEmpty()) {

sourceContext.markAsTemporarilyIdle();

}

那么在发送了IDLE_STATUS后,下游在做watermark对齐就不会考虑该输入的watermark,能够正常处理watermark完成对齐机制进而触发相应的窗口计算。

如果过了一段时间之后该stream又产生数据了,表示被激活了就会发送ACTIVE_STATUS,在下游参与对齐机制,如果这个stream的时间戳与另外一个stream的时间戳相差很大,会以该 strea m 产生的数据时间作为参与watermark取值机制吗?当然不会,会拿 strea m 产生的时间与当前的watermakr进行比较,必须大于等于当前的watermark才能参与对齐机制。

//StatusWatermarkValve inputStreamStatus方法中

if (channelStatuses[channelIndex].watermark >= lastOutputWatermark) {

channelStatuses[channelIndex].isWatermarkAligned = true;

}

LatencyMarker

LatencyMarker表示的是延时标记,其携带了一个时间戳,由source端周期性发出,用于统计由source端到下游operator所需耗时,通常用于延时测试使用,该标记在默认情况下是关闭的,可通过配置metrics.latency.interval开启,表示产生 LatencyMarker 的周期。

public final class LatencyMarker extends StreamElement {

/** The time the latency mark is denoting. */

private final long markedTime;


private final OperatorID operatorId;


private final int subtaskIndex;

.....

—END—

Flink中流动的四种元素

关注回复 Flink

获取更多系列

原创不易,好看,就点个"在看"


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

如何变得有思想

如何变得有思想

阮一峰 / 人民邮电出版社 / 2014-12-2 / 49.00元

本书为阮一峰博客选集,囊括了作者对各种问题的思考,围绕的主题是试图理解这个世界。本书内容非常广泛,涉及观点、文学、历史、科技、影视等方面。作者在书中对具有深刻意义的文字进行摘录,并且在思索后提出自己独特的观点。书后附有阮一峰诗集。 本书适合喜欢独立思考、热爱读书的读者,对于广大读者具有一定的启发作用。一起来看看 《如何变得有思想》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

MD5 加密
MD5 加密

MD5 加密工具