Flink任务实战优化

前言:一个好产品,功能应该尽量包装在服务内部;对于Flink而言,无疑是做到了这一点。但是用户在使用Flink的时候,依然可以从版本的选择、代码逻辑、资源参数、业务的数据情况等方面做任务级的定制化优化;用最合理的资源使用,保障实时性、稳定性和最佳Tps的处理能力。

一、Flink任务优化分析

1.1 参考Spark的优化方式

对于任何的技术发展,后来的的技术架构都可以参考之前优秀竞品的设计思想或缺陷,然后加以改进和优化。大数据分布式计算领域,Flink在设计自己的功能时,都做了哪些努力,让其在实现自己特性的同时,依旧保障了高性能。参考Spark的性能优化:Saprk可以从开发调优(RDD使用、算子区别、序列化方式、对象等)、资源参数调优(Driver、Executor数量和大小等)、数据负载调优(数据倾斜处理)、shuffle调优(shuffle方式和局部内存配置),四个方面做优化。

1.2 任务开发分析

Flink在开发阶段:Flink有四个模块的SDK提供数据操作API:DateStream、DataSet、FlinkTbale、FlinkSQL;

其他有Checkpoint配置、RocksDB选择存储,如同RDD类似;所以在开发层面,设置Checkpoint配置、判断是否选择RocksDB作为状态存储,基本可以把精力聚焦在逻辑层面;当然在sink阶段,可以对写入中间件的客户端做组件级的优化,减轻写入背压。

1.3 资源参数分析

资源参数分析:Flink任务可以动态调节并发数(slot),分配CPU资源;内存主要有JobManager和TaskManager两个进程,TaskManager中有多个内存级线程任务;所以可以从slot数、两个进程资源的大小、以及TaskManager进程内部的多个局部内存的使用情况,精细化调节、优化任务;

1.4 数据负载分析

Flink数据负载分析:Flink也是并发处理,所以存在数据在某个阶段的单个任务高负载运行,这种时候要排查出高聚合数据,然后做特殊处理;实时处理不存在阶段影响、理想存在阶段计算结果落磁盘,数据负载在离线场景上比实时场景上,对任务性能影响更大。

1.5 Shuffle分析

spark的计算架构是阶段式计算,每处理完上一个阶段的计算,会把内存溢出的结果写入磁盘,下个阶段从内存和磁盘读取上阶段结果再做计算;spark的主要性能就消耗在每个阶段之间的shuffle上;Spark用单独的进程管理shuffle阶段的操作,有多种不同的shuffle模式选择(如:HashShuffle、SortShuffle等),涉及多个shuffleManager进程的内存配置优化;

Flink1.16版本之前,实时计算和离线计算使用不同的shuffle模式;实时计算使用Pipelined Shuffle计算Task任务,离线计算使用 Blocking Shuffle计算任务,Flink1.16之后,新加入了Hybrid Shuffle处理方式计算。

二、Flink任务优化操作

总结第一节四个方面的内容:Flink可以从代码开发、资源参数配置、数据负载三个方面做任何版本的任务级优化;可以通过对FLink版本的选择,做到离线计算shuffle级的优化。

2.1 Flink开发调优
2.1.1 开发SDK选择

对于没有边界数据流的实时处理和有边界数据流的离线处理,可以选择不同的SDK开发,

关系如下:

不涉及状态、窗口、时间的操作,可以用SQL表达(数据分析和数据管道);细粒度的操作就需要底层核心API做数据处理了,比如调用外部接口,中间数据层操作等;提供多种方式,按照需求选择,正常表达业务逻辑就行。

2.1.2 其他代码层优化操作

CheckPoint的配置选择:在Flink中,CheckPoint、State与Backend存储方式,共同保障实时任务运行时的容错(离线没有);CheckPoint有多种配置,能从运行模式、检查间隔、State快照大小和数量等方面做配置调优,StateBackend可以选择多种方式,保障CheakPoint生成状态的存储。

可以根据业务量大小、业务实时效果、业务的重要程度,调节Checkpoint和StateBackend的如下参数,观测各种任务指标的各种情况优化:

CheckPoint与StateBackend代码配置如下:

注:Checkpoint配置类属性,可检测CheckpointConfig配置类,里面有所有的配置项,我就不在这里截图了。

除此之外:

Flink在sink得时候,包装的是中间件得客户端,如Kafka、ES、Redis、Mysql等;

每个中间件客户端都有自己的优化配置:

比如Kafka客户端优化:单条size(默认1M)、bufferSize大小写、条数写、连接超时、连接数等;

比如ES客户端优化:批次写设置、间隔写设置、连接超时设置等;

比如Redis客户端优化:连接数,连接时常等设置;

比如Mysql客户端优化:客户端连接数等配置;

2.2 Flink资源参数配置优化

Flink在资源参数调优方面:可以对slots并发数、TaskManager内存大小、JobManager内存大小做Flink进程级调参优化;

在TaskManager内部,有多个内存概念,分别用来存储不同阶段、不同状态的数据,比如:托管内存、网络内存等;

除此之外,当使用Java开发Flink任务时,还可以对Java的Gc做选择,比如:-Denv.java.opts="-Dfile.encoding=UTF-8";

yarn启动方式样例参考:

TaskManager局部组件内存级参数配置如下:

TaskManager进程,内存架构图:

2.3 数据负载优化

如何观察数据负载现象:在Flink的运行的时候,taskManagers的task会记录数据情况;

如下图:是一个生产任务,并发任务之间就有五倍的负载差距;

出现负载了要如何做呢?

这里就和前面算子计算reBalance有关;

比如实时计算时:source是kafka:就和kafka的分区数据负载有关,可以从Kafka的数据生产者配置分区轮询;

如果是算子间,对于大负载的task,对读出数据的算子做key均匀打散,初次计算完后,再还原key做二次聚合;

离线计算时:对于分组计算,task负载操作类似;

Flink本身的运行机制,保证数据计算会快速释放资源,所以这个优化只是让资源释放更快,加大业务的单点TPS。

2.4 Shuffle优化

Flink社区多个版本整体上存在三种shuffle:Pipelined Shuffle、Blocking Shuffle、Hybrid Shuffle

这三者有什么区别呢?

Pipelined Shuffle方式可以全在内存中实时计算task,通过网络内存(netWork)做缓冲,且没有阶段计算等待限制; Blocking Shuffle方式每个阶段都要全部task计算完,落地到磁盘,下一个阶段再从磁盘读取开始计算;Hybrid Shuffle结合 Pipelined Shuffle实时快速计算的特性和Blocking Shuffle写磁盘稳定性特性,让离线计算不用每个阶段task算完和必须落地到磁盘的操作,当内存资源足够的时候基本可以不落地到磁盘;利用了Flink实时流快速计算的特性,写磁盘做为安全保障,保障离线计算的处理能力。

Flink没有ShuffleManager管理进程,它使用对内存资源队列感知和背压的方式,巧妙地解决了shuffle过程的定制化管理;可以说对于Flink的shuffle阶段,Flink基本在逻辑内部就自动实现了,没有spark那样需要专门做shuffleManager做内存管理。

三、总结

Flink任务分离线和实时两种计算场景:

从版本性能上:对于实时处理,各版本的设计架构基本一致;Flink1.15和Flink1.16对离线处理,任务管理架构,做了比较大的调整,相比Spark的计算管理架构和Flink之前的Blocking Shuffle方式,有了较大的性能提升;

从代码逻辑上:Flink实时处理通过对Checkpoint的配置、状态后端存储方式选择,离线对每个批处理的数量配置等,做特殊配置优化处理;以及开发SDK模块的选择,做到尽量只关心开发逻辑的的优化;

从资源参数配置上:离线和实时均可以从>的并发数量,JobManager、taskManager进程资源大小,以及taskManager内部,托管内存,网络内存等局部内存上优化运行任务。

从数据负载上:实时任务由于其快速的资源使用与释放,数据负载影响不大,但是对实时数据负载的优化,可以提升最大TPS的数据处理能力(数百万TPS);离线任务在早期的版本架构中,因为Blocking Shuffle阶段结果数据要整体落到磁盘,数据负载会直接导致局部资源等待,所以数据负载对离线处理的性能影响很大,1.15版本后,优化离线处理方式之后,数据负载的影响在服务内部技术架构上优化掉了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenMv颜色识别

本文旨在分享OpenMv实现数字识别并通过串口打印出来的工程源码。如果大家想将识别的结果传给单片机,即OpenMv与单片机之间的通信,可以参考以下文章: OpenMV与STM32之间的通信(附源码)_openmv与stm32串口-CSDN博客 ​​…

webpack学习笔记

为什么要使用Webpack webpack是一个用于现代JavaScript应用程序的静态模块打包工具。在webpack里一切文件皆模块,通过loader转换文件,通过plugin注入钩子,最后输出由多个模块组合成的文件,webpack专注构建模块化项目。 webPack可以…

HTTPS详解及openssl简单使用

本文介绍https传输协议中涉及的概念,流程,算法,如何实现等相关内容。 HTTP传输过程 HTTP 之所以被 HTTPS 取代,最大的原因就是不安全,至于为什么不安全,看了下面这张图就一目了然了 HTTP 在传输数据的过程…

pulsar的架构与特性记录

一、什么是云原生 云原生的概念是2013年Matt Stine提出的,到目前为止,云原生的概念发生了多次变更,目前最新对云原生定义为: Devps持续交付微服务容器 而符合云原生架构的应用程序是: 采用开源堆栈(K8SDocker)进行容器化,基于微服务架构提高灵…

java.net.ConnectException: Connection refused: connect已解决

🥚今日鸡汤🥚 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 —— 《枫》 遇见问题莫着急,着急也没用~😶‍🌫️ 目录 🧂1.令人发麻的问题 &am…

vue/vue3/js来动态修改我们的界面浏览器上面的文字和图标

前言&#xff1a; 整理vue/vue3项目中修改界面浏览器上面的文字和图标的方法。 效果&#xff1a; vue2/vue3: 默认修改 public/index.html index.html <!DOCTYPE html> <html lang"en"><head><link rel"icon" type"image/sv…

Logstash:迁移数据到 Elasticsearch

在生产环境中&#xff0c;不使用 Apache Kafka 等流平台进行数据迁移并不是一个好的做法。 在这篇文章中&#xff0c;我们将详细探讨 Apache Kafka 和 Logstash 的关系。 但首先让我们简单了解一下 Apache Kafka 的含义。 Apache Kafka 是分布式流平台&#xff0c;擅长实时数据…

Qt QRadioButton单选按钮控件

文章目录 1 属性和方法1.1 文本1.2 选中状态1.3 自动排他1.4 信号和槽 2 实例2.1 布局2.2 代码实现 Qt中的单选按钮类是QRadioButton它是一个可以切换选中&#xff08;checked&#xff09;或未选中&#xff08;unchecked&#xff09;状态的单选按钮单选按钮常用在“多选一”的场…

【Python学习】Python学习12-字典

目录 【Python学习】Python学习12-字典 前言创建语法访问列表中的值修改与新增字典删除字典元素Python字典内置函数&方法参考 文章所属专区 Python学习 前言 本章节主要说明Python的字典&#xff0c;是可变的容器&#xff0c;每个字典由键值对组成用冒号隔开&#xff0c;…

预训练中文GPT2(包括重新训练tokenizer)

训练数据 1.json后缀的文件 2.数据是json line格式&#xff0c;一行一条json 3. json结构如下 {"content": "①北京和上海户籍的游客可获得韩国多次签证&#xff1b;②“整容客”可以不经由韩国使领馆、直接在网上申请签证&#xff1b;③中泰免签的实施日期…

SpringBoot中使用单例模式+ScheduledExecutorService实现异步多线程任务(若依源码学习)

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_本地运行若依前后端分离-CSDN博客 设计模式-单例模式-饿汉式单例模式、懒汉式单例模式、静态内部类在Java中的使用示例&#xff1a; 设计模式-单例模…

Android SDK环境搭建[图解]; 解决问题Done. Nothing was installed.

安装SDK Android SDK环境搭建 依赖java环境,需要自备Java环境 (100%实操成功) 目录 1. 解压&#xff1a;解压到非中文无特殊字符的目录 2. 双击&#xff1a;SDK Manager.exe&#xff0c;不要选全部!不要选全部!不要选全部!(会下很久) 3. 然后勾选组件​ 4. 设置环境变量 …

安装ubuntu22.04系统,GPU驱动,cuda,cudnn,python环境,pycharm

需要准备一个u盘&#xff0c;需要格式化&#xff0c;且内存不小于8g 1 下载ubuntu镜像 下载链接&#xff1a; https://cn.ubuntu.com/download/desktop 2下载rufus Rufus - 轻松创建 USB 启动盘Rufus: Create bootable USB drives the easy wayhttps://rufus.ie/zh/ 准备好这…

用Linux的视角来理解缓冲区概念

缓冲区的认识 缓冲区&#xff08;buffer&#xff09;是存储数据的临时存储区域。当我们用C语言向文件中写入数据时&#xff0c;数据并不会直接的写到文件中&#xff0c;中途还经过了缓冲区&#xff0c;而我们需要对缓冲区的数据进行刷新&#xff0c;那么数据才算写到文件当中。…

STL之list

目录 list定义和结构 list容器模板接受两个参数&#xff1a; list容器的特点 双向性 动态大小 不连续存储 实例 代码输出 需要注意的点 list常用函数 代码示例 list定义和结构 list的使用频率不高&#xff0c;在做题时极少遇到需要使用list的情景。 list是一种双向…

LeetCode 232.用栈实现队列(详解) (๑•̌.•๑)

题目描述&#xff1a; 解题思路&#xff1a; 创建两个栈&#xff0c;一个用于入数据&#xff0c;一个用于出数据。分别是pushST和popST; 1.如果是入数据就直接入进pushST 2.如果是出数据&#xff0c;先检查popST中有无数据&#xff0c;如果有数据&#xff0c;就直接出。如果没…

Xcode15 升级问题记录

这里写自定义目录标题 新版本Xcode15升级问题1&#xff1a;rsync error: some files could not be transferred (code 23) at ...参考 新版本Xcode15升级 下载地址&#xff1a;https://developer.apple.com/download/all/ 我目前使用的版本是Xcode15.2 我新创建了一个项目&…

建立四叉树[中等]

一、题目 给你一个n * n矩阵grid&#xff0c;矩阵由若干0和1组成。请你用四叉树表示该矩阵grid。你需要返回能表示矩阵grid的四叉树的根结点。四叉树数据结构中&#xff0c;每个内部节点只有四个子节点。此外&#xff0c;每个节点都有两个属性&#xff1a; 【1】val&#xff1…

使用SpringCache操作Redis缓存数据

SpringCache概念 SpringCache是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单的加一个注解&#xff0c;就能实现缓存功能。 SpringCache提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;例如&#xff1a; EHCacheCaffeineRedis 使…

怎么在unity3D工程中导入Newtonsoft.Json

打开 Unity 编辑器。 转到菜单栏的 “Window”&#xff08;窗口&#xff09;选项&#xff0c;然后选择 “Package Manager”&#xff08;包管理器&#xff09; 在搜索框中输入 “Newtonsoft Json” 进行搜索。 注意&#xff1a;要选择Unity Registry 在搜索结果中&#xf…