首页 > 其他分享 >Flink 按键分区状态基本介绍

Flink 按键分区状态基本介绍

时间:2022-11-16 10:00:57浏览次数:45  
标签:状态 分区 Flink Keyed State key 按键

在实际应用中,我们一般都需要将数据按照某个key进行分区,然后再进行计算处理;所以最为常见的状态类型就是Keyed State。之前介绍到keyBy之后的聚合、窗口计算,算子所持有的状态,都是Keyed State。另外,我们还可以通过富函数类(Rich Function)对转换算子进行扩展、实现自定义功能,比如RichMapFunction、RichFilterFunction。在富函数中,我们可以调用.getRuntimeContext()获取当前的运行时上下文(RuntimeContext),进而获取到访问状态的句柄;这种富函数中自定义的状态也是Keyed State。

1、基本概念和特点

按键分区状态(Keyed State)顾名思义,是任务按照键(key)来访问和维护的状态。它的特点非常鲜明,就是以key为作用范围进行隔离。我们知道,在进行按键分区(keyBy)之后,具有相同键的所有数据,都会分配到同一个并行子任务中;所以如果当前任务定义了状态,Flink就会在当前并行子任务实例中,为每个键值维护一个状态的实例。于是当前任务就会为分配来的所有数据,按照key维护和处理对应的状态。因为一个并行子任务可能会处理多个key的数据,所以Flink需要对Keyed State进行一些特殊优化。在底层,Keyed State类似于一个分布式的映射(map)数据结构,所有的状态会根据key保存成键值对(key-value)的形式。这样当一条数据到来时,任务就会自动将状态的访问范围限定为当前数据的key,从map存储中读取出对应的状态值。所以具有相同key的所有数据都会到访问相同的状态,而不同key的状态之间是彼此隔离的。这种将状态绑定到key上的方式,相当于使得状态和流的逻辑分区一一对应了:不会有别的key的数据来访问当前状态;而当前状态对应key的数据也只会访问这一个状态,不会分发到其他分区去。这就保证了对状态的操作都是本地进行的,对数据流和状态的处理做到了分区一致性。另外,在应用的并行度改变时,状态也需要随之进行重组。不同key对应的Keyed State可以进一步组成所谓的键组(key groups),每一组都对应着一个并行子任务。键组是Flink重新分配Keyed State的单元,键组的数量就等于定义的最大并行度。当算子并行度发生改变时,Keyed State就会按照当前的并行度重新平均分配,保证运行时各个子任务的负载相同。需要注意,使用Keyed State必须基于KeyedStream。没有进行keyBy分区的DataStream,即使转换算子实现了对应的富函数类,也不能通过运行时上下文访问Keyed State。

2、支持的结构类型

实际应用中,需要保存为状态的数据会有各种各样的类型,有时还需要复杂的集合类型,比如列表(List)和映射(Map)。对于这些常见的用法,Flink的按键分区状态(Keyed State)提供了足够的支持。

2.1、值状态(ValueState)

顾名思义,状态中只保存一个“值”(value)。ValueState<T>本身是一个接口,源码中定义如下:

标签:状态,分区,Flink,Keyed,State,key,按键
From: https://www.cnblogs.com/wdh01/p/16666906.html

相关文章

  • C++ 内存分区模型
    代码区:存放函数的二进制代码,由操作系统管理全局区:存放全局变量、静态变量以及常量。栈区:由编译器自动分配释放,存放函数的参数值,局部变量等堆区:由程序员分配和释放,若......
  • MySQL分表分区
    表分区表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。水平分区这种形式分区是......
  • Java 内存分区之什么是 CCS区 Compressed Class Space 类压缩空间
    https://blog.csdn.net/qq_27093465/article/details/106760961 Java内存分区之什么是CCS区CompressedClassSpace类压缩空间  了解到什么是ccs区,一般都是实际......
  • 九宫格按键输入法(华为机试)
    #include<iostream>#include<string>#include<vector>#include<algorithm>usingnamespacestd;vector<string>re{{""},{",."},{"abc"},{"def"},{"ghi"},{"jkl"},{......
  • 分区卸载 、挂载、格式化问题
     1. 分区卸载、挂载、格式化相关问题案例:SD卡设备名:mmcblk0SD卡分区名:mmcblk0p1分区挂载点:/usr/local/data1.显示系统挂载情况df-......
  • 快速体验 Flink Table Store进阶篇
    在本地安装单机版本,能够实现快速体验FlinkTableStore的目的,本文以Flink1.15.2、flink-table-store-dist-0.2.1、flink-shaded-hadoop-2-uber-2.8.3-10.0和Kafka3.......
  • FusionInsight MRS Flink DataStream API读写Hudi实践
    摘要:目前Hudi只支持FlinkSQL进行数据读写,但是在实际项目开发中一些客户存在使用FlinkDataStreamAPI读写Hudi的诉求。本文分享自华为云社区《​​FusionInsightMRSFlink......
  • FusionInsight MRS Flink DataStream API读写Hudi实践
    摘要:目前Hudi只支持FlinkSQL进行数据读写,但是在实际项目开发中一些客户存在使用FlinkDataStreamAPI读写Hudi的诉求。本文分享自华为云社区《FusionInsightMRSFlink......
  • 快速体验 Flink Table Store
    在本地安装单机版本,能够实现快速体验FlinkTableStore的目的,本文以Flink1.15.2、flink-table-store-dist-0.2.1和flink-shaded-hadoop-2-uber-2.8.3-10.0为例,系统......
  • flink开发中整合flinksql、kafka、mysql、hbase等问题与结果记录
    在flink开发中,通常会配合flinksql、kafka、mysql、hbase等一块使用,为避免jar包缺失、冲突,现整理一下。一、版本说明flink:1.13.0kafka:2.11mysql:8.0hbase:2.2.3二、fl......