首页 > 其他分享 >Flink底层核心

Flink底层核心

时间:2024-09-12 22:22:56浏览次数:11  
标签:状态 核心 Flink State TaskManager checkpoint 任务 底层

1. 核心组件

JobManager

JobManager 是 Flink 集群的控制中心,负责调度、管理和协调整个作业的执行。它的主要职责包括:

  • 作业提交:接收用户提交的作业,生成执行计划。
  • 任务调度:将作业划分为子任务,并分配到不同的 TaskManager 执行。
  • 资源管理:与集群管理系统(如 YARN、Kubernetes)交互,申请或释放计算资源。
  • 故障恢复:通过 checkpoint 和恢复机制处理任务失败,确保任务能够从上一次的状态恢复。
  • 监控与管理:管理集群中任务的执行状态,收集并展示指标。
TaskManager

TaskManager 是 Flink 集群中的工作节点,负责实际执行任务。每个 TaskManager 会执行多个任务槽(Task Slot),其具体职责包括:

  • 任务执行:TaskManager 负责接收和执行由 JobManager 分配的任务。
  • 资源隔离:每个 Task Slot 是 Flink 用于隔离任务资源的基本单元,Task Slot 可以防止任务之间的资源竞争,提供 CPU 和内存的隔离。
  • 状态管理:TaskManager 负责管理任务的状态和中间结果,将状态存储在内存或外部存储系统中。
  • 数据传输:TaskManager 之间进行网络通信,传输流数据。

2. DataStream API 和 DataSet API

  • DataStream API:Flink 提供了一个流式数据处理的编程接口,用于处理无限的数据流(无界流)。它的核心概念包括:
    • Transformation:Flink 提供了丰富的数据转换操作(如 map、filter、reduce、window 等),这些操作可以直接应用于流数据。
    • Window:Flink 支持对流数据进行窗口操作,将数据按时间、数量、会话等进行分割并聚合。
    • Time Semantics:Flink 支持多种时间语义,包括处理时间(Processing Time)和事件时间(Event Time)。
  • DataSet API:用于批处理数据集,操作方式类似于批处理框架如 Hadoop。适用于有限的数据集。

3. 执行引擎

Flink 的执行引擎将用户编写的代码转换为底层的并行计算任务并运行,这个过程分为多个步骤:

StreamGraph 和 JobGraph
  • StreamGraph:这是用户定义的作业的初步表示,用户的 DataStream 程序会被翻译成一个有向无环图 (DAG),其中节点表示操作符,边表示数据流动。
  • JobGraph:StreamGraph 会进一步被优化为 JobGraph。JobGraph 是物理执行的高层次逻辑表示,反映了任务之间的依赖关系。
TaskGraph
  • TaskGraph 是 Flink 作业的物理执行图。JobGraph 被细化为 TaskGraph,它包含具体的物理执行任务,并包含每个任务的并行度信息。
  • Execution Graph:当 Flink 开始执行时,TaskGraph 会被转换成 Execution Graph,反映了任务如何在集群上并行执行。
Task Slot
  • 每个 TaskManager 包含多个 Task Slot。每个 Task Slot 负责执行一个或多个并行任务,并且能够隔离不同任务的资源使用。通过这种方式,Flink 可以在单个节点上运行多个任务而不互相干扰。

4. 状态管理

Flink 处理的数据流可能会依赖于中间状态(例如计算窗口聚合、join 或带状态的函数),这时状态管理显得尤为重要。

Operator State 和 Keyed State
  • Operator State:每个操作符(Operator)可以维护自己的状态。Operator State 在整个流作业中共享,不区分具体的数据键。
  • Keyed State:Keyed State 是基于键的状态,每个键(key)都有其自己的状态。Keyed State 常用于基于 key 的分布式状态处理。
State Backend

Flink 提供了多种方式来存储作业的状态:

  • MemoryStateBackend:状态存储在内存中,适合小状态的应用。
  • FsStateBackend:将状态存储在文件系统中,通常用于批处理作业。
  • RocksDBStateBackend:将状态存储在外部持久化存储(如 RocksDB 中),适合状态较大的应用场景。
Checkpointing 和 Savepoints
  • Checkpointing:Flink 支持周期性 checkpoint,它可以捕获整个作业的状态,用于恢复任务失败。checkpoint 是增量式的,系统只保存状态的变化部分。
  • Savepoint:Savepoint 是手动触发的状态保存点,常用于作业的维护和升级。Savepoint 通常用于持久化状态并在以后恢复。

5. 事件时间与窗口

事件时间

事件时间是 Flink 支持的时间语义,它根据事件发生的时间戳来处理数据。这与其他流处理框架通常使用的处理时间(即系统接收到数据的时间)不同。

  • Watermark:在乱序数据的处理过程中,Flink 使用 Watermark 来标记系统已经看到的最晚事件时间。Watermark 可以帮助 Flink 决定何时可以关闭窗口并输出结果。
窗口操作

Flink 提供了灵活的窗口操作,允许将数据流分成多个窗口:

  • Time Window:按时间段划分数据流。
  • Count Window:按数据数量划分窗口。
  • Session Window:基于用户活动的间隔自动生成窗口。
  • Global Window:包含整个数据流,不会根据时间或数量进行划分。

6. 容错性

Checkpoint

Flink 的 checkpoint 机制用于在作业执行期间周期性地保存作业状态。一旦任务失败,系统可以从最近的 checkpoint 重新启动任务,确保数据的完整性。

  • 增量检查点:Flink 支持增量式 checkpoint,仅存储自上次 checkpoint 以来的变化部分,节省存储和计算资源。
Exactly Once 语义

Flink 提供了严格的"精确一次"处理语义,确保在发生故障时,数据不会被重复处理或丢失。Flink 使用的 checkpoint 和两阶段提交协议(Two-Phase Commit Protocol)来实现精确一次的消息传递。

7. 资源管理

Flink 可以与各种资源管理系统集成,动态管理和调度计算资源:

  • YARN:与 Hadoop YARN 集成,动态分配集群资源。
  • Kubernetes:Flink 可以在 Kubernetes 集群中运行,通过容器化环境进行自动扩展。
  • Standalone 模式:在独立服务器上运行,资源管理由用户手动配置。

8. Flink 的流处理与批处理统一模型

Flink 统一了流处理和批处理的执行模型。Flink 将批处理视为有界的流处理,而流处理则是无界的数据处理。通过这种统一模型,Flink 能够有效地处理不同类型的数据任务。这一特性使得 Flink 能够在一个引擎中高效地处理实时数据流和批处理作业,同时确保任务的语义一致性。

每个部分相互协作,保证了 Flink 作为一个分布式计算平台,能够高效地处理海量数据,并提供高可用性和容错性。

标签:状态,核心,Flink,State,TaskManager,checkpoint,任务,底层
From: https://blog.csdn.net/Casual_Lei/article/details/142151690

相关文章

  • 成长的底层逻辑:why-how-what 思考顺序
    为什么明明知道,却改不了?为什么别人听不明白我说的啥?如何让自己的成长更快速,而非像网游里打怪攒经验线性升级。why、how、what的思考方式,让我在这些问题上看到了答案。不仅如此,使用了这个思考方式之后,我对阳明心学、西方个人发展类书籍也有了更深层次的理解。我认为它是非常强......
  • 手把手教你制作最简网页版倒计时程序(核心代码仅25行)
    一、解构如图所示,手机浏览器的效果。代码就是简单的html语言加上一个JavaScript脚本,界面主要分3部分,功能实现主要分3个函数。(一)显示样式在头里定义了居中显示的CSS样式,将来在浏览器中居中显示倒计时X分XX秒。<styletype="text/css">   .center{      positio......
  • 技术揭秘 DWS 实时数仓解决方案,如何深度融合 Flink 简化数据链路
    一、实时数仓介绍实时数仓是一种现代化的数据仓库系统,其核心优势在于能够处理和分析实时数据。随着信息技术和数据科学的飞速发展,企业对实时数据分析和决策支持的需求愈发迫切。实时数仓能够实时或近实时地反映数据变化,为企业提供最新的业务指标和深度洞察,从而支持快速决策。因此......
  • 【编程底层原理】String常量池和String.intern()
    一、String常量池String常量池(StringPool)是Java中的一个特殊内存区域,用于存储字符串常量。它的主要目的是优化程序的性能和内存使用,具体体现在以下几个方面:1、字符串重用:当程序中多次出现相同的字符串字面量时,它们都会被存储在String常量池中。由于常量池的唯一性,相同的......
  • 美团面试:G1 垃圾回收底层原理是什么?说说你的调优过程?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • 技术揭秘 DWS 实时数仓解决方案,如何深度融合 Flink 简化数据链路
    摘要:DWS实时数仓解决方案支持数仓模型的分层和增量加工,能够实现数据的实时入库、出库和查询,确保数据的新鲜度。一、实时数仓介绍实时数仓是一种现代化的数据仓库系统,其核心优势在于能够处理和分析实时数据。随着信息技术和数据科学的飞速发展,企业对实时数据分析和决策支持的需求愈......
  • 快人一步迅为LPDDR5版本瑞芯微RK3588核心板升级了
    性能强--iTOP-3588开发板采用瑞芯微RK3588处理器,是全新一代ALoT高端应用芯片,采用8nmLP制程,搭载八核64位CPU,四核Cortex-A76和四核Cortex-A55架构,主频高达2.4GHZ,8GB内存,32GBEMMC。四核心架构GPU--集成MaliG610MP4四核GPU、支持OpenGLES1.1、2.0、3.2OpenCL2.2和Vulkan1.2。带有M......
  • 【C++】new的底层实现原理
    文章目录理解C++`new`的原理1.`new`的基本工作流程2.`new`和`malloc`的区别3.`new`的底层实现4.`new[]`与`delete`的配对使用5.自定义`new`和`delete`6.定位new7.内存泄漏与异常安全理解C++new的原理在C++中,new操作符用于在堆上动态分......
  • 【C++】C++ 多态的底层实现原理
    文章目录1.多态的定义与作用2.虚函数与虚函数表(vtable)3.虚函数表(vtable)4.虚函数调用的底层过程5.内存布局中的虚函数指针6.多重继承中的虚函数表7.RTTI与动态类型识别1.多态的定义与作用多态指的是同一操作在不同对象上具有不同的表现。C++中多态分为两......
  • 学习《领域驱动设计-软件核心复杂性应对之道》的过程随笔
    本随笔谨用于记录本人学习《领域驱动设计-软件核心复杂性应对之道》的过程和收获,愿与大家共享之初写于2024.07.24,学习未竟,随笔伴行-- 本人于工作期间阅读该书,发现很多值得反复学习的方法和思考方式,随笔记录;兴之所至,兴尽即止---本文是针对面向对象开发人员所编写的,如不合适,请......