flink程序优化和故障排查

    背景:最近在做flink分析任务相关的一些事情,遇到了一些问题和总结了一些排查手段,排查的过程中发现也有其他人遇到了一些类似问题或者其他人遇到我没有遇到的问题,希望可以和大家一起分享和交流。(大家有兴趣也可以加入钉钉社区群,微信没有钉钉群活跃,贴在文末)

    项目背景:生产平均20wqps左右,高峰期40w左右,checkpoint关闭(业务目前不需要exactly-once,容许少量丢失,所以避开了很多checkpoint的调优工作),测试环境最初8w qps用作测试,很多问题没有能够显现出来,所以建议在线上稳定版本上新增一些窗口聚合函数的时候还是要压测下,因为业务数据源的数据的复杂或多样性或可能导致数据倾斜,或热点key导致单节点负载过高,影响整体吞吐量

flink版本号:1.10.0 (https://ci.apache.org/projects/flink/flink-docs-release-1.10/

1.内存配置问题

  问题描述:  先看一张之前配置的图,项目启动的时候分配的是8G内存,task启动后观察控制台只有7个多G,剩下的1G去哪里了呢?之前配置的jvm参数:-XX:MaxMetaspaceSize=512m -Xms5000m -Xmx5000m -XX:MaxDirectMemorySize=2000m

这边展示下flink的内存模型:


我们线上配置的taskmanager.memory.process.size=8G,flink会根据taskmanager.memory.process.size推算出其他区域的内存(详细参数见官方文档)

这里我们主要介绍下heap和off-heap:

    1.heap:frameWork Heap + Task heap,flink frameWork Heap 默认taskmanager.memory.framework.heap.size = 128M,task Heap就是业务算子所执行的内存,用户可以自行设置大小,也可以设置比例,框架自动算出来;还有中设置方式:             -Xmx and -Xms    Framework + Task Heap Memory

   2.off-heap:Managed Memery+Direct Memory + Meta + overhead,简单说下管理内存,这个也是导致我们少了1G内存的关键。

引用:Managed memory is managed by Flink and is allocated as native memory (off-heap). The following workloads use managed memory:

Streaming jobs can use it for RocksDB state backend.

Batch jobs can use it for sorting, hash tables, caching of intermediate results.

划重点:Managed memory适用的场景只有使用rocksDB作为状态后端和batch job的场景才会使用到,我们这边是实时stream流job,没有checkpoint没有用到rocksdb;官方建议:其他场景下taskmanager.memory.managed.size=0,内存设置为0,默认情况下taskmanager.memory.managed.fraction=0.4,如果没有其他配置的话,占用总内存的40%

修改完配置,让更多的内存去执行任务算子

2.控制台卡顿问题

问题描述:测试环境8个slot,打开控制台不会卡顿;生产120个slot,控制台完全打不开卡死;导致生产上发生问题,无法通过dashboard去排查,每次只能找运维登上机器去排查

这是当时JobManager的dump文件,我本机用的jdk自带的jvisualvm打开的,搜了下其他工具,下载比较麻烦,感觉这个也挺不错的,或者可以直接用jhat命令去生成html文件分析(感觉没有jvisualvm上手)

问题排查:一开始看到concurrentHashMap占用这么大内存,首先想到的是JobManager加内存,发现JM从8G加到16G一点效果都没有,这里要感谢flink运维大大,发现基本上都是latency的引用,然后看了latency指标个数:task乘sub_task乘operator个数,接近指数倍,线上默认设置多得多指标时间60s,60s去拉一次

解决方法:metrics.latency.interval=0 设置为0关闭,这个参数最好在本地调试得时候开启,线上打开可能会导致JM不停的fullgc,JM的工作主要是心跳和协作各个task,不停gc可能会导致整个任务挂掉

3.OkHttp问题排查

问题描述:前面经过一系列算子处理,到最后一步数据下沉,最后一步数据量很小,所以算子并行读度设置的为1,采用OkHttp异步调用;因为采用得是共享slot的方式,sink算子(okhttp调用的)和其他中间层的算子在一台机器上,sink算子的问题大导致中间层算子背压,为什么呢?

问题排查:一开始单纯看backpressure,导致绕了很大一个圈子,排查问题第一步首先要看gc情况(划重点),一开始jstack线程dump去排查,发现几个i/o线程一直在执行,绕完一大圈回来发现这台机器的gc不正常,dump下堆内存发现一堆RequestBody和Reponse信息。翻了okhttp的源码,采用的是线程池+队列的模型,最大线程消耗完了,放在队列排队,导致堆积在老年代,最终不停fullgc。

一开始我们忽略了gc的问题,认为异步调用,对算子速度不会产生影响,上游数据来了,下游直接异步消费直接返回,类似的问题遇到好几个;

4.数据倾斜

问题:问题比较好展现出来,直接在控制台上查看各个算子的数据量就可以查看到。

数据倾斜会造成短板效应,单机负载过高,吞吐量下降,虽然有些情况下数据倾斜不会造成问题,没达到单机的瓶颈,但是数据量上来,迟早会出问题;举个例子,某个产品热销,一天的点击率可能几百万,有些可能只有几个,这个时候数据进来,keyby分区后,几百万数据会流入一台机器,而其他机器的流量可能只有几十,这个时候我们可以怎么做?

常用的方法是,看到最多得两阶段聚合法,画了个简单的图:

先map,在a后面加一个范围内的随机数,第一次集合数据被打散到其他机器上,在map一次去除后缀,进行第二次聚合算出最终数据,这边美团有个文章讲了好几种spark处理数据倾斜的方式,大家可以参考其中的一些方法(https://tech.meituan.com/2016/05/12/spark-tuning-pro.html )

5.最近排查一个CopyOnWriteStateMap.StateEntryMap对象内存泄露问题,在社区和一些其他人交流都没解决,看了好几个人遇到但是都没有解决的方案,今天看了一个发给flink官方的邮件(http://apache-flink-user-mailing-list-archive.2336050.n4.nabble.com/Memory-Leak-in-ProcessingTimeSessionWindow-td20754.html),遇到的问题相似,具体解决了在进行分享 

小建议:1.窗口聚合前,大对象尽量转成小对象,如果你只需要大对象里面的几个参数,尽量把大对象转成小对象,网络传输和窗口状态保存的时候都有效果

2.特定场景最好自定义触发器,reduce算子,agge算子只保存聚合结果没什么问题,processWIndowFunction等会保存所有的数据在内存中,直到定时器触发,容易造成OOM

3.还有想不起来了,后期发现问题继续补上。。。

另外在排障过程中发现一些其他人遇到的问题:

1.flink 使用jdk1.8不调整gc策略的话,默认使用UseParallelGC,默认开启AdaptiveSizePolicy策略,很多人因为这个出问题,我贴出来大家看下,我们这边目前设置的是-XX:+UseSerialGC,目前没导致问题,暂时由于其他问题没优化这一块,但是后期个人会在测试采用G1,贴个原文链接(https://blog.csdn.net/u011418571/article/details/105951730

总结:


自己总结了下一个简单的排查问题流程图(checkpoint disabled),后期经历各个问题逐渐充实决策树,能更快的去定位问题;大多数情况下gc异常由于数据源或者是flink业务代码导致得,数据源:热点数据导致数据倾斜;flink业务代码:逻辑自己没发现问题;

gc没问题,数据也不发生倾斜的情况下,再去看backpressure,去dump线程看哪个算子比较耗时,再去单独优化算子逻辑;直接看backpressure,可能会绕大圈子

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • 问题排查 看反压:背压高的下游oprator就是瓶颈 关注checkpoint时长checkpoint时长一定程度...
    专职掏大粪阅读 4,439评论 0 2
  • 本文来自: PerfMa技术社区PerfMa(笨马网络)官网 最近2周开始接手apache flink全链路监控数...
    HeapDump性能社区阅读 969评论 0 0
  • 报告(Reporter) 通过 conf/flink-conf.yaml 文件配置一个或多个 Reporters ...
    Alex90阅读 4,158评论 0 2
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,470评论 16 22
  • 创业是很多人的梦想,多少人为了理想和不甘选择了创业来实现自我价值,我就是其中一个。 创业后,我由女人变成了超人,什...
    亦宝宝阅读 1,799评论 4 1