ProcessFunction详解
前言
-
我们之前学习的转换算子是无法访问事件的时间戳信息和水位线信息的。而这在一些应用场景下,极为重要。例如
MapFunction这样的map转换算子就无法访问时间戳或者当前事件的事件时间。 -
基于此,
DataStream API提供了一系列的Low-Level转换算子。可以访问时间戳、watermark 以及注册定时事件。还可以输出特定的一些事件,例如超时事件等。Process Function用来构建事件驱动的应用以及实现自定义的业务逻辑(使用之前的window 函数和转换算子无法实现)。例如,Flink SQL就是使用Process Function实现的。 -
Flink提供了八个Process Function1️⃣:
ProcessFunction2️⃣:
KeyedProcessFunction3️⃣:
CoProcessFunction4️⃣:
ProcessJoinFunction5️⃣:
BroadcastProcessFunction6️⃣:
KeyedBroadcastProcessFunction7️⃣:
ProcessWindowFunction8️⃣:
ProcessAllWindowFunction
KeyedProcessFunction
函数的组成
-
这里我们重点介绍
KeyedProcessFunction。 -
KeyedProcessFunction用来操作KeyedStream。KeyedProcessFunction会处理流的每一个元素,输出为 0 个、1 个或者多个元素。所有的Process Function都继承自RichFunction 接口,所以都有open()、close()和getRuntimeContext()等方法。而KeyedProcessFunction<K, I, O>(三个参数分别是key的数据类型、输入和输出的数据类型)还额外提供了两个方法:1️⃣:
processElement(I value, Context ctx, Collector<O> out), 流中的每一个元素都会调用这个方法,调用结果将会放在Collector数据类型中输出。Context可以访问元素的时间戳,元素的key,以及TimerService时间服务。Context还可以将结果输出到别的流(side outputs)。2️⃣:
onTimer(long timestamp,OnTimerContext ctx,Collector<O> out)是一个回调函数。当之前注册的定时器触发时调用。参数timestamp为定时器所设定的触发的时间戳。Collector为输出结果的集合。OnTimerContext和processElement的Context参数一样,提供了上下文的一些信息,例如定时器触发的时间信息(事件时间或者处理时间)。
定时器
-
Context和OnTimerContext所持有的TimerService对象拥有以下方法:1️⃣:
long currentProcessingTime()返回当前处理时间2️⃣:
long currentWatermark()返回当前 watermark 的时间戳3️⃣:
void registerProcessingTimeTimer(long timestamp)会注册当前 key 的processing time 的定时器。当processing time到达定时时间时,触发 timer。4️⃣:
void registerEventTimeTimer(long timestamp)会注册当前key的event time定时器。当水位线大于等于定时器注册的时间时,触发定时器执行回调函数。5️⃣:
void deleteProcessingTimeTimer(long timestamp)删除之前注册处理时间定时器。如果没有这个时间戳的定时器,则不执行。6️⃣:
void deleteEventTimeTimer(long timestamp)删除之前注册的事件时间定时器,如果没有此时间戳的定时器,则不执行。 -
当定时器
timer触发时,会执行回调函数onTimer()。注意定时器timer只能在keyed streams上面使用。
测试
- 需求:监控温度传感器的温度值,如果温度值在 10 秒钟之内(processing time)连续上升,则报警。
自定义一个JavaBean类
package beans;
/**
* 传感器温度读数的数据类型
*/
public class SenSorReading {
private String id;
private Long timeStamp;
private Double temperature;
public SenSorReading() {
}
public SenSorReading(String id, Long timeStamp, Double temperature) {
this.id = id;
this.timeStamp = timeStamp;
this.temperature = temperature;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Long getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(Long timeStamp) {
this.timeStamp = timeStamp;
}
public Double getTemperature() {
return temperature;
}
public void setTemperature(Double temperature) {
this.temperature = temperature;
}
@Override
public String toString()

最低0.47元/天 解锁文章
1454

被折叠的 条评论
为什么被折叠?



