一个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程序中创建的所有对象都在堆中分配空间,堆只用 ...
随机推荐
- Shiro登录中遇到了问题
Shiro登录中遇到了问题 记录二次开发中遇到的问题, 如果系统学习Shiro, 推荐跟我学Shrio. 问题 项目是要将验证从本地改为LDAP验证, 但是因为jeecms的验证和授权中, 用户和角色 ...
- 【TOJ 1743】集合运算(set并、交、差集)
Description 给定两个集合A和B的所有元素,计算它们的交.并.差集. Input 输入数据有多组,第一行为数据的组数T,接下来有2T行,每组数据占2行,每行有若干个整数,第一行的所有整数构成 ...
- Linux的开山篇
一.Linux的学习方向 1.2Linux运维工程师 1.2.2Linux嵌入式开发工程师 1.2.3在Linux下做各种程序开发 javaEE 大数据 Python PHP C/ ...
- 中间件kafka
* kafka----一个发布订阅消息系统,中间件:一个分布式.分区.可重复的日志服务kafka需要了解基础几层结构,生产者订阅者等使用方法,和在高并发.一致性场景使用.(凡事面试问一致性.高并发都脱 ...
- 为什么不早点使用 Git...
教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013739628770 ...
- pyspider -- 禁止请求非200响应码抛异常
在pyspider中若crawl()网址时出现非200的异常信息,会抛出一个异常. 可以在对应的回调函数上面通过@catch_status_code_error 进行修饰,这样就能不抛出异常正常进入回 ...
- python正则表达式+正则大量实例
正则表达式 正则表达式内部函数详解http://www.runoob.com/python/python-reg-expressions.html 正则表达式是一个特殊的字符序列,它能帮助你方便的检查 ...
- Element-ui学习使用
这是我使用Element-ui的布局,排布的一个界面,原本我是使用WinfowsForm来做的一个摄像头注册以及查询的小工具,目前我关注前后端的开发,所以就想着能不能把这么个小工具,我用前后端的形式开 ...
- 使用 MySQL 存储 Hue 元数据
1.在 MySQL 中增加数据库 hue 2.编辑 hue.ini 文件 [[database]] # Database engine is typically one of: # postgresq ...
- 用ServiceStack操作使用redis的问题
最近在学习Redis,查阅网上很多资料后使用SericeStack连接redis.在nuget中下载ServiceStack.Redis,主要使用到四个dll 但是运行之后会出现一堆奇怪问题:没有实现 ...