Flink之状态编程

本文详细介绍了Flink的状态编程,包括无状态计算和有状态计算的区别,以及有状态计算的需求场景,如去重、检测和聚合等。重点讲解了Flink的Failover机制,如何设置故障转移,并通过开启Checkpoint实现状态持久化。Flink的状态分为Managed State和Raw State,使用时需要实现CheckpointedFunction接口。
摘要由CSDN通过智能技术生成

状态编程是Flink最出色的功能没有之一

一、什么是状态?

在流式计算中有些操作一次处理一个独立的事件(比如解析一个事件), 有些操作却需要记住多个事件的信息(比如窗口操作).

那些需要记住多个事件信息的操作就是有状态的.

流式计算分为无状态计算和有状态计算两种情况

无状态计算:无状态的计算观察每个独立事件,并根据最后一个事件输出结果。例如,流处理应用程序从传感器接收水位数据,并在水位超过指定高度时发出警告

有状态计算:有状态的计算则会基于多个事件输出结果。以下是一些例子。例如,计算过去一小时的平均水位,就是有状态的计算。所有用于复杂事件处理的状态机。

二、需要状态的场景:

去重

数据流中的数据有重复,我们想对重复数据去重,需要记录哪些数据已经流入过应用,当新数据流入时,根据已流入过的数据来判断去重。

检测

检查输入流是否符合某个特定的模式,需要将之前流入的元素以状态的形式缓存下来。比如,判断一个温度传感器数据流中的温度是否在持续上升。

聚合

对一个时间窗口内的数据进行聚合分析,分析一个小时内水位的情况

更新机器学习模型

在线机器学习场景下,需要根据新流入数据不断更新机器学习的模型参数。

三、Flink的Failover(故障转移机制)

  Job 的重启:每次运行,默认都是新的Job,没法实现
  Task的重启:
            有个算子在某个Task,这个Task抛出了异常,Flink可以采取failover(故障转移机制)
            重新找插槽,重新运行Task  可以实现,但不能保存原有状态

注意:Flink默认开启了故障时不重启策略,我们使用故障转移机制时需要将其关闭,不然会出现如下报错

Recovery is suppressed by NoRestartBackoffTimeStrategy

设置故障转移机制

//设置故障转移,第一个参数最多重试重启次数,第二个参数两次重启次数的时间间隔 
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(3,2000));

代码实现

package net.cyan.state;

import net.cyan.POJO.WaterSensor;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.sink.SinkFunction;
import org.apache.flink.streaming.connectors.redis.RedisSink;

import java.util.ArrayList;
import java.util.List;


/**

把收到的每个字符串都存到一个list集合
  并且希望达到当程序挂掉时,状态可以自动恢复

  Job 的重启:每次运行,默认都是新的Job,没法实现
  Task的重启:
            有个算子在某个Task,这个Task抛出了异常,Flink可以采取failover(故障转移机制)
            重新找插槽,重新运行Task  可以实现
 */
public class Demo1_test {
   
    public static void main(String[] args) {
   
        //创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值