Flink 状态

Flink-状态编程和容错机制 | 算子状态和键控状态的介绍及数据结构 | 状态的定义及使用 GitHub代码 https://github.com/SmallScorpion/flink-tutorial.git 状态编程和容错机制 流式计算分为无状态和有状态两种情况。无状态的计算观察每个独立事件,并根据最后一个事件输出结果。例如,流处理应用程序从传感器接收温度读数,并在温度超过90度时发出警告。有状态的计算则会基于多个事件输出结果。以下是一些例子。 所有类型的窗口。例如,计算过去一小时的平均温度,就是有状态的计算。 所有用于复杂事件处理的状态机。例如,若在一分钟内收到两个相差20度以上的温度读 阅读详情

Flink 状态

相关博客:

Flink_Flink中的状态

Flink状态管理详解:Keyed State和Operator List State深度解析

一、状态概述

在这里插入图片描述

  • 由一个任务维护,并且用来计算某个结果的所有数据,都属于这个任务的状态

  • 可以认为任务状态就是一个本地变量,可以被任务的业务逻辑访问

  • Flink 会进行状态管理,包括状态一致性、故障处理以及高效存储和访问,以便于开发人员可以专注于应用程序的逻辑

  • 在Flink中,状态始终与特定算子相关联

  • 为了使运行时的Flink了解算子的状态,算子需要预先注册其状态

有两种类型的状态:

  • 算子状态(Operator State)

    算子状态的作用范围为算子任务(也就不能跨任务访问)

  • 键控状态(Keyed State)

    根据输入数据流中定义的键来维护和访问的

二、算子状态Operator State

在这里插入图片描述

  • 算子状态的作用范围限定为算子任务,同一并行任务所处理的所有数据都可以访问到相同的状态。
  • 状态对于同一任务而言是共享的。(不能跨slot)
  • 状态算子不能由相同或不同算子的另一个任务访问。

算子状态数据结构

  • 列表状态(List state)

    将状态表示为一组数据的列表

  • 联合列表状态(Union list state)

    也将状态表示未数据的列表。它与常规列表状态的区别在于,在发生故障时,或者从保存点(savepoint)启动应用程序时如何恢复

  • 广播状态(Broadcast state)

    如果一个算子有多项任务,而它的每项任务状态又都相同,那么这种特殊情况最适合应用广播状态

测试代码

实际使用中一般使用键控状态,算子状态用的比较少。

需要实现ListCheckpointed这个接口

package com.root.state;

import com.root.SensorReading;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.state.ListState;
import org.apache.flink.streaming.api.checkpoint.ListCheckpointed;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import java.util.Collections;
import java.util.List;

/**
 * @author Kewei
 * @Date 2022/3/6 20:23
 */

public class StateTest3_OperatorState {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        DataStreamSource<String> inputStream = env.socketTextStream("localhost", 7777);

        SingleOutputStreamOperator<SensorReading> dataStream = inputStream.map(line -> {
            String[] fields = line.split(",");
            return new SensorReading(fields[0], new Long(fields[1]), new Double(fields[2]));
        });

        SingleOutputStreamOperator<Integer> resultStream = dataStream.map(new MyCountMapper());

        resultStream.print();

        env.execute();
    }

    public static class MyCountMapper implements MapFunction<SensorReading, Integer>, ListCheckpointed<Integer>{
        private Integer count = 0;

        @Override
        public Integer map(SensorReading sensorReading) throws Exception {
            count++;
            return count;
        }

        @Override
        public List<Integer> snapshotState(long l, long l1) throws Exception {
            return Collections.singletonList(count);
        }

        @Override
        public void restoreState(List<Integer> list) throws Exception {
            for (Integer integer : list) {
                count += integer;
            }
        }
    }
}

三、键控状态 Keyed State

在这里插入图片描述

  • 键控状态是根据输入数据中定义的键(key)来进行维护和访问的。
  • Flink为每一个key维护一个状态实例,并将具有相同键的所有数据,都分区到同一个算子任务中,这个任务会维护和处理这个key对应的状态。
  • 当任务处理一条数据时,会自动将状态的访问范围限定为当前数据的key。

键控状态的数据结构

  • 值状态(value state)
    • 将状态表示为单个的值
  • 列表状态(List state)
    • 将状态表示为一组数据的列表
  • 映射状态(Map state)
    • 将状态表示为一组key-value对
  • 聚合状态(Reducing state & Aggregating State)
    • 将状态表示为一个用于聚合操作的列表,(对象)

测试代码

在这里插入图片描述

注:声明一个键控状态,一般在算子的open()中声明,因为运行时才能获取上下文信息。

需要继承富函数RichFunction

package com.root.state;

import akka.stream.impl.ReducerState;
import com.root.SensorReading;
import org.apache.flink.api.common.functions.RichMapFunction;
import org.apache.flink.api.common.state.*;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

/**
 * @author Kewei
 * @Date 2022/3/6 20:38
 */

public class StateTest4_KeyedState {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        DataStreamSource<String> inputStream = env.socketTextStream("localhost", 7777);

        SingleOutputStreamOperator<SensorReading> dataStream = inputStream.map(line -> {
            String[] fields = line.split(",");
            return new SensorReading(fields[0], new Long(fields[1]), new Double(fields[2]));
        });

        SingleOutputStreamOperator<Integer> resultStream = dataStream
                .keyBy("id")  // 键控需要先分组
                .map(new MyMapper());

        resultStream.print();

        env.execute();

    }

    public static class MyMapper extends RichMapFunction<SensorReading, Integer>{

        // Exception in thread "main" java.lang.IllegalStateException: The runtime context has not been initialized.
        // ValueState<Integer> valueState = getRuntimeContext().getState(new ValueStateDescriptor<Integer>("my-int", Integer.class));
        
        // 声明 值状态
        private ValueState<Integer> valueState;
        
        // 声明 列表状态
        private ListState<String> listState;
        
        // 声明 map(key-value)状态
        private MapState<String,Double> mapState;
        
        // 声明聚合状态
        private ReducingState<SensorReading> readingReducingState;

        @Override
        public void open(Configuration par) throws Exception {
            // 在open方法中初始化状态
            valueState = getRuntimeContext().getState(new ValueStateDescriptor<Integer>("value",Integer.class));
            listState = getRuntimeContext().getListState(new ListStateDescriptor<String>("list",String.class));

            mapState = getRuntimeContext().getMapState(new MapStateDescriptor<String, Double>("map",String.class,Double.class));
//            readingReducingState = getRuntimeContext().getReducingState(new ReducingStateDescriptor<SensorReading>("reduce",reduce函数,SensorReading.class))
        }

        @Override
        public Integer map(SensorReading value) throws Exception {

            // list state 输出,以及添加值
            for (String s : listState.get()) {
                System.out.println(s);
            }
            listState.add("hello");

            // map state 输出,添加,删除
            mapState.get("1");
            mapState.put("2",2.1);
            mapState.remove("2");

            //reducing state 添加值
//            readingReducingState.add(value);

            // value state 获取值,更新值
            Integer count = valueState.value();

            count = count==null?0:count;
            ++count;
            valueState.update(count);
            return count;
        }
    }
}

假设做一个温度警报,如果一个传感器前后温度差超过10摄氏度就报警。这里使用键控状态keyed State + FlatMap来实现。

package com.root.state;

import com.root.SensorReading;
import org.apache.flink.api.common.functions.RichFlatMapFunction;
import org.apache.flink.api.common.state.ValueState;
import org.apache.flink.api.common.state.ValueStateDescriptor;
import org.apache.flink.api.java.tuple.Tuple3;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

/**
 * @author Kewei
 * @Date 2022/3/6 21:02
 */

public class StateTest5_KeyedSateApplicationCase {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        DataStreamSource<String> inputStream = env.socketTextStream("localhost", 7777);
        SingleOutputStreamOperator<SensorReading> dataStream = inputStream.map(line -> {
            String[] fields = line.split(",");
            return new SensorReading(fields[0], new Long(fields[1]), new Double(fields[2]));
        });

        SingleOutputStreamOperator<Tuple3<String, Double, Double>> resultStream = dataStream
                .keyBy(SensorReading::getId)
                .flatMap(new MyFlatMapper(10.0));

        resultStream.print();
        env.execute();
    }

    public static class MyFlatMapper extends RichFlatMapFunction<SensorReading, Tuple3<String,Double,Double>>{
        // 定义一个温度差预警值
        private final Double th;

        public MyFlatMapper(Double th){
            this.th = th;
        }
        
        // 定义一个值状态,保存上一次的温度
        ValueState<Double> lastTemp;

        @Override
        public void open(Configuration parameters) throws Exception {
            // 获取上一次保存的状态--上一次的温度
            lastTemp = getRuntimeContext().getState(new ValueStateDescriptor<Double>("last",Double.class));
        }

        @Override
        public void close() throws Exception {
            // 释放资源
            lastTemp.clear();
        }

        @Override
        public void flatMap(SensorReading value, Collector<Tuple3<String, Double, Double>> out) throws Exception {
            Double lastTemper = lastTemp.value();
            Double corTemp = value.getTemperature();

            // 判断lastTemper是否为空,之后再判断差值是否大于阈值
            if (lastTemper!=null) {
                if (Math.abs(corTemp - lastTemper) > th) {
                    out.collect(new Tuple3<>(value.getId(),corTemp,lastTemper));
                }
            }

            // 更新保存上一次温度
            lastTemp.update(corTemp);
        }
    }
}

四、状态后端

4.1 概述

  • 每传入一条数据,有状态的算子任务都会读取和更新状态。
  • 由于有效的状态访问对于处理数据的低延迟至关重要,因此每个并行任务都会在本地维护其状态,以确保快速的状态访问。
  • 状态的存储、访问以及维护,由一个可插入的组件决定,这个组件就叫做状态后端( state backend)
  • 状态后端主要负责两件事:本地状态管理,以及将检查点(checkPoint)状态写入远程存储

4.2 状态后端类型

  • MemoryStateBackend
    • 内存级的状态后端,会将键控状态作为内存中的对象进行管理,将它们存储在TaskManager的JVM堆上,而将checkpoint存储在JobManager的内存中
    • 特点:快速、低延迟,但不稳定
  • FsStateBackend(默认)
    • 将checkpoint存到远程的持久化文件系统(FileSystem)上,而对于本地状态,跟MemoryStateBackend一样,也会存在TaskManager的JVM堆上
    • 同时拥有内存级的本地访问速度,和更好的容错保证
  • RocksDBStateBackend
    • 将所有状态序列化后,存入本地的RocksDB中存储
详解 Flink 的状态管理 无状态的流处理:根据每一次当前输入的数据直接转换输出结果的过程,在处理中只需要观察每个输入的独立事件。例如, 将一个字符串类型的数据拆分开作为元组输出或将每个输入的数值加 1 后输出。Flink 中的基本转换算子 (map、filter、flatMap 等) 在计算时不依赖其他数据,所以都属于无状态的算子。有状态的流处理:根据每一次当前输入的数据和一些其他已处理的数据共同转换输出结果的过程,这些其他已处理的数据就称之为状态(state),状态由任务维护,可以被任务的业务逻辑访问。 阅读详情

相关推荐

Flink 大状态存储 & 状态TTL

什么是Flink大状态存储? 举个栗子。现有用户访问流数据,需统计每个用户PV,用户量级为3亿。如何计算? 假定每个用户ID为50字节。那么3亿用户ID的存储需要:50 b * 3 亿 ≈ 13 G ,那么可以直接存在job内存中,如果担心job重启,内存数据丢失,可以放在redis中,或者Aerospike(一种用磁盘的kv存储)。 那如果状态再大一些呢?再举个栗子:某广告场景下,点击数据需要根据请求ID 到请求日志中取相关维度信息。假设请求发生后,24小时之内,都有可能发生点击,那么就需要将请求.

窦小雨的小点子 6266

Flink(1.11)高阶编程二——状态编程

文章目录6.4 状态编程和容错机制6.4.1 概述6.4.2 有状态的算子6.4.2.1 算子状态(1)**原理 ** (2)三种基本数据结构①列表状态( List state)②联合列表状态(Union list state)③广播状态(Broadcast state)**广播状态代码**:6.4.2.2 键控状态(1)**原理 ** (2)支持的类型代码实现 :①值的类型②列表类型③K-V类型④ReducingState⑤AggregatingState**注意的点**

平平无奇小码农~ 696

Flink状态之 ListState 用法

1.flink的基本状态 Flink有两种基本的状态:算子状态(Operator State)和键控状态(Keyed State),他们的主要区别就是作用范围不一样,算子状态的作用范围就是限定为算子任务(也就是当前一个分区执行的时候,所有数据来了都能访问到状态)。键控状态中并不是当前分区所有的数据都能访问所有的状态,而是按照keyby之后的key做划分,当前key只能访问自己的状态。 1.1 Operator State算子状态 顾名思义,状态是和算子进行绑定的,一个算子的状态不能被其他算子所访问到。状态由

启迪思维,精进技术 3864

Flink 有状态的算子和应用程序

流式计算分为无状态和有状态两种情况。无状态的计算观察每个独立事件,并根据最后一个事件输出结果。例如,流处理应用程序从传感器接收水位数据,并在水位超过指定高度时发出警告。有状态的计算则会基于多个事件输出结果。以下是一些例子。 所有类型的窗口。例如,计算过去一小时的平均水位,就是有状态的计算。 所有用于复杂事件处理的状态机。例如,若在一分钟内收到两个相差20cm以上的水位差读数,则发出警告...

全网同名,欢迎关注。 2521

flink rocksdb状态说明

1).关于rocksdb数量

努力工作学习的程序员 1634

AD | Altium Designer(原理图设计、电路仿真、PCB绘图)汉化版

Altium Designer(原理图设计、电路仿真、PCB绘图)

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 4162

Flink DataStream的(任务、算子链和资源组)、ProcessFunction、迭代运算

目录1. 任务、算子链和资源组2. ProcessFunction3. 迭代运算3.1 iterate3.2 iterateWithTermination3.3 iterateDelta3.4 iterate(DataStream) 1. 任务、算子链和资源组 Task Slot相当于线程 Task Slot的数量等于最大parallelism 可以通过-p参数进行指定Task Slot的数量 自定义算子链接关系 package devBase import org.apache.flink.str

Bulut0907 1323

S7-200SMART系列全套接线说明

SMART200接线方法,输入,输出,模拟量,面板,扩展糟等,并且详细说明接线原理。

文都龙哥 1万+

聊聊flink的RichParallelSourceFunction

序 本文主要研究一下flink的RichParallelSourceFunction RichParallelSourceFunction /** * Base class for implementing a parallel data source. Upon execution, the runtime will * execu...

weixin_34318272的博客 1368

看完让你的RSA提升一个台阶 [GKCTF 2021]RRRRsa

我是,今天我给大家分享一个关于RSA的题目,带大家领略的魅力。今天开始前,我们先学习一下。

m0_62102520的博客 848

基于STM32的Modbus TCP多主站数据监测

Modbus TCP通信协议在STM32上实现,STM32作为服务器采集内部传感器数据,并通过ADC进行转换,存入寄存器。两个PC机作为客户端访问服务器,服务器通过Socket通信实现监听连接,将数据发送给客户端。

hyp12347的博客 4291

Flink 的状态

1.前言 ⭐ 状态是什么东西?有了状态能做什么? ⭐ 为什么离线计算中不提状态,实时计算老是提到状态这个概念?状态到底在实时计算中解决了什么问题? ⭐ 有了状态、为什么又出现了状态管理的概念? ⭐ 怎么学习 Flink 中的状态、状态管理相关的概念呢? ⭐ Flink 中状态的分类? ⭐ Flink 中状态的使用方式? ⭐ Flink 状态后端的分类及使用建议? ⭐ Flink 中状态的能力扩展 - TTL? ⭐ Flin

m0_61607827的博客 4846

生态学家都在用的MixSIAR:用R语言搞定稳定同位素混合模型(从数据整理到结果解读)

本文详细介绍了生态学家常用的MixSIAR工具,通过R语言实现稳定同位素混合模型分析,从数据整理到结果解读全流程。文章涵盖环境准备、模型构建、参数设置、运行诊断及可视化等关键步骤,帮助研究者科学分析河口鱼类食物来源,适用于生态学研究和湿地保护政策制定。

weixin_28683065的博客 437

flink 状态

使用Flink的Stateful Functions API(如KeyedProcessFunction、ProcessFunction等)来定义和访问状态。通过getRuntimeContext().getState(…)或特定的状态描述符(如ValueStateDescriptor)来获取状态。Broadcast State用于保持所有子任务状态相同,确保当数据被广播到所有下游并行任务时,这些任务可以访问相同的状态数据。在这些任务中广播状态用于保持所有子任务状态相同。

王小工小工历程 1676

手把手教你学GPU的KMD专栏--3.1 设备初始化流程深度解析

本文深入解析了KMD(内核模式驱动)设备初始化流程,这是GPU驱动开发最基础且关键的环节。初始化流程包括6个核心阶段:KMD模块加载、PCIe设备探测匹配、GPU硬件初始化、显存分配映射、中断系统配置和设备注册。每个阶段都有详细步骤解析,涉及关键数据结构和错误处理机制。文章还分析了常见问题(驱动加载失败、显存分配失败、中断配置失败)的解决方案,并指出未来趋势将向动态初始化、安全增强和AI优化方向发展。正确高效的初始化流程是确保GPU被操作系统安全使用的前提,也是后续内存管理、任务调度等功能的基础。

MHD0815的博客 261

6、核函数与再生核希尔伯特空间:原理、应用与实践

本文系统介绍了核函数与再生核希尔伯特空间(RKHS)的理论基础、核心性质及其在机器学习和信号处理中的广泛应用。文章从核方法的优势出发,阐述了其在非线性建模、正则化和算法核化方面的独特价值,并深入探讨了正定核、Mercer定理、表示定理等关键理论。通过构建多种标准核与工程专用核,展示了核函数的设计灵活性。结合支持向量回归(SVR)模型与多个MATLAB示例,详细说明了核方法的实际应用流程与操作技巧。最后,总结了核方法的应用领域、未来发展方向及学习实践建议,为读者提供了一套完整的理论与实践指南。

z2a3b4c5d的博客 142

7、Flink中的状态

Flink中的状态一、Flink中的状态1、算子状态1.2 算子状态数据结构 一、Flink中的状态 由一个任务维护,并且用来计算某个结果的所有数据,都属于这个任务的状态。 可以认为状态就是一个本地变量,可以被任务的业务逻辑访问。 Flink会进行状态管理,包括状态一致性、故障处理以及高效存储和访问,以便开发人员可以专注于应用程序的逻辑。 在Flink中,状态始终与特定算子相关联 为了使运行时的Flink了解算子的状态,算子需要预先注册其状态 总的来说,有两种类型的状态: 算子状态(Operator St

yunweijie_cn的博客 7866

Geogebra中级篇016—矩阵(Matrices)

在GeoGebra中,矩阵是一种强大的工具,广泛应用于线性代数、几何变换和数据处理等领域。通过矩阵,我们可以轻松实现复杂的计算和图形变换,如旋转、平移和缩放等操作。不仅如此,GeoGebra的矩阵功能还支持多种运算,如加法、乘法、求逆等,使得用户能够高效地处理线性方程组和向量空间问题。在本文中,我们将深入探讨GeoGebra中的矩阵功能,详细介绍如何创建矩阵、执行常见的矩阵运算,并通过实例展示这些操作在数学和工程应用中的实际价值。这篇文章将为你提供关于GeoGebra矩阵操作的全面指南。

八荒启-交互动画的博客 2579

Flink之状态之状态获取

1.什么是状态 对于任何一个操作,都可以被看成是一个函数,比如y=f(x),如果对于同一个x的任何一次输入,得到的y都是相同的,则可以认为这个函数是无状态,否则,这个函数就是有状态的。Flink的一大特点就在于对状态的支持。 2.Keyed State和Operator State Keyed State Keyed State正如其名,总是和具体的key相关联,也只能在keyedStre...

weixin_30439067的博客 2060

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Flink 状态计算

Flink 状态计算 一、概述 https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/stream/state/state.html Flink是⼀个基于状态计算的流计算服务。Flink将所有的状态分为两⼤类: keyed state与 operatorstate.所谓的keyed state指的是Flink底层会给每⼀个...

water drop的博客 2166

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Flink状态管理之状态清除StateTtlConfig

1、Flink状态去重场景 在Flink运行的时候,往往是无休止的运行,在整个Flink程序运行的长河中,往往会出现很多状态的出现,那么状态的生命周期,也就是创建、使用和销毁,那么在我们写flink程序过程中,往往不需要关注flink 状态的清理,flink内部就会对我们的状态进行清理,例如我们开一个10分钟的窗口,那么在这十分钟的窗口中,这个状态也就是会发生创建、使用和销毁,那么我这里问大家一个问题?就是窗口结束后,状态会销毁吗。这里有一个场景,也就是说当我们开一个一天的窗口,计算当天的消费人数,那么这

百看不如一RUN 6808

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Flink】状态管理

根据当前的输入可以直接转换得到输出结果,这种鼻子就是无状态算子,如map,flatMap,filter。

lxtx 3432

flink-状态

状态是程序运行数据处理的中间数据或缓存数据。在flink中有状态、状态后端和checkpoint概念,三者之间的关系为:状态为数据,状态后端为状态的管理员,checkpoint是管理员将状态数据进行快照的手段。

天龙八部 2206

Flink 状态和容错

状态是什么:其实状态并不是flink独有的特性,状态在生活中普遍存在和使用,只是近些年在实时任务这些词汇会被频繁提及离线其实也有,比如Remote Shuffle Service,对于整个任务来说,每个 Stage 的结果就是状态,而Remote Shuffle Service 就起到了的作用场景示例:一个消费上游 Kafka,使用 Set去重计算 DAU 的实时任务。kafka。

2719

Flink有状态计算

状态是什么?状态就是数据,准确点说,状态是指 Flink 作业计算时依赖的历史数据或中间数据。如果一个 Flink 作业计算依赖状态,那它就是有状态计算的作业,反之就是无状态计算的作业。举个例子,服务端应用为了方便扩缩容,一般会设计成无状态的,但是对外服务的接口又是有状态的,这是因为服务端应用本身不存储数据,数据存储在关系型或非关系型数据库中,此时的“状态”就从服务端迁移到数据库中了。Flink 同理,一个稍微复杂一点的作业,基本都会使用到状态。

程序员小潘 1666

【Flink】Flink 状态管理

文章目录一、前言二、状态类型2.1、Keyed State2.2、Operator State三、状态横向扩展四、检查点机制4.1、开启检查点4.2、保存点机制五、状态后端5.1、状态管理器分类MemoryStateBackendFsStateBackendRocksDBStateBackend5.2、配置方式六、状态一致性6.1、端到端(end-to-end)6.2、Flink+Kafka 实现端到端的 exactly-once语义七、链接文档 一、前言 有状态的计算是流处理框架要实现的重要功能,因为稍复

w1992wishes的博客 1139
上一篇: Flink 时间概念和水位
下一篇: Flink ProcessFunction
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力生活的黄先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值