【性能调优】【离线任务】flink处理离线任务(8000个小文件?200多亿数据量?)稳定性与性能调优探索

news2025/2/25 8:29:50

文章目录

  • 一、场景描述
    • 1. 任务类型描述
    • 2. 问题任务
  • 二、相关理论
    • 1.Task Slots and Resources
      • 1.1. slots与资源的隔离和共享
      • 1.2 建议cpu和slot数关系
    • 2. tm的资源配置是否合适
      • 2.1. flink load problems
      • 2.2. 阿里 flink资源配置建议
  • 三、问题分析与解决
    • 1. 测试结果比对
      • 1.1. 任务1
      • 1.2. 任务2
      • 1.3. 任务3
  • 四、离线任务性能调优小结ing

一、场景描述

1. 任务类型描述

运行的是flink的离线任务,任务大都是处理:从HDFS到HIVE的数据清洗任务

这类任务的特点是数据来一条处理一条,所以任务大都是没有状态的。

2. 问题任务

任务情况描述:

数据源: 在hdfs上有301个文件,每个文件9.6G(压缩后的大小),总共大约240亿条数据。
处理:对于每条数据通过正则去摄取目标数据。
任务配置:301并发、tm:10core、10slots、15G内存、jm: 10core、8G内存。那将会产生32个container(运行在yarn中)。

 

问题描述:

任务运行的速度大概在1.2亿/min,运行2小时50多分钟。但是任务会偶发的报hadoop集群的问题,以至于后面这个任务少了几天数据,任务都跑不下去。
虽然看报错是hadoop集群的问题,如下:
connection reset by peer
在这里插入图片描述
 
EOFException: End of File Exception在这里插入图片描述

其他类似的任务运行的很稳定,“事出反常必有妖”: 本文尝试从内存、并发的角度分析任务的稳定性及任务运行速度等问题。
 
 

二、相关理论

1.Task Slots and Resources

1.1. slots与资源的隔离和共享

官网 Task Slots and Resources

Each worker (TaskManager) is a JVM process, and may execute one or more subtasks in separate threads. To control how many tasks a worker accepts, a worker has so called task slots (at least one).
 
Each task slot represents a fixed subset of resources of the TaskManager. A TaskManager with three slots, for example, will dedicate 1/3 of its managed memory to each slot. Slotting the resources means that a subtask will not compete with subtasks from other jobs for managed memory, but instead has a certain amount of reserved managed memory. Note that no CPU isolation happens here; currently slots only separate the managed memory of tasks.
 
By adjusting the number of task slots, users can define how subtasks are isolated from each other. Having one slot per TaskManager means each task group runs in a separate JVM (which can be started in a separate container, for example). Having multiple slots means more subtasks share the same JVM. Tasks in the same JVM share TCP connections (via multiplexing) and heartbeat messages. They may also share data sets and data structures, thus reducing the per-task overhead.

这里能得到消息:

  1. 每一个tm都是一个jvm进程,一个tm可能执行一个或多个subtask在各自的线程(其实就是slot)中。
     
  2. 每一个slot代表tm 固定的资源子集,
    比如:一个tm有3个slot,那么将tm将均匀分配它的托管内存( ?)给每个slot。slot意味着subtask将不会占用其他subtasks的资源,而是会拥有固定预留的托管内存。但注意这里没有cpu的隔离,目前slots仅分离(隔离?)了托管内存。
     
  3. 通过调整tm内slot的数量,用户可以定义subtasks之间的隔离方式
    比如:当tm只有一个slot,意味着每个task组都运行在单独JVM运行(比如yarn的container)。当tm有多个slot时,意味着多个子任务共享同一个JVM。同一个JVM的subtasks共享TCP(通过多路复用)连接和心跳消息,他们还可以共享数据集和数据结构,从而减少每个任务的开销。(所以推荐一个tm包含多个slot)

 
小结:

  1. tm是一个jvm进程,一个tm可能执行一个或多个subtask在各自的线程(slot)中。
  2. tm的(托管)内存资源会根据slot的数量而分开,但是tm中的 TCP(通过多路复用)连接、心跳消息、共享数据集、数据结构和cpu资源各slot会共享。

所以我们可以设置多个slot 在一个tm中,来实现资源共享。但是要放多少个slot呢?

 
 

1.2 建议cpu和slot数关系

As a rule-of-thumb, a good default number of task slots would be the number of CPU cores. With hyper-threading, each slot then takes 2 or more hardware thread contexts.
 
根据经验,一个好的任务插槽的默认数量应该是CPU内核的数量。但如果考虑到使用超线程,每个插槽将接受2个或更多硬件线程上下文。

有超线程的机器可以建议设置:numOfslots = 2 * numOfcores ,没有超线程的机器建议设置:numOfslot = numOfcore。

这里可以思考:

没有超线程就不能设置numOfslots > numOfcores了吗?毕竟我们的任务是IO密集型的任务,这个可以测试一下。
 
参考:
Ideal Number of Task Slots

 

2. tm的资源配置是否合适

目前配置的tm是:10core、10slot、15G,但是跑上述任务时,任务不稳定,这里我查到一些网络上的信息:

2.1. flink load problems

flink load problems

There’s also the consideration of Flink’s scheduling algorithm. We’ve frequently run into problems where, with multiple hosts running one large task manager a piece, all jobs get scheduled to one host, which can cause load problems.

Flink的调度算法:我们经常遇到这样的问题:当多个主机(tm)同时运行一个大型任务管理器时,所有作业都被调度到一个主机上,这可能会导致负载问题。
 
We ended up making multiple smaller task managers per host and jobs seem to be distributed better (although they still cluster on one node often).
我们最终在每个主机上创建了多个较小的任务管理器,并且作业似乎可以更好地分布(尽管它们仍然经常聚集在一个节点上)。

简单的总结上面的经验就是:调小tm的资源(cpu和memory),作业可以更好的分布。

场景对应的应该是:当任务的数据集中在个别节点的时候。

 

2.2. 阿里 flink资源配置建议

阿里 flink资源配置建议

TaskManager资源设置不宜过小,也不宜过大:

  1. 如果单个TaskManager资源过小,则可能影响其上作业的稳定性,并且由于其Slot数目不多,无法有效平摊TaskManager的开销,降低了资源的利用效率。
  2. 如果单个TaskManager资源过大,则TaskManager上运行的作业数会很多,一旦TaskManager发生单点故障,影响面会很大。

小结:

  1. 当tm设置的资源过大时,遇到单点问题影响面很大。
  2. 目前看在部署taskmanager <10core,15G> 时,tm资源设置的大了,造成的单点故障的概率提高。

 
 

三、问题分析与解决

总体的调整思路:

  1. 目前<10core,15G> 的设置导致当任务规模(301个文件 241亿数据)到达一定水平时任务运行的将变得不稳定,所以这里调小Tm的<cores、memory>。
  2. 因为任务的特点是IO密集型,所以可以考虑1个cpu对应多个slot个数,这里flink建议是2倍,但需要测试。
  3. 当减小每个Tm的资源时,Tm的个数将会增加在相同任务下,这时需要考虑Jobmanager的调度压力和管理压力,是否对任务运行的稳定性和效率有所影响。

1. 测试结果比对

1.1. 任务1

数据源: 在hdfs上有301个文件,每个文件9.6G(压缩后的大小),接收后11TB,总共大约240亿条数据、
处理:对于每条数据通过正则去摄取目标数据。
任务初始配置:301并发、tm:10core、10slots、15G内存、jm: 10core、8G内存。那将会产生32个container(运行在yarn中)。

序号任务设置描述运行结果
1301并发、tm:<10core 10slots 15G>1.18亿/min、71亿/h、偶发性失败
2301并发、tm:<1core 2slots 4G>0.5亿/min,242亿运行了6.5小时
3301并发、tm:<1core 2slots 8G>2/3亿/min、44亿/h
4301并发、tm:<1core 4slots 8G>0.3亿/min、18亿/h,速度更慢了
5301并发、tm:<3core 6slots 12G>2/3亿/min、44亿/h
6301并发、tm:<5core 10slots 15G>5/6亿/min、50亿/h
7301并发、tm:<6core 6slots 12G/9G>1.18亿/min、71亿/h、2个多小时跑完
8301并发、tm:<4core 4slots 6G>1.18亿/min、71亿/h、2个多小时跑完
9301并发、tm:<4core 4slots 4G>1.18亿/min、71亿/h、2个多小时跑完;
测试多次稳定跑完

 
现在从3个方面讨论任务运行的情况:

1.速度:

  1. 从第2,3,5运行结果对比:可以看出yarn集群对于1core支持多并发的速度没有达到超线程效果、或对于hdfs到hive的io密集型任务没有收获很好的效果;
  2. 从第4运行结果看出:当1core 对应 4并发时,速度下降接近一半;

2.内存使用与资源共享

  1. 从5、6运行结果对比看出:随着一个tm的slot数的增多,速度有所提升(提升不高),这里可以暂时认为是tm内的 TCP连接、心跳消息、共享数据集、数据结构和cpu资源等起到了共享的作用。
  2. 从7、8、9运行结果对比:可以看出运行速度基本都到了最高峰,此时tm的共享、内存的提高均没有提升flink的运行速度。

3.稳定性

  1. 从9运行结果:可以看出运行速度达到了最快,且多次运行后都能稳定运行完。
  2. 之前遇到的任务不稳定相关问题见:【报错】flink源码分析: has no more allocated slots与思考

 

1.2. 任务2

数据源: 在hdfs上有1000多个文件,每个文件1G(压缩后的大小),总共大约4.5亿条数据
处理:对于每条数据通过正则去摄取目标数据。

序号任务设置描述运行结果
11000并发、tm:<4core 4slots 6G>,共有251个container部署花费了20分钟之多。。。,运行花费了15分钟,总共35分钟
11000并发、tm:<4core 4slots 4G>,共有251个container总共花费了15分钟

分析
ing。

 

1.3. 任务3

数据源: 在hdfs上有1000多个文件,每个文件十几k(压缩后的大小),总共大约320万条数据
处理:对于每条数据通过正则去摄取目标数据。

序号任务设置描述运行结果
11000并发、tm:<4core 4slots 4G>,总共有251个container部署花费了6分钟,运行了5分钟
21000并发、tm:<4core 10slots 4G>,总共有251个container部署花费了6分钟,运行了5分钟

 
对于一个文件数特别多但文件都很小的情况下,我这里在相同cores下提高slot数(并发),那在相同任务并发的情况下,task的数量将减少

  1. 这样会增加tm资源共享的能力
  2. 一批数据运行完之后调度的时间变短,
  3. 再假设每次仅通过一次拉取数据就能处理完一个文件,即在调高slot数量之后,处理速度还高于flink“单次”处理数据速度峰值,这样总的处理时间将会和原来差不多或者更短。

 
 

四、离线任务性能调优小结ing

 
 

实时任务的资源优化配置更加复杂,相关参考见:

How To Size Your Apache Flink® Cluster: A Back-of-the-Envelope Calculation

3 (More) Tips for Optimizing Apache Flink Applications

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

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

相关文章

小程序学习(2)-----常用的各类组件

新建项目 项目->新建项目-小程序&#xff0c;如下图所示 新建小程序页面 只需要在 app.json->pages 中新增页面的存放路径&#xff0c;小程序开发者工具可帮我们自动创建对应的页面文件&#xff0c;如图所示&#xff1a; 2.常用的视图容器类组件 ① view 普通视图区域类…

Java基础算法每日5道详解(3)

136. Single Number 单号 Given a non-empty array of integers nums, every element appears twice except for one. Find that single one. You must implement a solution with a linear runtime complexity and use only constant extra space. 给定一个非空整数数组 nu…

在Multisim导入TI提供的SPICE模型

对在multisim中导入TI模型的一个记录。 multisim中只有常规的元器件&#xff0c;对于很多元器件multisim都没有相应的模型&#xff0c;这就需要手动导入了。 Multisim导入模型1、从官网下载相应的模型文件2、在Multisim中导入模型3、写在后面1、从官网下载相应的模型文件 &…

c/c++ 函数(一) setw()、isdigit()、isalpha()、atoi()、itoa()

目录 1、setw(int n) <iomanip> 2、int isdigit(char ch) <ctype.h> 3、int isalpha(int c) <ctype.h> 4、int atoi(const char* str) <stdlib.h> 5、char* itoa(int num) <stdlib.h> 1、se…

Linux 基本权限

目录 1 shell命令以及运行原理 1.1 理解 1.2 意义 2 Linux权限的概念 2.1 概念 2.2 用户分类 2.3 Linux文件属性 2.4 Linux文件权限 2.4.1 文件访问者的分类&#xff08;人&#xff09; 2.4.2 root&&普通用户 vs 拥有者&&所属组&&other 2.4…

异步架构,避免相互依赖的系统耦合

前言&#xff1a; 使用缓存架构可以减少不必要的计算&#xff0c;快速响应用户请求&#xff0c;但是缓存只能改善系统的读操作性能&#xff0c;也就是在读取数据的时候&#xff0c;可以不从数据源中读取&#xff0c;而是通过缓存读取&#xff0c;以加速数据的读取速度。 但是…

vulnhub DC系列 DC-6

总结:wpscan爆破&#xff0c;nmap提权 下载地址 DC-6.zip (Size: 619 MB)Download: http://www.five86.com/downloads/DC-6.zipDownload (Mirror): https://download.vulnhub.com/dc/DC-6.zip使用方法:解压后&#xff0c;使用vm直接打开ova文件。 漏洞分析 信息收集 这里还是使…

4. 数据处理:用R语言实现【多路替换】真高效!!

b站课程视频链接&#xff1a; https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新&#xff0c;但是要花钱&#xff0c;我花99&#x1f622;&#x1f622;元买了&#xff0c;感觉讲的没问题&#xff0c;就是知识点结构有点乱&#xff09;&#xff1a;https://ke.qq…

Linux中的vim最小集、指令集及其配置

目录 1. vim 最小集 2 vim指令集 2.1 命令模式的指令 2.1.1 插入模式 2.1.2 移动光标 2.1.3 删除文字 2.1.4 复制 2.1.5 替换 2.1.6 撤销 2.1.7 更改 2.1.8 跳至指定的行 2.1.9 shift ~:快速大小写切换 2.2 末行模式的指令 2.2.1 set nu/set nonu 2.2.2 vs file…

【自学Python】Python变量

Python变量 Python变量教程 不论是使用哪种高级程序语言编写程序&#xff0c;变量都是其程序的基本组成单位。变量相当于内存中一个数据存储空间的表示&#xff0c;通过变量名可以访问到变量的具体的值。 Python变量 Python 是弱类型语言&#xff0c;因此 Python 变量无须声…

Hudi的核心概念 —— 时间轴(TimeLine)

文章目录时间轴&#xff08;TimeLine&#xff09;时间轴&#xff08;TimeLine&#xff09; 就是一个时间线&#xff0c;它的每一个操作都记录在内&#xff0c;每一个时刻&#xff0c;你做了什么事情&#xff0c;对某一个时刻&#xff0c;记录一个时刻的数据 Hudi 的核心是维护…

擎创运维大数据治理解决方案,荣膺金融业数字化转型突出贡献奖

近日&#xff0c;由《金融电子化》杂志社主办的“2022中国金融科技年会暨第十三届金融科技应用创新奖颁奖典礼”成功于线上举办。擎创科技“运维大数据治理解决方案”&#xff0c;荣膺“2022科技赋能金融业数字化转型突出贡献奖”。人民银行《金融科技发展规划&#xff08;2022…

C++ string类

在c语言中&#xff0c;我们想要记录字符串需要创建一个字符串的数组&#xff0c;而c则提供了另一种方式&#xff1b; 也就是这篇博客所说的string类&#xff1b; string类 #include<string> 作为字符串数组的升级版&#xff0c;string类自然也有它的独特之处——可变长数…

自动驾驶标定基础知识

目录基础概念1. 缩略语2. 为什么需要外参标定3. 基于使用场景的标定分类4. 基于方法的分类5. 基础坐标系6. 超差EOL标定1.EOL特点2. EOL标定流程3. EOL标定软件约束4. EOL标定软件流程5. 算法设计原则6. 算法基本原理背景式标定1.背景式标定的特点2. 背景式标定运行流程3. 背景…

高级树结构之线索化二叉树

文章目录一 线索化二叉树简介二 线索化规则三 前序线索化3.1 代码演示四 中序线索化4.1 代码演示五 后序线索化5.1 代码演示一 线索化二叉树简介 线索化&#xff1a;将一颗二叉树的结点指向为空的指针&#xff0c;线索化为某一种顺序遍历的的指向下一个按顺序的结点的指针一颗…

虚拟主机3种方式nginx/apache+跨域知识点整理

目录referer、prototype、array、json笔记整理: [http://t.csdn.cn/s4P8x](http://t.csdn.cn/s4P8x)虚拟主机3种方式nginx/apache跨域知识点整理一、Apache基于多IP、多端口、多域名访问1、添加网卡三种方法1、虚拟机添加网络适配器2、命令添加3、用nmtui 添加ip地址2、添加配置…

Jwt 最流行的跨域身份验证解决方案

1. 什么是JWT JSON Web Token (JWT)是一个开放标准(RFC 7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名的。 JWT被设计为紧凑且安全的&#xff0c;特别适用于分…

Python制做一个电脑通知小工具,再也不怕忘记事情拉~

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ Windows不是有个消息通知功能&#xff0c;挺喜欢这个功能的&#xff0c; 但是不太方便使用&#xff0c;也懒得去研究&#xff0c; 于是准备用Python自己写一个&#xff0c;通过设定通知的间隔时…

Pikachu靶场暴力破解通关

目录 字典获取 BP四种攻击模式 一、Sniper(狙击手模式) 二、Battering ram(攻城锤模式) 三、Pitchfork(叉子模式) 四、Cluster bomb(炸弹模式) 靶场练习 基于表单的暴力破解 验证码绕过(on server) 验证码绕过(on client) token防爆破? 字典获取 在github里找到心…

公司注册商标的流程是什么

公司商标注册流程是什么? 1、商标查询。查询有关商标登记注册情况&#xff0c;以了解自己准备申请注册的商标是否与他人已经注册或正在注册的商标相同或近似的程序; 2、申请文件准备。商标注册申请书;)商标图样;申请注册集体商标、证明商标的&#xff0c;应当提交申请人主体资…