Ververica&Flink运维之一反压延时

B站Flink教程视频观看

Flink运维基础

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
对比其他的大数据计算平台,Flink运维更类似于微服务架构(micro-service)运维
微服务部署 vs 流处理的无限性
微服务存储 vs state的维护
微服务请求响应 vs 流处理延时

Metrics应作为重要的运维参考
Flink丰富的内置Metrics接口
Flink针对各种运维场景的运维泛用性

定义运维标准
定义Service-Level Agreement(SLA)
定义基本Metrics
直观定义,能反应SLA的参数
延时,反压,吞吐量等
更多衍生Metrics
深入Flink作业,反应内部的性能/异常状态
制定运维策略
根据Metrics参数制定具体策略
自动化策略执行

图形界面

1
2
3
4
5
实时Metrics
收集实时Metrics数据
精确到算子
触发反压计算
反压计算需要触发

程序监控-RESTful API

1
2
RESTful API
与WebUI的应用情况类似,使用程序触发Metrics收集

第三方Metrics Reporter

1
2
3
4
5
分离收集与处理
Grafana
JMX
查看历史记录
第三方Metrics可以视为一个实时OLAP数据库

基于Metrics运维的优点

1
2
3
4
5
6
7
8
9
10
11
整合数据
比起RESTful或者WebUI,Metrics Reporter能更容易整合数据
稳定性
高可用Metric系统
多维度分析
JVM基础分析
与周边系统连调
与集群系统连调
整合State后端以及外部DFS
整合第三方资源
Flink直接支持向第三方Metrics系统

延时基本概念

1
2
3
4
5
6
7
8
9
10
11
12
什么是延时?
定义两个时间点差值
最近一个成功处理的数据offset
最新一个生成的数据offset

如何测量延时?
基于流数据系统
Kafka系统直接返回延时差值
其他系统可能需要通过Metrics计算

如何使用延时数据?
延时是衡量流数据作业是否能够定义为实时的基本参数

反压基本概念

1
2
3
4
5
6
7
8
9
10
11
12
13
什么是反压?
定义两个连接的算子之间的差值
上游算子的处理速度
下游算子的处理速度

如何测量反压?
Flink RESTful API直接触发计算
Flink(>1.6)使用内部Credit反压机制
与缓冲区的使用有直接关联

如何使用反压数据?
反压计算能够更精确找到系统性错误
精确到算子级别

JVM Metrics基本设置

1
2
3
4
5
6
7
8
9
10
11
12
13
JVM Metrics
适用于几乎所有作业类型

JVM通用定义
CPU usage
Heap commit/use/max
GC时间,类型和比例

定义合理数据区间
CPU占用比小于50%
Heap占用比小于50%
GC比例小于15%
FullGC时间恒定

流数据Metrics

1
2
3
4
5
6
7
8
流数据-接口整合
Flink接口Metrics反应接受端Metrics
流数据系统Metrics反应发送端Metrics

自定义流数据系统
不同的流数据系统一般会自定义不同类型的数据Metrics
sleepTimeMillis(Kinesis)接口的休眠延时
connection-close-rate(Kafka)接口连接断开/传输比例

State Metrics

1
2
3
4
5
6
7
8
9
Flink的原生支持
CK对JVM有较大影响
当前CK的进度,时长,文件大小,频率
CK的失败恢复比例

外部分布式存储
不能忽视外部分布式存储系统(DFS)对于CK与SP的影响
DFS的设置-冗余,分片
DFS的管理-配额管理,碎片文件管理,回收机制

反压检测

1
2
3
4
5
6
7
8
9
利用反压
反压的计算能够提供更多参考
直接判断问题算子
确定跨算子之间的联系以及瓶颈

触发反压计算
反压的计算需要触发,意味着反压的计算并不是免费运维
合理分配反压计算的频率
结合Metrics,只针对需要深入分析的作业进行反压分析

Metrics的局限性

1
2
3
4
5
6
7
8
9
10
11
12
13
难以保证准确性
Metrics Reporter并不能保证100%合理处理系统故障
包括客户端和服务端故障
第三方Metrics意味着存在网络延时的影响

难以回答统计型分析
Flink是否合理处理流数据系统的分区平衡问题
Flink与流数据系统的是否存在合理的延时/流量比

难以融合其他的Metrics
很多问题必须融合更多的Metrics才能合理运维
TaskManager重启是否由于集群系统的节点故障导致
反压的出现是否源于流系统的周期性分区负载平衡作业

时间序列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
便于历史数据处理
时段分析
分辨率压缩

便于统计型分析
时间序列源于统计分析
基本统计函数:整合,差分
自定义函数分析

众多第三方软件
JMX
Graphite
Prometheus
StatsD

去除噪声

1
2
3
4
5
6
7
8
9
10
11
去除错误Metrics
纠正Metrics系统错误
自定义范围分析
使用移动平均

整合多个Metrics
多个Metrics能更全面反应问题
关联Heap使用与GC比例
按比例计算Direct和Heap使用
异常值/极端值分析
只有去除噪声之后才能正确确认极端值的可靠性

整合系统

1
2
3
4
5
6
7
整合输入输出数据
使用统一统计分析
流数据节点看作虚拟算子
整合集群数据
跨界对比:多数据中心,跨集群对比时间序列算法
整合:集群资源分配是否合理->TM是否能合理连接资源分配
多维度:集群资源管理,存储管理,网络分配

特征分析

1
2
3
4
5
6
7
8
9
10
11
12
多维度统计
综合维度:集群,集群节点
纵向维度:作业,作业节点

统计算法
均值,方差,标准差
自定义函数:奇异值分析,中值偏差

生成更多Metrics
使用空间函数:比例分析,排序
使用时间函数:移动平均
整合多个Metrics:差分,动态阈值

Metrics进阶

1
2
Metrics设计到更多的方面
并不是所有Metrics都需要与延时/反压挂钩

运维样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
作业造成资源浪费
延时一直不存在任何的浮动性
资源使用率异常的低:平均在10%~20%
非常规整的GC进程-时间以及次数上不存在任何异常
资源过度浪费

跨集群故障转移
出现了非常明显的系统处理速度异常
明显的下降-接近0的数据吞吐量,而且持续时间长
恢复速度正常:并没有出现峰值异常
上游端发生跨数据中心冗余处理

作业的分区异常处理故障
数据吞吐量正常
分区分析上:上升沿以及下降沿出现了明显断层
出现过短时间的延时增长,不过并没有造成积压
分区有非常明显的错误:并且不可自我修复

下游端响应延时造成反压
均匀的GC和均匀的上升下降
吞吐量有一定时间的平滑曲线,之后在两个数值之间来回跳动
延时数据出现了周期性清零,反压升高
下游的输出系统的接收延时出现爆炸性增长

作业增长-系统资源匮乏
数据吞吐量上出现一定程度的噪音
GC:时间使用非常高,峰值非常不稳定
延时升高而且不可恢复,反压正常
上下游系统正常

基础调参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
基础调参需要根据不同的运维方式调整
逻辑,作业,平台,集群

JVM
适用于单个作业的调整
增加容器数量 vs 增加内存/CPU/并发
根据作业的特性,例如高I/O作业,可能需要更多的Container
根据Metrics反馈,例如周期性峰值数据量,可能需要更多内存缓冲
根据异常反馈,例如周期性AkkaTimeout,可能需要更多的Locality
其他的Flink运维调参
更多的Parallism vs 更多的TaskManager Slot
内存分配:Direct Heap vs offHeap vs Reserve

集群设置
适用于平台/集群的运维
保证作业根据作业间的集群分离
如何进行资源隔离:CPU,内存,disk
是否Over-Subscribe
保证集群的整体负载平衡
如何分配资源配额
如何保证不出现I/O Hotspot
如何保证container的初始化对DFS的负载平衡

调参进阶
Flink调参
调参是一个多维度协调的过程
Flink的特殊集群接口

总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
判断运维方式
优化集群?
优化流处理?

Metrics
基础JVM
流系统,I/O
State管理
自定义

时间序列分析
整合
除噪/特征值

调参
反压分析
增加资源
调整负载