深入理解 Flink(一)Flink 架构设计原理

大数据分布式计算引擎设计实现剖析

MapReduce

MapReduce 执行引擎解析

在这里插入图片描述

MapReduce 的组件设计实现图

在这里插入图片描述

Spark

执行引擎解析

在这里插入图片描述
Spark 相比于 RM 的真正优势的地方在哪里:(Simple、Fast、Scalable、Unified)

  • DAG 引擎
  • 中间计算结果可以进行内存持久化
  • 基于内存计算(不完全对,确切地说是把数据都加载(从内存中间件中读取)到内存中,然后来执行计算)
  • 生态多样,算子丰富,API 应用库丰富,支持的资源调度也丰富

Spark 执行引擎组件图

在这里插入图片描述

Flink 流式计算引擎官网解读

简介

Flink 官网定义: Stateful Computations over Data Streams(https://flink.apache.org/)
在这里插入图片描述
在这里插入图片描述

Flink 官网导航

Flink 各种特性介绍:https://flink.apache.org/
What is Apache Flink?:https://flink.apache.org/flink-architecture.html
Flink 应用场景:https://flink.apache.org/usecases.html
Flink 应用企业:https://flink.apache.org/poweredby.html
Flink 版本升级迭代:https://flink.apache.org/downloads.html
Flink Quick Start:https://nightlies.apache.org/flink/flink-docs-release-1.14//docs/try-flink/local_installation/
Flink 架构:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/concepts/flink-architecture/
Flink 核心概念:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/concepts/glossary/
Flink 流式应用程序开发相关:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/dev/datastream/overview/
Flink Checkpoint:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/ops/state/checkpoints/
Flink State 和 StateBackend:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/ops/state/state_backends/
Flink 部署:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/deployment/overview/要点01:Flink 处理无界数据流:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/learn-flink/overview/#stream-processing
要点02:Flink 关于并行数据流的处理方案:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/learn-flink/overview/#parallel-dataflows
要点03:Flink 的有状态计算和状态管理:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/learn-flink/overview/#stateful-stream-processing
要点04:Flink Operator 和 Task:https://nightlies.apache.org/flink/flink-docs-release-1.14/fig/levels_of_abstraction.svg
要点05:Flink 资源管理 和 Slot:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/concepts/flink-architecture/#task-slots-and-resources
要点06:Flink 应用程序运行模式:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/concepts/flink-architecture/#flink-application-execution

有界数据流和无界数据流的区别

在这里插入图片描述

名词解释

离线和实时指的是:数据处理的延迟;
批量和流式指的是:数据处理的方式。
批处理的特点是有界、持久、大量,批处理非常适合需要访问全套记录才能完成的计算工作,一般用于离线统计。
流处理的特点是无界、实时,流处理方式无需针对整个数据集执行操作,而是对通过系统传输的每个数据项执行操作,一般用于实时统计。
实时计算结果一般是给机器自动化处理,离线计算结果一般用于人的决策。

Flink 架构设计实现和应用模块分工

Flink 整体架构设计实现请参考官网:
https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/concepts/flink-architecture/

Flink API 设计

请参考官网: https://nightlies.apache.org/flink/flink-docs-release-1.14/fig/levels_of_abstraction.svg
在这里插入图片描述
Flink 整体架构体系:API 和 Libaries 体系
在这里插入图片描述

Flink 编程入门到模式总结

在这里插入图片描述

Flink 的程序和数据流结构

在这里插入图片描述

编程套路总结

1、获得一个执行环境:(Execution Environment)
2、加载/创建初始数据:(Source)
3、指定转换这些数据:(Transformation)
4、指定放置计算结果的位置:(Sink)
5、触发程序执行:(Action)

Flink 核心概念和并行度

在这里插入图片描述

  • 图中的 o: Operator, oc 表示 OperatorChain, t 表示 Task。
  • 图中的 圆圈 就是一个 Task,绿色的是 Task,只不过是包含两个 Operator, 箭头是数据流, Task 是预先启动不转移位置的,数据流中的数据是流动的。
  • OperatorChain 可以理解成类似于 Spark 中的 Stage。
  • OperatorChain 包含了多个 Operator,基于并行度并行运行成多个 Task。
  • Stage 包含了多个 算子,其实包含了多个 RDD, Stage 中的 Task 数量取决于 这个 Stage 的 最后一个 RDD 的分区数量。

Flink Runtime 四层 Graph 详解

在这里插入图片描述
关于上图中的一些概念的解释:

  • DataFlow Graph 是一个逻辑概念,表示这个应用程序的一个执行图。事实上在客户端的时候,会生成两个图:StreamGraph + JobGraph
    • StreamGraph 中两种非常重要的概念: StreamNode(Operator 算子) + StreamEdge
    • JobGraph jobGraph = PipelineExecutorUtils.getJobGraph(pipeline, configuration); pipeline = StreamGraph
  • Client 就是一个 Http 方式的 Restful Client ,负责提交 JobGraph 到 JobManager
  • Jobmanager 接收到 JobGraph 之后,会做一件非常重要的事情:启动一个 JobMaster , 这个 JobMaster 就负责这个 Job 的执行。JobMaster 的内部,维护了一个 JobGraph ,在构造 JobMaster 的时候,同时也会吧 JobGraph 构造成 ExecutionGraph。
    • ExecutionGraph = ExecutionVertex (里面有一个抽象就代表了一个 Task 的一切信息:Execution, 一个 Execution 会启动一个 Task)
  • JobMaster 接下会会向 ResourceManager( 不是 YARN 里面的) JobManager 里面的管理资源的组件 申请 Slot 资源,部署 Task 启动执行。
  • 当所有的 Task 都部署到 TaskManager 里面去了,都启动好了,并且上下游 Task 之间都建立了链接,则最终形成了一个 物理执行图。

在这里插入图片描述
StreamGraph:是根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构。简单说就是进行算子拼接。
JobGraph:StreamGraph 经过优化后生成了 JobGraph,提交给 JobManager 的数据结构。主要的优化为,将多个符合条件的节点 chain 在一起作为一个节点,这样可以减少数据在节点之间流动所需要的序列化反序列化传输消耗。简单说就是把能优化的算子拼接在一起。
ExecutionGraph:JobManager 根据 JobGraph 生成 ExecutionGraph。ExecutionGraph 是JobGraph 的并行化版本,是调度层最核心的数据结构,用来执行调度。简单说就是 JobGraph 的并行化版本
物理执行图:JobManager 根据 ExecutionGraph 对 Job 进行调度后,在各个 TaskManager 上部署 Task 后形成的图,并不是一个具体的数据结构。简单说就是最终运行状态图。

注意:最后一个物理执行图并非 Flink 的数据结构,而是程序开始执行后,各个 Task 分布在不同的节点上,所形成的物理上的关系表示。
在这里插入图片描述

Flink 内存模型全详解

Flink Application 运行流程回顾

Flink Task 和 TaskSlot 和 TaskManager 之间的关系:
在这里插入图片描述
Flink TaskManager 和 TaskManager 之间的数据传输关系:
在这里插入图片描述

Flink 内存管理

JVM 管理内存的缺陷,其实上是一个共性问题,Spark, HBase 等等,都会涉及到内存模型。

  • Java 对象存储密度低:一个只包含 boolean 属性的对象占用 16 个字节内存:对象头占了 8 个, boolean 属性占了 1 个,对其填充占了 7 个,而实际只需要一个bit(1/8字节)就够了。
  • Full GC 会极大地影响性能,尤其是为了处理更大数据而开了很大内存空间的 JVM 来说,GC 会达到秒级甚至分钟级。大量的内存碎片,会把 JVM 的堆内存划分成一个个的区域。
  • OOM 问题影响稳定性:OutOfMenoryError 是分布式计算框架经常会遇到的问题,当 JVM 中所有 对象大小超过分配给 JVM 的内存大小时,就会发生OutOfMenoryError 错误,导致 JVM 崩溃,分布式框架的健壮性和性能都会受到影响。

Flink 内存模型

参考官网链接:

https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/deployment/memory/mem_setup/
https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/deployment/memory/mem_setup_tm/
https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/deployment/memory/mem_setup_jobmanager/

Flink 的内存模型从 Flink-1.10 发生了比较大的改变,新版本的内存模型如下:
在这里插入图片描述

  • Total Process Memory,TaskManager 进程总内存,比如在 YARN 环境中,其实就是 Container 的内存大小。
    • taskmanager.memory.process.size :无默认值,需要用户指定。
  • Total Flink Memory,Flink 总内存,TaskManager 进程占用的所有与 Flink 相关的内存(不包括 JVM 元空间和其他额外开销)。具体包含4大块:Flink 框架内存(堆内、堆外)、托管内存(仅堆外)、网络缓存(仅堆外)、任务内存(堆内、堆外)。
    • taskmanager.memory.flink.size :无默认值,需要用户指定。
  • FrameWork Heap / Off-heap,Flink 框架内存,Flink Runtime 底层占用的内存,一般来讲相对固定,不需要更改。一般在 Flink 算子并行度特别高的时候,才需要调整。
    • taskmanager.memory.framework.heap.size :堆内部分(Framework Heap),默认值 128MB;
    • taskmanager.memory.framework.off-heap.size :堆外部分(Framework Off-Heap),以直接内存形式分配,默认值 128MB。
  • Managed Memory,Flink 托管内存,纯堆外内存,由 MemoryManager 管理,用于中间结果缓存、排序、哈希表等,以及 RocksDB 状态后端。
    • taskmanager.memory.managed.fraction :托管内存占Flink总内存 taskmanager.memory.flink.size 的比例,默认值 0.4;
    • taskmanager.memory.managed.size :托管内存的大小,无默认值,一般也不指定,而是依照上述比例来推定,更加灵活。
  • Network 网络内存, 纯堆外内存,用于 TaskManager 之间(shuffle、广播等)及与外部组件的数据传输,以直接内存形式分配。
    • taskmanager.memory.network.min : 网络缓存的最小值,默认 64MB;
    • taskmanager.memory.network.max : 网络缓存的最大值,默认 1GB;
    • taskmanager.memory.network.fraction : 网络缓存占 Flink 总内存 taskmanager.memory.flink.size 的比例,默认值 0.1。若根据此比例算出的内存量比最小值小或比最大值大,就会限制到最小值或者最大值。
  • Task heap / Off-heap 内存,是算子逻辑和用户代码、自定义数据结构真正占用的内存。
    • taskmanager.memory.task.heap.size : 堆内部分(Task Heap),无默认值,一般不建议设置,会自动用 Flink 总内存减去框架、托管、网络三部分 的内存推算得出。
    • taskmanager.memory.task.off-heap.size : 堆外部分(Task Off-Heap),以直接内存形式分配,默认值为 0,即不使用。
  • JVM Metaspace,Flink JVM 进程的元数据空间大小
    • taskmanager.memory.jvm-metaspace.size :默认值 256MB。
  • JVM Overhead,为 JVM 进程预留的其他本地内存,用于线程栈、代码缓存、垃圾收集。它是 Total Process Memory(整个进程) 的一个有上下限的细分组件。
    • taskmanager.memory.jvm-overhead.min : JVM 额外开销的最小值,默认 192MB;
    • taskmanager.memory.jvm-overhead.max : JVM 额外开销的最大值,默认 1GB;
    • taskmanager.memory.jvm-overhead.fraction : JVM 额外开销占 TM 进程总内存 taskmanager.memory.process.size 的比例,默认值 0.1。若根据此比例算出的内存量比最小值小或比最大值大,就会限制到最小值或者最大值。

生产环境中,主要要调整的参数:

  • 在 Standalone 模式下,调整 taskmanager.memory.flink.size 指定 Flink 从节点 TaskManager 总内存
  • 在 Flink On YARN 模式下,调整 taskmanager.memory.process.size 指定 Flink 从节点 TaskManager 总内存
  • 根据网络流量大小修改网络缓存占比:taskmanager.memory.network.fraction,默认 0.1
  • 根据 RocksDB 状态大小等调整托管内存占比:taskmanager.memory.managed.fraction,默认 0.4

案例:

# Flink On YARN 模式下
taskmanager.memory.process.size = 4096 MB = 4G 
taskmanager.memory.network.fraction=0.15
taskmanager.memory.managed.fraction=0.45

根据以上参数,就可以计算得到各部分的内存大小:

taskmanager.memory.jvm-overhead = 4096 * 0.1 = 409.6 MB 
taskmanager.memory.flink.size = 4096 - 409.6 - 256 = 3430.4 MB 
taskmanager.memory.network = 3430.4 * 0.15 = 514.56 MB
taskmanager.memory.managed = 3430.4 * 0.45 = 1543.68 MB 
taskmanager.memory.task.heap.size = 3430.4 - 128 * 2 - 1543.68 - 514.56 = 1116.16 MB

在这里插入图片描述
另外,还有可以指定 JVM 相关参数的一些选项,也请注意:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握设计模式:深入了解命令模式的优雅调度与行为解耦

命令模式是一种行为设计模式,其目的是将请求发送者和接收者解耦,从而允许发送者发送请求,而无需知道请求的具体处理方式。在命令模式中,请求被封装为一个对象,这个对象包含了执行请求所需的所有信息,包括调…

解析器:request.body、request.POST、request.data

request.POST与request.body: django中的request.POST只能取到Content-Type(请求头)为application/x-www-form-urlencoded(form表单默认格式)的数据,如果请求头为application/json(json格式),multipart/form-data(文件)等格式无法取到&#x…

世邦通信SPON IP网络对讲广播系统未授权访问

产品介绍 世邦通信SPON IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统getuserdata.php存在未授权访问漏洞,攻击者可通过该漏洞在服务器端读取账户密码…

软件工程各种图

参考视频: 6 分钟学会 UML 类图_哔哩哔哩_bilibili 5 分钟学会 UML 时序图(顺序图、序列图)_哔哩哔哩_bilibili 3 分钟学会 UML 活动图_哔哩哔哩_bilibili 6 分钟学会 UML 用例图_哔哩哔哩_bilibili 是真的讲的非常好!&#…

Aloha 机械臂的学习记录3——AWE:Pycharm运行代码记录

之前的博客创作了三偏关于Aloha_AWE的liunx终端指令运行代码的示例: Aloha 机械臂的学习记录——AWE:Bimanual Simulation Suite: https://blog.csdn.net/qq_54900679/article/details/134889183?spm1001.2014.3001.5502 Aloha 机械臂的学习记录1——AWE&#x…

Python 与 PySpark数据分析实战指南:解锁数据洞见

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 数据分析是当今信息时代中至关重要的技能之一。…

免费运维工具测评——深入使用牧云主机管理助手

作为一名运维,宝塔,Nezha 监控面板,WinSCP,Termius 都用过了,谈一下自己的感受: 安装绑定 微信扫码可直接登录,主页简洁清晰,即使是个人体验版也没有任何广告。 只需要复制命令在服…

基于神经网络的手写汉字提取与书写评分系统研究

相关源码和文档获取请私聊QQ:3106089953 论文目录结构 目 录 摘 要 I Abstract II 目 录 IV 第1章 绪论 1 1.1. 研究背景与意义 1 1.2. 国内外研究现状 2 1.2.1. 文本定位技术研究现状 2 1.2.2. 手写汉字识别研究现状 3 1.2.3. 汉字书写质量评价方法研究现状 4 1.3. 本文所做工…

Linux驱动开发(1)-最简单的字符设备驱动开发例子

1.简介 字符设备驱动:按照字节流进行读写操作的设备,例如点灯、按键、IIC、SPI、LCD。 Linux系统中一切皆文件,驱动加载成功,就会在/dev目录生成文件,对文件操作,则可实现对硬件操作。应用程序运行在用户…

Leetcode242有效的字母异位词(java实现,详细易懂想学会的进!!!)

今天给大家分享的题目是leetcode242有效的字母异位词 我们先看题目描述: Chatgpt中对于字母异位词的解释如下: 字母异位词是指由相同的字母组成但顺序不同的单词。换句话说,字母异位词具有相同的字母,只是排列顺序不同。 简单的将…

华云安攻击面发现及管理平台体验

省流: 无需【立即咨询】即可体验,开通即可查看演示数据,公开报价 界面: 界面简洁,要点清晰,可以清晰的看到暴露面及攻击面信息 功能: 资产发现:主域名发现、子域名发现、 IP 发现…

Set和Map

一、Set的介绍 1.1、Set相关文档介绍 cplusplus.com/reference/set/set/?kwset 1. set是按照一定次序存储元素的容器 2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。 set中的元素不能在容器中修改…

时空序列问题的本质和底层逻辑

本质:Still need to polish this. 底层逻辑:Still need to polish this.See you pretty soon. Reference 【时空序列预测】什么是时空序列问题?这类问题主要应用了哪些模型?主要应用在哪些领域?_mb62b92582e5a0a的技…

【算法刷题】Day28

文章目录 1. 买卖股票的最佳时机 III题干:算法原理:1. 状态表示:2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码: 2. Z 字形变换题干:算法原理:1. 模拟2. 找规律 代码: 1. 买卖股票的最佳时…

我是如何从计算机小白成长为技术专家的(上)?

作为一名程序员,我想大家接触最多的是计算机吧,但是一个从没有接触过计算机的小白,又是如何走上程序员的道路的呢。 农村的孩子,早当家 作为农村出身的孩子,且家里条件也不是非常的好,在我那个年代&#…

Linux网络配置与抓包工具介绍

目录 一、配置命令 1. ifconfig 1.1 概述信息解析 1.2 常用格式 2. ip 2.1 ip link 数据链路层 2.2 ip addr 网络层 2.3 路由 3. hostname 3.1 临时修改主机名 3.2 永久修改主机名 4. route 5. netstat 6. ss 7. ping 8. traceroute 9. nslookup 10. 永久修…

springcloud Config配置中心

简介 服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。 SpringCloud提供了ConfigS…

Android SDK环境搭建

一、Android SDK简介 SDK:(software development kit)软件开发工具包。被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。 因此,Android SDK 指的是Android专属的软件…

【Java集合篇】HashMap的remove方法是如何实现的?

HashMap的remove方法是如何实现的 ✔️典型解析✔️拓展知识仓✔️HashMap的remove方法的注意事项✔️HashMap的remove方法的参数类型✔️ 删除键和值的参数类型有什么区别✔️删除键值对的场景是什么 ✔️HashMap remove方法是阻塞队列的吗✔️HashMap remove方法是线程安全的…

如何使用web文件管理器Net2FTP搭建个人网盘

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一,特别是智能设备的大面积使用,无论是个人…