一个flink作业的调优
最近接手了一个flink作业,另外一个同事断断续续有的没的写了半年的,不着急,也一直没上线,最近突然要上线,扔给我,要调通上线。
现状是:
1.代码跑不动,资源给的不少,但是就是频繁反压。
2.checkpoint经常失败。
3.也是最严重的,跑着跑着,作业就挂了。
接手之后,秉承着代码的业务逻辑是对的原则,开始了调优之旅,后来发现,还是要从最基本的做起,不然都是白扯。总结了如下几条意见,供自己以后反省。
1.遵循一般的编程原则
代码到手之后,业务逻辑部分简直不忍卒读,整个业务逻辑在一个大函数中,多达几百行,而且里面很多的if语句,一个if语句就超过一屏,而且if语句大量嵌套,其他比如大量的string的累加操作等等,其实都是编程风格中的忌讳,因此,一边是对同事的信任,一边是没勇气看这个代码,刚开始从flink的机制开始调优,没有重构代码,导致浪费了不少时间。后来还是鼓足勇气重构代码,该拆分拆分,该合并合并,才发现中间有一个HashMap一直在Put但是没有clear操作,MD,作业不崩溃才怪。
教训:作业调优,先理解清楚业务,再者好好看懂代码,不管多乱,不然有明显的bug都不知道,至于重构,如果时间可以,尽量吧。
2.确定最耗时的部分
因为作业的DAG图包含6个level,首先需要确定哪个层级最耗时。因为在parse的部分频繁反压,也就是后面的一个level会处理跟不上。但当时说的是写redis,以之前的理解,redis
应该很easy就能支持10W的并发写吧,所以虽然flink提示redis sink有问题,但还是将关注点放在了parse上,也是导致了浪费时间。后来才了解到,虽然同事告诉我是写redis,而且
确实也用的jedis来操作,但其实后台是公司自研的一个类redis的库,而且不保存在内存中,磁盘的写入速度哪里能支持那么大的并发,网卡在瞬间往往都打满,而且写操作还是同步阻塞的,这个也同时解释了前两个问题,由于写入的并发太大,导致反压,所以速度跟不上,速度跟不上,所以在每个level都开启了64个并发,加上写的同步阻塞,checkpoint coordinator需要收到将近300个task的ck 确认才能结束,往往任何一个task的缓慢,都导致了ck的timeout而失败。
教训:真正了解你的持久化储存,了解他能支持的最大的并发和合适的并发及其他因素。
3.了解flink的机制
由于checkpoint总是失败,而flink的checkpoint其实是基于RocksDB去做的,并且是异步和增量的,无论如何都觉得不应该那么容易timeout,后来开启了flink日志的debug级别才发现,ck虽然是异步的,但是需要等到上游所有的barrier都到来才会触发自己的流程,往往这个等的过程就达到分钟级,然后每一个level往后传递,就会导致最后level的task在没有
收到barrier的时候,ck以及timeout。当然,根本的原因还是反压,导致处理的一些task处理的很慢,拖累了整个作业,毕竟barrier是和真正的数据是在一个channel中发送的,如果
数据都积压了,barrier当然也发不下去了。
另一个问题就是chain和slotshareing了,默认flink是开启了chain的,整个是没问题的,这样其实多个operator会在一个task里面,减少了数据传输的开销,但是在调优的时候,也就
不太容易看出哪里是性能瓶颈,slotsharing机制是进行资源分配的策略,默认都是default,所有的task会共享一个slot,也不太好找那个task是瓶颈,将不同的task的slotshareing
设置的不一样,就可以在每个slot中是单独的task,更容易分析是哪里出问题了。
教训:flink默认的机制,一般都是OK的,在找问题的时候可以改,但一般不会是问题点。
4.善用性能检测工具
flink作业本身还是java作业,刚开始觉得跑不动的时候,将java的那些自带工具也基本都用了一遍。
jstack,打印出线程栈,到底是哪里操作在耗时。
jmap,打印出对象信息以及dump文件,看看具体是哪个对象在搞事。
jstat,查看各种gc的信息,各个内存区域的使用是否正常等等。
现在流行的框架,越来越多的使用堆外内存,而这部分内存的回收又不容易,发生泄漏很难查找。
教训:其实保持良好的编码规范,内存出问题的可能不是那么大,更多的还是使用stack看看具体是哪里在耗时。
5.监控
flink有自己的metric,但是往往不够,需要在作业中添加自己的metric,看起来就会很直观。flink的debug日志,虽然会有大量的日志,但有些事情还是必须通过日志来观察。
但这次问题的解决,关键点还在于运维同学的报警,警示数据库的tps太高,一番探讨之后,才发现用的不是真正的redis,才找到的问题的真正所在,性能立马提示,也没有了反压。
教训:如果持久化层有监控,包括IO层,这里往往才真正是出问题的地方,至于CPU和内存,反正是在yarn上,资源不够随时添加即可,反而是IO瓶颈,前面再使劲儿,这里
堵住了,一切都是白扯。
这次调优,虽然最终问题解决了,但还是挺灰头土脸的,希望以后有类似的事情,能够有步骤有重点的推进。
一个flink作业的调优的更多相关文章
- Hadoop作业性能指标及參数调优实例 (二)Hadoop作业性能调优7个建议
作者:Shu, Alison Hadoop作业性能调优的两种场景: 一.用户观察到作业性能差,主动寻求帮助. (一)eBayEagle作业性能分析器 1. Hadoop作业性能异常指标 2. Hado ...
- 【转】数据倾斜是多么痛?spark作业/面试/调优必备秘籍
原博文出自于: http://sanwen.net/a/gqkotbo.html 感谢! 来源:数盟 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性 ...
- Hadoop作业性能指标及參数调优实例 (三)Hadoop作业性能參数调优方法
作者: Shu, Alison Hadoop作业性能调优的两种场景: 一.用户观察到作业性能差,主动寻求帮助. (一)eBayEagle作业性能分析器 1. Hadoop作业性能异常指标 2. Had ...
- mapreduce的调度算法和job调优
调度算法: mapreduce当有很多的作业在执行的时候,是按照什么顺序去执行的? 调度算法顺序需要关注: 1.提高作业的吞吐量. 2.要考虑优先级. 三种调度器:如果作业跑不完,并且机器资源利用率比 ...
- [Spark性能调优] 第二章:彻底解密Spark的HashShuffle
本課主題 Shuffle 是分布式系统的天敌 Spark HashShuffle介绍 Spark Consolidated HashShuffle介绍 Shuffle 是如何成为 Spark 性能杀手 ...
- Spark官方调优文档翻译(转载)
Spark调优 由于大部分Spark计算都是在内存中完成的,所以Spark程序的瓶颈可能由集群中任意一种资源导致,如:CPU.网络带宽.或者内存等.最常见的情况是,数据能装进内存,而瓶颈是网络带宽:当 ...
- 【Spark深入学习 -14】Spark应用经验与程序调优
----本节内容------- 1.遗留问题解答 2.Spark调优初体验 2.1 利用WebUI分析程序瓶颈 2.2 设置合适的资源 2.3 调整任务的并发度 2.4 修改存储格式 3.Spark调 ...
- MapReduce性能调优记录
MapReduce原理 要知道怎么对MapReduce作业进行调优前提条件是需要对Map-Reduce的过程了然于胸. Map-Reduce运行原理图: Map Side 1.从磁盘读取数据并分片 默 ...
- JVM内存模型与性能调优
堆内存(Heap) 堆是由Java虚拟机(JVM,下文提到的JVM特指Sun hotspot JVM)用来存放Java类.对象和静态成员的内存空间,Java程序中创建的所有对象都在堆中分配空间,堆只用 ...
随机推荐
- 【PTA 天梯赛】L2-026. 小字辈(广搜+邻接表)
本题给定一个庞大家族的家谱,要请你给出最小一辈的名单. 输入格式: 输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号.随后第二行 ...
- Python学习——01Linux基础之常用基本命令
做Linux要知道两件事: 首先知道自己处在什么位置(桌面……) 区分大小写 pwd:查看当前所在目录 “/”代表:根目录 Cd: cd( ...
- 编译安装GCC
下载GCC包 http://mirror.hust.edu.cn/gnu/gcc/ 解压 .tar.gzcd gcc-4.9.4./contrib/download_prerequisites #下载 ...
- Hello,移动WEB—Viewport_Meta标签
二 Viewport meta标签: 语法:<meta name="viewport" content="name=value, name=value" ...
- 使用Win32DiskImager后重置SD卡
再1.Windows diskpart命令 diskpart 2.列出所有的磁盘 lisk disk 3.选择U盘所在的磁盘 4.清除磁盘 clean 5.创建主分区 create primary p ...
- MySQL innodb表使用表空间物理文件复制或迁移表
MySQL InnoDB引擎的表通过拷贝物理文件来进行单表或指定表的复制,可以想到多种方式,今天测试其中2种: 将innodb引擎的表修改为Myisam引擎,然后拷贝物理文件 直接拷贝innodb的表 ...
- u-boot-2016.01移植(一)
1.了解uboot: 阅读uboot源码顶层目录下的README.TXT可以提取如下信息: made to support booting of Linux images. //引导内核程 ...
- nginx配置SSL证书/强制跳转与非强制跳转
支持强制跳转HTTPS server { listen 80; server_name www.test.com; rewrite ^(.*)$ https://${server_name}$1 pe ...
- python -pickle模块、re模块学习
pickel模块 import pickle #pickle可以将任何数据类型序列化,json只能列表字典字符串数字等简单的数据类型,复杂的不可以 #但是pickle只能在python中使用,json ...
- 10-C++远征之模板篇-学习笔记
C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 & 静态成员函数 运算符重载: 一切皆有可能 友元函数 ...