一、实时开发常见问题

1、一个实时计算工作该调配多少资源?

倡议:一些简略ETL工作,并且源数据流量在肯定范畴内, tm个数1、全局并行度1、内存1G。

剖析:

全局并行度为1,对于简略ETL工作会有operator chain,在一个task(线程)中运行、缩小线程切换、缩小音讯序列化/反序列化等,该类问题的瓶颈个别在上游写入端。写入端是瓶颈:个别倡议开启批量写入(须要管制批量大小,避免内存溢出)、开启多并行度写入。如果是单台数据库的瓶颈:开启多个并行度就没法晋升性能、个别倡议依照肯定路由规定写入多台数据库、倡议应用分布式数据库(如Hbase:提前建设分区、防止数据热点写入等)。

2、为什么写入Kafka后果中有些分区没有数据?

倡议:如果现有topic曾经存在,并且是多个分区,后果表并行度设置partition数一样。
剖析:

因为Flink写Kafka默认采纳的是FixedPartitioner。如果并行度比partition大,则数据都会发送到partition中,然而如果并行度比partition小,则有局部分区是没有数据的。source端,如果并行度小于partition,会取模的形式分给并行度,都会生产到数据。如果并行度大于partition,则会有局部task生产不到数据。

3、为什么和维表关联后工作解决数据的能力变慢?

倡议:小数据量不常更新的维表应用ALL模式。大数据量的维表应用应用LRU模式,并且依据数据库不同做相应的解决(比方关系型数据库则建设索引等)。

剖析:1.ALL模式启动时候间接将数据全量加载到内存中,每次关联数据不须要查库,没有其余开销。2.异步(async)查问模式

LRU异步查询数据库,能够并发地解决多个申请。依据SQL中的关联字段程序建设复合索引。避免关联字段索引生效(关联程序不对、关联列做计算等)。如果维表字段个数少,思考将将多余字段都退出到索引中,缩小回表(带来的问题是索引变大)。

4、为什么某些工作进步并行度能晋升性能,某些不能?

倡议:查看是否数据歪斜,如果是将数据打散。

剖析:

源头是否数据歪斜。SQL中是否存在导致歪斜的语句。登陆到Flink web页面查看。通过批改SQL解决或者打散groupby字段。

二、实时工作运维

1、配置反压告警

场景:反压导致cp失败,数据呈现提早或者不产出。

排查办法:
1)借助Flink web-ui 提供的的反压性能查找具体的operatorChain。
2)查问Flink metric 'inPoolUsage、outPoolUsage' 来确定具体的反压算子。

2、配置cp失败告警

场景:cp失败导致数据无奈真正落地,工作复原距离太长。

排查办法:

1)是否存在反压。
2)查看集群负载、IO、CPU、MEM 是否处于高负荷状态。

3、拆分实时工作日志

场景: Flink实时工作运行工夫长之后导致日志占用磁盘大,另外一个大的日志文件不利于排查问题。

解决办法:

配置log4j.log的滚动参数,设置日志按日期或者大小滚动生产,并且限度保留的大小。

4、监控工作运行中tm日志

场景: 工作执行中产生的运行日志没有监控,比方网络抖动导致的链接失败等等。

解决办法:

批改Flink自带的log4j jar包中的代码,将异样日志重定向一份到Kafka或ES中,进行后续剖析,找到程序中可能存在的暗藏bug。

5、脏数据管理

场景:因为数据源都是从Kafka过去的数据,可能存在数据类型谬误、字段名称谬误、字段阈值在Flink中超范围等。落库过程中,因为字段类型不匹配、阈值超范围等等状况。

解决办法:

在数据解析和数据落库等代码中,对catch中的数据进行收集。当异样数据达到肯定的量时,告警告诉。线下离线修改后果数据。

三、通过Metrics定位问题

1.罕用内置Metrics介绍

端到端的延时(最大、均匀、百分位):

flink_taskmanager_job_latency_source_id_operator_id_operator_subtask_index_latency

输出数据量:

flink_taskmanager_job_task_operator_numRecordsIn

flink_taskmanager_job_task_numBytesIn

输入数据量:

flink_taskmanager_job_task_operator_numRecordsOut

flink_taskmanager_job_task_numBytesOut

反压值:

flink_taskmanager_job_task_isBackPressured

工作buffer:

inPoolUsage、outPoolUsage等其余

2、flinkStreamSql中罕用metrics

业务提早:

flink_taskmanager_job_task_operator_dtEventDelay(单位s)

数据自身的工夫和进入flink的以后工夫的差值。

各个输出源的脏数据:

flink_taskmanager_job_task_operator_dtDirtyData

从Kafka获取的数据解析失败视为脏数据。

各Source的数据输出TPS:

flink_taskmanager_job_task_operator_dtNumRecordsInRate

Kafka承受的记录数(未解析前)/s。

各Source的数据输出RPS:

flink_taskmanager_job_task_operator_dtNumRecordsInResolveRate

Kafka承受的记录数(未解析前)/s。

各Source的数据输出BPS:

flink_taskmanager_job_task_operator_dtNumBytestInRate

Kafka承受的字节数/s。

Kafka作为输出源的各个分区的提早数:

flink_taskmanager_job_task_operator_topic_partition_dtTopicPartitionLag

以后Kafka10、Kafka11有采集该指标。

各个输出源RPS:

fink_taskmanager_job_task_operator_dtNumRecordsOutRate

写入的内部记录数/s。

四、FlinkStreamSQL v1.11.1介绍

1.DDL建表语句和FlinkStreamSql v1.10之前版本保持一致。

2.DML语句有两种不同的模式:

dtstack模式:和之前的版本是统一的。

Flink模式:和Flink原生的语法保持一致。

3.次要区别点:和维表join形式不同。

4.如何应用:在提交工作的时候加上 -planner dtstack/flink即可。

本文作者:刘星(花名:吹雪),袋鼠云大数据开发工程师。

本文首发于:数栈研习社

咱们在github上有一个flinkx的开源我的项目,欢送大家来探讨交换~

对于这个内容的视频,咱们还上传到了b站,欢送大家观看
https://www.bilibili.com/vide...