关于Flink内存分配核心知识点

news2024/12/26 21:02:15

这个问题同样也是之前辅导过的同学的面试问题,这个问题非常接地气且考察面试者的实践经验。事实上,这也是我们大数据提高班的Flink专项提高部分内容。

下面我列举的这些就是核心,能答出这些重点即可。

内存模型在Flink1.9和Flink1.11版本做了非常大的改动,主要原因是为了统一Batch和Streaming的内存配置。首先我建议大家只看Flink1.11版本的内存配置即可。

有两个FLIP可以参考,这两个FLIP你能看懂的话就能完全掌握Flink的内存配置。

  • FLIP-116: Unified Memory Configuration for Job Managers

  • FLIP-49: Unified Memory Configuration for TaskExecutors

我们分情况来说。

JobManager内存模型

Flink1.11后的JM内存模型如下:

319df4e7f3811097775c78dfc05c5f12.png

两个版本之间最大的变化是:

  • Flink 1.9 中只有堆内、堆外两个内存模块;

  • Flink 1.11 中将 Flink 1.9 的堆外模块细分为 Direct Memory、JVM Metaspace 和 JVM Overhead 三类;

核心的参数如下:

ee4395b5b27a534eb37f30a041f099ad.png

举个例子,假设 JM 配置的总内存大小为 1GB,那么 JM 在启动时,生成的 JVM 命令如下:

-Xmx469762048 
-Xms469762048 
-XX: MaxDirectMemorySize=134217728 
-XX:MaxMetaspaceSize=268435456,

计算结果:

  1. Heap: 1g - 128m - 256m - 192m = 448MB;

  2. DirectMemory:128MB;

  3. Metaspace:256MB;

  4. Overhead:min(max(192m, 0.1 * 1g), 1g) = 192m

JM的内存配置建议是:只需要配置JM的总内存大小,其余全部默认即可。

TaskManager内存模型

Flink1.11后的TM内存模型如下:

b3db7460b7091edf7869b6c732f31d28.png

TaskManager核心配置参数如下:

d3e256757c72ae42fe7c1ac5214c10c2.png

TM的内存配置建议:只需要配置TM的总内存大小,其余全部默认即可。

举个例子,假设一个任务的 TM 内存配置为 4196 MB,运行时的 JVM 参数被设置如下:

# JVM 配置
-Xmx973204290  # 928.12MB
-Xms973204290
-XX:MaxDirectMemorySize= 1241639855  # 1184.12MB
-XX:MaxMetaspaceSize=268435456   # 256MB

# 计算的配置
taskmanager.memory.framework.off-heap.size=134217728b
taskmanager.memory.network.max=1107422127b
taskmanager.memory.network.min=1107422127b
taskmanager.memory.task.off-heap.size=0b
taskmanager.memory.framework.heap.size=134217728b
taskmanager.memory.task.heap.size=838986562b
taskmanager.memory.managed.size=1476562799b

注意,这里有个特殊的配置需要注意,如果你的任务TM个数过多,会出现类似如下的错误:

java.io.IOException: Insufficient number of network buffers: required xxx, but only xxx available. The total number of network buffers is currently set to xxx of xxx bytes each. You can increase this number by setting the configuration keys 'taskmanager.network.memory.fraction', 'taskmanager.network.memory.min', and 'taskmanager.network.memory.max'.
        at org.apache.flink.runtime.io.network.buffer.NetworkBufferPool.createBufferPool(NetworkBufferPool.java:363)
        at org.apache.flink.runtime.io.network.partition.ResultPartitionFactory.lambda$createBufferPoolFactory$0(ResultPartitionFactory.java:207)
        at org.apache.flink.runtime.io.network.partition.ResultPartition.setup(ResultPartition.java:131)
        at org.apache.flink.runtime.taskmanager.Task.setupPartitionsAndGates(Task.java:898)
        at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:648)
        at org.apache.flink.runtime.taskmanager.Task.run(Task.java:539)
        at java.lang.Thread.run(Thread.java:748)

原因是因为作业TM之间shuffle数据时,network buffer不足。通过调整taskmanager.memory.network.min,taskmanager.memory.network.maxtaskmanager.memory.network.fraction即可。

加餐,内存设置和并行度关系

最后,估算一个任务的内存消耗,要和并行度的指定搭配进行。

举个例子,假如我们估算一个任务需要消耗的总内存是20G,这时候资源该怎么分配呢?

我们可以指定TM个数=2,单个TM消耗10G内存,2x10=20G;也可以指定TM个数=10,单个TM消耗2G内存,10x2=20G。

这两种方式有区别吗?当然有。

假设我们TM个数=2,那么如果我的任务数据量较大,例如上游Source端的Kafka Partition数量为128,那么理论上我们需要指定的Flink任务的最大并行度至少是128,那么单个TM的Slot数量就应该是64,因为2x64=128。这会带来什么问题呢?单个TM分配64个Slot明显不太合理。

我们拿出官网的推荐:

89235decf052981f1ba780f9f32fe196.png

官网给出的建议值是:TakManager所拥有的cpu核数的整数倍(proportional to the number of physical CPU cores that the TaskManager's machine has)。

实际中我们单个TM分配的cpu一般是1的整数倍,例如2、4...,那么这时候单个TM的slot个数建议是20、40、80...。最好是cpu数量的整数倍,至于是多少倍,大家可以根据经验判断,一般来说建议是10-20倍左右。

当然,在Flink1.14版本后,对于希望更精细化调节资源消耗的用户,基于对特定场景的了解,Flink提供了细粒度资源管理。我们直接拿官网的图做对比:

87784521962ac53262e12c369a324640.png

对于细粒度资源管理,Slot 资源请求包含用户指定的特定的资源配置文件。Flink 会遵从这些用户指定的资源请求并从 TaskManager 可用的资源中动态地切分出精确匹配的 slot。如上图所示,对于一个 slot,0.25Core 和 1GB 内存的资源申请,Flink 为它分配 slot 1。

对于没有指定资源配置的资源请求,Flink会自动决定资源配置,如上所示,TaskManager 的总资源是 1Core 和 4GB 内存,task 的 slot 数设置为2,Slot 2 被创建,并申请 0.5 Core和 2GB 的内存而没有指定资源配置。 在分配 Slot 1和 Slot 2后,在 TaskManager 留下 0.25 Core 和 1GB 的内存作为未使用资源。

所以你看这个问题其实是一环套一环的,有经验的面试官会继续往下追问。当然如果你掌握的足够好,也可以给出超出面试官期望的回答。

e4da3117d5f089d9e912abfda477550f.png300万字!全网最全大数据学习面试社区等你来!

如果这个文章对你有帮助,不要忘记 「在看」 「点赞」 「收藏」 三连啊喂!

178da93af8dccfa42f37b114f732c3d2.png

2f53a40214ae35ed1eaf3feb95c6c427.jpeg

全网首发|大数据专家级技能模型与学习指南(胜天半子篇)

互联网最坏的时代可能真的来了

我在B站读大学,大数据专业

我们在学习Flink的时候,到底在学习什么?

193篇文章暴揍Flink,这个合集你需要关注一下

Flink生产环境TOP难题与优化,阿里巴巴藏经阁YYDS

Flink CDC我吃定了耶稣也留不住他!| Flink CDC线上问题小盘点

我们在学习Spark的时候,到底在学习什么?

在所有Spark模块中,我愿称SparkSQL为最强!

硬刚Hive | 4万字基础调优面试小总结

数据治理方法论和实践小百科全书

标签体系下的用户画像建设小指南

4万字长文 | ClickHouse基础&实践&调优全视角解析

【面试&个人成长】社招和校招的经验之谈

大数据方向另一个十年开启 |《硬刚系列》第一版完结

我写过的关于成长/面试/职场进阶的文章

当我们在学习Hive的时候在学习什么?「硬刚Hive续集」

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

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

相关文章

EmguCV学习笔记 VB.Net 7.1 角点检测

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

【React】跨域问题详解及解决方案

文章目录 一、什么是跨域问题?1. 同源策略的定义2. CORS 机制 二、在 React 项目中遇到的跨域问题常见的跨域错误信息 三、解决 React 中跨域问题的方法1. 在后端服务器上配置 CORS2. 在 React 项目中使用代理 (Proxy)2.1 使用 http-proxy-middleware 实现代理1. 安…

SAP主数据删除

项目场景: SAP项目上线初期,主数据批到相关的操作 操作描述 需要对供应商,客户,科目进行维护操作,比如这些数据创建错误,不想留一些垃圾数据在系统里面 解决方案: 事务代码:OBR2…

低侧与高侧电流检测对比

1 简介 在处理低至中等电流水平时,电阻电流检测广泛用于印刷电路板组件。使用这种技术,将一个已知的电阻 R分流器与负载串联,并测量电阻两端的电压以确定负载电流。如下图所示。 电流检测电阻器,也称为分流电阻器或简称为分流器&a…

Python TensorFlow实战篇

概述 本篇博客将详细介绍如何使用Python和TensorFlow解决实际问题,包括图像分类、序列预测以及模型部署等内容。我们将从以下几个方面进行深入探讨: 图像分类实战:使用卷积神经网络(CNN)进行图像分类。序列预测实战&…

模型 KT决策法

系列文章 分享 模型,了解更多👉 模型_思维模型目录。系统分析,明智选择。 1 KT决策法的应用 1.1 餐饮连锁店菜单更新 一家餐饮连锁店计划更新菜单,以吸引更多顾客并提高销售额。使用 KT 决策法(Kepner-Tregoe&#x…

哪些领域最适合采用音视频私有化解决方案?

随着数字化时代的到来,音视频通信已成为各行各业不可或缺的一部分,从企业内部沟通到在线教育、远程医疗、金融交易等,无一不依赖于稳定、高效且安全的音视频技术。然而,不同的行业对音视频通信的需求各不相同,尤其在数…

【Denuvo加密】黑神话悟空为什么没有破解版?Denuvo加密技术的详细解析与代码示例

文章目录 1. 引言2. 加密技术概述3. D加密技术的工作原理4. D加密技术的实现5. D加密技术的实际应用6.实现原理7. 本篇小结 更多相关内容可查看 1. 引言 随着游戏产业的蓬勃发展,游戏数据的保护成为了重要议题。《黑神话:悟空》作为一款备受期待的游戏&…

大型商业中心的绿色转型之路

在全球可持续发展浪潮的推动下,大型商业中心正悄然蜕变,从能源消耗大户转变为绿色运营的先锋。在这个转型的舞台上,商场电气管理者们以创新的智慧与坚定的决心,绘制出一幅幅节能减排、低碳生活的美好蓝图。 面对大型商业中心复杂…

职业本科物联网与智能感知实训室解决方案

一、前言 在当今这个数字化、智能化飞速发展的时代,物联网(IoT)与智能感知技术已成为推动产业升级、促进经济社会发展的重要力量。为了适应这一趋势,培养具备物联网技术应用与智能感知系统设计能力的高素质技术技能型人才&#xf…

遗传算法与深度学习实战(8)——使用遗传算法解决旅行商问题

遗传算法与深度学习实战(8)——使用遗传算法解决旅行商问题 0. 前言1. 旅行商问题2. NP 问题3. 构建 TSP 求解器小结系列链接 0. 前言 旅行商问题 (Traveling Salesman Problem, TSP) 是一个经典的优化问题,其目标是找到一条最短的路径&…

280Hz显示器怎么选

280Hz显示器怎么选?今天就给大家带来6大品牌和型号的280Hz显示器一起对比对比! 1.280Hz显示器 - HKC G27H3显示器 当电竞遇上显示器,就像是超级英雄找到了他的战衣,完美搭配,所向披靡。今天,我们要聊的这款…

XSS LABS - Level 15 过关思路

关注这个靶场的其他相关笔记:XSS - LABS —— 靶场笔记合集-CSDN博客 0x01:过关流程 进入靶场,老流程,右击查看网页源码,看看有没有接收传参并回显的位置: 可以发现,src 接收的参数被回显了&am…

探索未来交互——Open LLM VTuber:一款基于AI大模型的二次元虚拟主播

随着人工智能技术的飞速发展,虚拟主播(VTuber)行业迎来了全新的变革。本文将介绍一个令人兴奋的开源项目——Open LLM VTuber,这是一个本地运行的、可高度定制的虚拟主播平台,它不仅支持多种语言模型(LLM)、自动语音识别(ASR)和文本转语音(TTS)后端,而且能够跨操作…

SingleChildScrollView使用

Flutter 中,SingleChildScrollView(类比Android中的ScrollView) 是一个可以滚动单个子控件的小部件。当子控件的大小超过视图时,用户可以滚动以查看所有内容。SingleChildScrollView 通常用于创建可滚动的表单、列表或任何需要垂直…

使用C++和PCL创建模拟点云

【版权声明】本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。 参考书籍:《人工智能点云处理及深度学习算法》 本文为专栏《Python三维点云实战宝典》系列文章,专栏介绍地址“【python三维深度学习】python…

深入解析 ASP.NET 的 ViewState 反序列化漏洞

1. ViewState 基本知识 1.1 什么是 ViewState ViewState 是 ASP.NET(Active Server Pages .NET)框架用来保持页面状态的一种机制。ASP.NET 是微软开发的用于动态网页服务器端开发的框架,ViewState 是其中用于维护和管理页面状态的一部分。…

netty编程之结合springboot一起使用

写在前面 源码 。 本文看下netty结合springboot如何使用。 1:netty server部分 server类(不要main,后续通过springboot来启动咯!): package com.dahuyou.netty.springboot.server;import io.netty.bootstrap.Serve…

设置视图的宽高

AndroidManifest.xml <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"><applicationandroid:allowBackup"true"android:icon"mipmap/ic_launcher…

JS 实现栈和队列

JS实现栈和队列 栈是先进后出 function Stack() {this.arr [];// push方法是把数据放入栈中this.push function (value) {this.arr.push(value);}// pop 是取数组的最后一个数据&#xff0c;从而实现先进后出this.pop function () {this.arr.pop();} }var stack new Stac…