《8 个面试高频Flink 实战问题.docx》由会员分享,可在线阅读,更多相关《8 个面试高频Flink 实战问题.docx(22页珍藏版)》请在第一文库网上搜索。
1、8个面试高频Flink实战问题01生产环境中,如何快速判断哪个算子存在反压呢?或者说哪个算子出现了性能问题?将这个问题拆解成多步来分析:1.如何知道算子是否有反压?在Flink web ui中,定位到一个具体的算子之后,查看BackPressure模块,通过颜色和数值来判断任务的繁忙和反压情况。若颜色为红色,表示当前算子繁忙,有反压的情况;若颜色为绿色,标识当前算子不繁忙,没有反压。Qvrvww Except ont TimelferM CheckpotmtConf jurationTaskMonagorsmarks Accumuiatocs BdCkPressixe Metric*M#4tu
2、frrnURUNNINGClc(MlKt(CAST(108)0 FlatMap、Sink算子,如果Source算子有反压,那到底是哪个算子有性能问题呢?上游算子在web ui显示有反压时,一般为下游算子存在性能问题。可以继续往下游排查,如果FlatMap也显示有反压,大概率是Sink算子存在性能问题;如果FlatMap没有显示有反压,大概率是FlatMap算子存在性能问题。1. 大多数时候,Flink会自动将算子chain在一起,那怎么判断具体是哪一个算子有问题?第一种方式:Flink提供了断开算子链的能力。DataStream API 中:可以使用 disableChaining () 将c
3、hain在一起的算子链断开。或者酉己置 pipeline, operator-chaining: false.process(xxx) uid (process) disableChaining().addSink(xxx) uid (sink);SQL API 中:酉己置 pipeline, operator-chaining:falseCREATE TABLE source table (order number BIGINT,priceDECIMAL(32, 2)with (connector = datagen),fields. order_numbere min, =10,field
4、s.order_number.max =11CREATE TABLE sink_table (order_number BIGINT,priceDECIMAL (32,2)connector, = print,insert into sink_tableselect * from source tablehere order_number = 10;我们来看看一个SQL任务在配置 pipeline. operator-chaining: false 前后的差异。前,可以看到在酉己置 pipeline, operator-chaining: false所有算子都chain在一起:Overvtew
5、ExceptionsTimeLineCheckpointsConfigurationSource: TableSourceScn(tabi a (defauM .couiog. default.d.tab.”,source.tablt). fields(order.number, price) - Calc(Mlw: Sink: SinkltbK“(Wutt.cetalog .default, databasefields-(ordM.number, price .ParaNelmm: 1Backpr*sturd 0%Busy (mex): N/ASource TabSoufceScn(tab
6、la|lfefdulLcXk)g.OBStatusBytot ReceivedRecords Received4在酉己置 pipeline. operator-chaining: false 后, 可以看至lj所有算子都没有chain在一起:Overview ExceptionsTimeUneCheckpointsConfigurationSource TabiSourc*Sam(tibl(ourc.ubl). fieldsx|ocdr.number, price)Parallehtm: 1IQITWAQOCaac(slci(CAST(10 BIOINT) AS order.nurnbr. p
7、nc). w(order.number 10 BlGIHTM)PereNeUtm: 1BacWwtwfvd 0%Busy (max): 0%Nt meStatusBytes RceivMRecords ReceivedBytes SntRecords 5 TasksSoufc* Ta6to$ourcScenlc(Mect- CA3T( 10 BIOINT ASnumber, price. wM2【J28 3 KB59012 2 KBJ涔苏春说SinkdeMjR_dMbAM intat)ie. M1 142KB296081第二种方式:在Flink 1. 13中,提供了火焰图,可以通过火焰图定位问
8、题。火焰图需要配置rest, flamegraph.enabled:true 打开Checkpoint*Ovecview Excepuom TimeLine)es WatermarksAccunwUtors Bick PressureMetres FImeGrphOn-CPUOff-CPUMixedMeosuremeni 3s agoCalc(selct(CAST(1O BIGINT) AS ocdernumber. pnc. wherea(xder_number * 10 BlOINT)Parallelism: 1Bockprosturod (max): 0%Busy (mwO: 0%aw*
9、 .Status ; ByiM Received : Rococos Received : Byie $ntRocortfst TmkCtic(Mtoct.(CAST(10 818。AS owec.numt. p。.66 1 KB1.380KUH NINO33 5K870056 4 KB1.380 Q12 2KS02反压有哪些危害?1. 任务处理性能出现瓶颈:以消费Kafka为例,大概率会出现消费Kafka Lago2. Checkpoint时间长或者失败:因为某些反压会导致barrier需要花很长时间才能对齐,任务稳定性差。3.整个任务完全卡住。比如在TUMBLE窗口算子的任务中,反压后可能
10、会导致下游算子的input pool和上游算子的output pool满了,这时候如果下游窗口的watermark 一直对不齐,窗口触发不了计算的话,下游算子就永远无法触发窗口计算了。整个任务卡住。03经常碰到哪些问题会任务反压?总结就是:算子的sub-task需要处理的数据量能够处理的数据量。一般会实际中会有以下两种问题会导致反压。1.数据倾斜:当前算子的每个sub-task只能处理lwqps的数据,而由于数据倾斜,这个算子的其中一些sub-task平均算下来1s需要处理2w条数据,但是实际只能处理lw条,从而反压。比如有时候keyby的key设置的不合理。2.算子性能问题:下游整个整个算子
11、sub-task的处理性能差,输入是lw qps,当前算子的sub-task算下来平均只能处理Ik qps,因此就有反压的情况。比如算子需要访问外部接口,访问外部接口耗时长。5怎么缓解、解决任务反压的情况?1. 事前:解决上述介绍到的数据倾斜、算子性能问题。2. 塞生:在出现反压时:限制数据源的消费数据速度。比如在事件时间窗口的应用中,可以自己设置在数据源处加一些限流措施,让每个数据源都能够够匀速消费数据,避免出现有的Source快,有的Source慢,导致窗口 input pool打满,watermark对不齐导致任务卡住。关闭Checkpointo关闭Checkpoint可以将barrie
12、r对齐这一步省略掉,促使任务能够快速回溯数据。我们可以在数据回溯完成之后,再将Checkpoint打开。05实时数据延迟是怎么监控的?报警策略又是怎么制定的?几乎我问到的所有的小伙伴都能回到到Flink消费Source的Lag监控,我们可以把这个监控项升级一下,即Kafka到Flink延迟。原因如下:以Flink消费Kafka为例,几乎所有的任务性能问题都最终能反映到Kafka消费Flink延迟,所以几乎100%的任务性能问题都能由Kafka到Flink延迟 这个监控发现。大家可以没有其他监控手段,但是这一项非常建议搞。当然也有小伙伴问,具体的实操时,监控项应该怎么设置呢?很多小伙伴也回答到:Flink本地时间戳- Kafka中自带的时间戳。这时候有小伙伴提到,这个只能反映出Flink消费Kafka的延迟,那具体数据上的延迟怎么反映出来呢。群里有小伙伴也回达到:Flink本地时间戳-数据事件时间