首页 > 其他分享 >Flink State 状态原理解析

Flink State 状态原理解析

时间:2024-12-25 10:08:11浏览次数:3  
标签:状态 Flink checkpoint State key 算子 解析

作者:京东物流 吴云涛

一、Flink State 概念

State 用于记录 Flink 应用在运行过程中,算子的中间计算结果或者元数据信息。运行中的 Flink 应用如果需要上次计算结果进行处理的,则需要使用状态存储中间计算结果。如 Join、窗口聚合场景。

Flink 应用运行中会保存状态信息到 State 对象实例中,State 对象实例通过 StateBackend 实现将相关数据存储到 FS 文件系统或者 RocksDB 数据库中。在Flink应用运行过程中,通过 checkpoint 快照定期地保存状态数据。并在 Flink 应用重启时加载checkpoint/savepoint 来实现状态的恢复,从而让 Flink 应用继续完成之前的数据计算,实现数据精确一次向下游传递。

1.1 Apache Flink 中 State 的存储实现 StateBackend 分类

分为以下3类:

•基于内存的 HeapStateBackend。状态存储在内存中。

•基于 HDFS 或 OSS 的 FsStateBackend。状态存储在内存,并在做 cp(checkpoint)时存到远端。

•基于 RocksDB 的 RocksDBStateBackend。将对象序列化成二进制存在内存和本地磁盘的 RocksDB 数据中,并在 cp 时存到远端。

HeapStateBackend 和 RocksDBStateBackend 分别对应在 TaskManager 内存模型中的位置:

 

 

RocksDBStateBackend 中存储结构:

 

 

namespace: 在不同的 namespace 下存在相同名称的状态。

1.1.1 State 状态持久化

通过 Chandy-Lamport 分布式快照算法进行 checkpoint 完成状态数据的持久化。然后在 Flink 应用重启时读取 State 状态数据,进行运行现场的还原。

chekcpoint 分类:

•基于内存的全量 checkpoint

•HDFS 全量 checkpoint

•RocksDB 全量 checkpoint/增量 checkpoint

1.2 State 基于算子和数据分组的分类

State 可分为 Operator State 和 Keyed State 两类。

Operator State( 称为 non-keyed state)

常常存在于Source, Sink中。具体实现类例如:

•BroadcastState

例:Kafka Source 中用 OperatorState 记录 offset。

 

Keyed State

任何类型的 keyed state 都可以有有效期(TTL),所有状态类型都支持单元素的 TTL。 这意味着 List 元素和 Map 映射元素将独立到期。

例:SQL GroupBy/PartitionBy 后的窗口中的数据,每个 key 都有对应的 State。key 与 key 之间的 State 数据不可见。

keyed state 的具体实现类:

•ValueState

•MapState

•ListState

•AggregatingState

•ReducingState

•。。。。。

Flink State思维导图:

 

 

 Keyed StateOperator State
适用算子类型 只适用于KeyedStream上的算子 可用于所有算子
状态分配 每个Key对应一个状态 一个算子子任务对应一个状态
横向扩展 状态随着keyBy的分组KeyGroup自动在多个算子子任务上迁移 有多种状态重新分配的方式
创建和访问方式 自定义算子(重写RichFunction,通过State 名称从 getRuntimeContext方法创建或获得 State ) 实现 CheckpointedFunction 等接口
支持数据结构 ValueState、ListState、MapState等 ListState、BroadcastState等

二、常见状态相关处理流程

2.1 Flink 应用中状态是如何存储的?

 

 

  1. Kafka Source 如何存储 OperatorState?

class FlinkKafkaConsumerBase {
 private transient ListState<Tuple2<KafkaTopicPartition, Long>> unionOffsetStates; // state名称:"topic-partition-offset-states"
// 特殊的State类型:Union State 
}

unionOffsetStates这个变量就是 OperatorState类型的。

  1. Map算子如何存储需要累计的数据?

•ValueState/MapState/ListState/......

 

思考:keyby 后的数据分发与多并行度 subtask 之间的关系是怎样的?

首先,datastream 中数据经过 keyby 之后,会划分到各个 KeyedStream 中。每个 KeyedStream 有自己的 KeyedState(如ValueState/ListState/MapState)。

其次,KeyedStream 中的数据会以 KeyGroup 方式组织在一起。KeyGroup 是 Flink 重新分发 key state 的最小单元。

最后,KeyGroup 中的数据会通过取模最大并行度的方式分散到各个 subtask 中。以下是关键源码:


KeyGroupStreamPartitioner#selectChannel(record)
{
    K key;
    key = keySelector.getKey(record.getInstance().getValue());
    return KeyGroupRangeAssignment.assignKeyToParallelOperator(
            key, maxParallelism, numberOfChannels);
}
--KeyGroupRangeAssignment#assignKeyToParallelOperator()
    {
    return computeOperatorIndexForKeyGroup(maxParallelism, parallelism, assignToKeyGroup(key, maxParallelism));
    }
    --KeyGroupRangeAssignment#computeOperatorIndexForKeyGroup()
      公式:OperatorIndex = keyGroupId * parallelism / maxParallelism
    --KeyGroupRangeAssignment#assignToKeyGroup()
      {
        return computeKeyGroupForKeyHash(key.hashCode(), maxParallelism);
       }

2.2 修改并行度场景时 State 状态存储的变化

 

 

2.3 State 与 Checkpoint 关系

分布式快照 Checkpoint 的概念,定期将 State 持久化到 外部存储系统(HDFS/OSS) 上。用户可以通过实现 CheckpointedFunction 接口来使用 operator state。通过 barrier 来对齐 checkpoint,等待 State 持久化完成(此过程参数不同也可能是异步的)。

常见 State 与 CP 相关的问题

•State 状态过大。现象为多个算子或单个算子多个 subtask 做 checkpoint 慢,可导致 CP 对齐时间长,严重时会导致 CP 超时。

•数据倾斜导致某个 subtask 处理不及时。现象为单个算子少数几个 subtask 做 checkpoint 慢,导致 CP 对齐时间长。严重时会导致 CP 超时。

•大作业(并行度搞)频繁做 CP,会频繁上传小文件,导致 HDFS 集群小文件过多。

常用解决措施:调大托管内存大小。

标签:状态,Flink,checkpoint,State,key,算子,解析
From: https://www.cnblogs.com/Jcloud/p/18629650

相关文章

  • 【Java教程】Day5-01 核心类:String 字符串全面解析
    在Java中,String 是一个非常常用的数据类型,它代表一个字符串。不同于其他类型,String 是一个引用类型,实际在内存中由一个字符数组(char[])来表示。Java的 String 类提供了很多功能强大的方法来操作字符串数据,本篇文章将深入解析 String 类型的相关知识,帮助你更好地理解和......
  • Java基础知识全面解析
    Java基础知识全面解析Java是一种广泛使用的、面向对象的编程语言,它被广泛应用于开发桌面应用、Web应用、企业级应用、移动应用以及嵌入式系统等。Java语言自诞生以来,一直以其跨平台、性能优异、开发高效等特点,深受开发者青睐。本文将从Java的基础知识入手,详细介绍Jav......
  • Flink优化----数据倾斜
    目录判断是否存在数据倾斜数据倾斜的解决keyBy后的聚合操作存在数据倾斜为什么不能直接用二次聚合来处理使用LocalKeyBy的思想DataStreamAPI自定义实现的案例keyBy之前发生数据倾斜keyBy后的窗口聚合操作存在数据倾斜实现思路提交原始案例提交两阶段聚合的案......
  • 网站经常打不开,解析正常但虚拟主机出现问题,如何排查?
    您遇到的主要问题是网站经常打不开,尽管域名解析正常,但怀疑是虚拟主机方面的问题。这种情况可能由多种原因引起,包括但不限于服务器配置、SSL证书设置、文件权限等。为了帮助您更好地排查并解决问题,以下是详细的步骤和建议。1. 清除浏览器缓存首先,尝试清除浏览器缓存并更换浏览......
  • C++23新特性解析:[[assume]]属性
    1.引言在C++的发展历程中,性能优化一直是一个核心主题。C++23引入的[[assume]]属性为开发者提供了一个强大的工具,允许我们直接向编译器传达程序的不变量(invariant),从而实现更好的代码优化。1.1为什么需要assume?在C++23之前,主要编译器都提供了自己的内置假设机制:MSVC和IC......
  • 4、数据结构与算法解析(C语言版)--栈
    栈的数据存储遵循“后进先出的规则”,这在计算机里面是非常有用的,比如word等编辑软件的"撤销"功能,就是使用栈进行实现的。1、创建项目 main.h#ifndef_MAIN_H#define_MAIN_H#include<stdio.h>#include<stdlib.h>#include<time.h>#defineTRUE1#defineFALSE0......
  • 禅道安装与使用全解析:开启高效项目管理之旅
    禅道是一款国产的开源项目管理软件,它融合了项目管理、任务管理、缺陷管理、测试管理等多种功能,广泛应用于互联网软件研发等众多领域。一、功能特点项目管理禅道可以对项目进行全生命周期的管理。从项目的创建、规划,到执行、监控和收尾,每个阶段都有相应的功能支持。例如,在项目......
  • 基于模拟数据与逻辑回归的交通流量预测模型:设计与实现全解析
    一、项目概述本项目旨在通过模拟生成的交通相关数据,构建一个逻辑回归模型来预测交通流量。通过对时间、天气、是否为周末等因素的分析,实现对交通流量的分类预测(流量高或低),并评估模型的准确性。二、功能模块设计数据生成模块功能描述:生成包含时间、天气、是否为周末以及相应交......
  • Python中定位元素包含文本信息的详细解析与代码示例
    在Python编程中,特别是在进行网页自动化测试或数据抓取时,定位包含特定文本信息的元素是一个常见的需求。通过合适的工具和库,可以高效地查找和操作这些元素。本文将详细介绍如何在Python中定位包含文本信息的元素,并给出详细的代码示例。一、理论概述在Python中,定位网页元素通常使......
  • 梯度提升树模型全解析:原理、参数、应用与优化
    一、基本概念定义梯度提升树(GradientBoostingTree,GBT)是一种基于boosting框架的集成学习算法,用于回归和分类问题。它通过迭代地训练决策树,并将前一棵树的残差作为下一棵树的训练目标,逐步减少预测误差。集成学习是将多个弱学习器(在梯度提升树中,弱学习器通常是决策树)组合成一......