共计 3461 个字符,预计需要花费 9 分钟才能阅读完成。
1. 常见运维问题
1.1 作业运行环境
本文中介绍的作业运行环境次要是在阿里巴巴团体内,构建在 Hadoop 生态之上的 Flink 集群,蕴含 Yarn、HDFS、ZK 等组件;作业提交模式采纳 yarn per-job Detached 模式。
- 第 1 步,作业提交是通过 Flink Yarn Client,将用户所写的作业代码以及编译好的 jar 包上传到 HDFS 上;
- 第 2 步 Flink Client 与 Yarn ResourceManager 进行通信,申请所须要的的 Container 资源;
- 第 3 步,ResourceManager 收到申请后会在集群中的 NodeManager 调配启动 AppMaster 的 Container 过程,AppMaster 中蕴含 Flink JobManager 模块和 Yarn 通信的 ResourceManager 模块;
- 第 4 步,在 JobManager 中依据作业的 JobGraph 生成 Execution Graph,ResourceManager 模块向 Yarn 的 ResourceManager 通信,申请 TaskManager 须要的 container 资源,这些 container 由 Yarn 的 NodeManger 负责拉起。每个 NodeManager 从 HDFS 上下载资源,启动 Container(TaskManager),并向 JobManager 注册;JobManger 会部署不同的 task 工作到各个 TaskManager 中执行。
■ 资源申请形式
1. 指定资源大小
提交时,指定每个 TaskManager、JobManager 应用多少内存,CPU 资源。
2. 细粒度资源管制
阿里巴巴团体内次要采纳 ResourceSpec 形式指定每个 Operator 所需的资源大小,根据 task 的并发聚合成 container 资源向 Yarn 申请。
■ 环境高可用
- JM 高可用,AppMaster(JobManager) 异样后,能够通过 Yarn 的 APP attempt 与 ZooKeeper 机制来保障高可用;
- 数据高可用,作业做 checkpoint 时,TaskManager 优先写本地磁盘,同时异步写到 HDFS;当作业再次启动时能够从 HDFS 上复原到上次 checkpoint 的点位持续作业流程。
1.2 为什么我的作业延时了?
■ 工夫类型
-
Processing time
Processing time 是指 task 解决数据时所在机器的零碎工夫 -
Event time
Event time 是指数据当中某一数据列的工夫 -
Ingestion time
Ingestion time 是指在 flink source 节点收到这条数据时的零碎零碎工夫
■ 延时定义
自定义 Source 源解析中退出 Gauge 类型指标埋点,汇报如下指标:
- 记录最新的一条数据中的 event time,在汇报指标时应用以后零碎工夫 – event time。
- 记录读取到数据的零碎工夫 - 数据中的 event time,间接汇报差值。
delay = 以后零碎工夫 – 数据事件工夫 (event time)
阐明:反馈解决数据的进度状况。
fetch_delay = 读取到数据的零碎工夫 - 数据事件工夫 (event time)
阐明:反馈实时计算的理论解决能力。
■ 延时剖析
- 从上游源头,查看每个源头并发状况
- 是否上游数据稠密导致
- 作业性能问题
1.3 为什么我的作业 failover 了?
■ 作业 failover 次要分为两大类
Flink Failover 次要有两类,一类是 Job Manager 的 Failover,还有一类是 Task Manager 的 Failover。
1.4 作业无奈提交、异样进行
■ 无奈提交
- Yarn 问题 – 资源限度
- HDFS 问题 – Jar 包过大,HDFS 异样
- JobManager 资源有余,无奈响应 TM 注册
- TaskManager 启动过程中异样
■ 异样进行 - 指标监控无奈笼罩
- 重启策略配置谬误
- 重启次数达到下限
2. 解决形式
2.1 延时问题解决形式
- 通过 delay、fetch_delay 判断是否上游稠密导致延时或者作业性能有余导致延时
- 确定延时后,通过反压剖析,找到反压节点
- 剖析反压节点指标参数
- 通过剖析 JVM 过程或者堆栈信息
- 通过查看 TaskManager 等日志
■ 延时与吞吐
察看延时与 tps 指标之间关联,是否因为 tps 的异样增高,导致作业性能有余延时
■ 反压
- 找到反压的源头。
- 节点之间的数据传输方式 shuffle/rebalance/hash。
- 节点各并发的吞吐状况,反压是不是因为数据歪斜导致。
- 业务逻辑,是否有正则,内部零碎拜访等。IO/CPU 瓶颈,导致节点的性能有余。
■ 指标
- GC 耗时多长
- 短时间内屡次 GC
- state 本地磁盘的 IO 状况
- 内部零碎拜访延时等等
■ 堆栈
在 TaskManager 所在节点, 查看线程 TID、CPU 应用状况,确定是 CPU,还是 IO 问题。
ps H -p ${javapid} -o user,pid,ppid,tid,time,%cpu,cmd
#转换为 16 进制后查看 tid 具体堆栈
jstack ${javapid} > jstack.log
■ 常见解决形式
- 减少反压节点的并发数。
- 调整节点资源,减少 CPU,内存。
- 拆分节点,将 chain 起来的耗费资源较多的 operator 拆分。
- 作业或集群优化,通过主键打散,数据去重,数据歪斜,GC 参数,Jobmanager 参数等形式调优。
2.2 作业 failover 剖析
- 查看作业 failover 时打印的一些日志信息
- 查看 failover 的 Subtask 找到所在 Taskmanager 节点
- 联合 Job/Taskmanager 等日志信息
- 联合 Yarn 和 OS 等相干日志
3. 作业生命周期
3.1 作业状态变动 -JobStatus
上图中能够看到作业的整个状态转换。从作业创立、到运行、失败,重启,胜利等整个生命周期。
这里须要留神的是 reconciling 的状态,这个状态示意 yarn 中 AppMaster 重新启动,复原其中的 JobManager 模块,这个作业会从 created 进入到 reconciling 的状态,期待其余 Taskmanager 汇报,复原 JobManager 的 failover,而后从 reconciling 再到失常 running。
3.2 Task 状态变动 -ExecutionState
上图是作业的 Task 状态转换,须要留神的是,作业状态处于 running 状态时,并不意味着作业肯定在运行生产信息。在流式计算中只有等所有的 task 都在 running 时,作业才算真正运行。
通过记录作业各个阶段的状态变动,造成生命周期,咱们能很分明地展现作业是什么时候开始运行、什么时候失败,以及 taskmanager failover 等要害事件,进一步能剖析出集群中有多少个作业正在运行,造成 SLA 规范。
4. 工具化教训
4.1 指标
如何去掂量一个作业是否失常?
-
延时与吞吐
对于 Flink 作业来说,最要害的指标就是延时和吞吐。在多少 TPS 水位的状况下,作业才会开始延时. -
内部零碎调用
从指标上还能够建设对外部零碎调用的耗时统计,比如说维表 join,sink 写入到内部零碎须要耗费多少工夫,有助于咱们排除内部的一些零碎异样的一些因素。 -
基线治理
建设指标基线治理。比如说 state 拜访耗时,平时没有延时的时候,state 拜访耗时是多少?每个 checkpoint 的数据量大略是多少?在异常情况下,这些都有助于咱们对 Flink 的作业的问题进行排查。
4.2 日志
- 谬误日志
JobManager 或者 TaskManager 的关键字及谬误日志报警。 - 事件日志
JobManager 或者 TaskManager 的状态变动造成要害事件记录。 - 历史日志收集
当作业完结后,想要剖析问题,须要从 Yarn 的 History Server 或曾经采集的日志零碎中找历史信息。 - 日志剖析
有了 JobManager,TaskManager 的日志之后,能够对常见的 failover 类型进行聚类,标注出一些常见的 failover,比如说 OOM 或者一些常见的上下游拜访的谬误等等。
4.3 关联剖析
- 作业指标 / 事件 – Taskmanager,JobManager
- Yarn 事件 – 资源抢占,NodeManager Decommission
- 机器异样 – 宕机、替换
- Failover 日志聚类
在做了这些指标和日志的解决之后,能够对各组件的事件进行关联,比如说当 TaskManager failover 时,有可能是因为机器的异样。也能够通过 Flink 作业解析 Yarn 的事件,关联作业与 Container 资源抢占,NodeManager 下线的事件等。
作者简介:
杨阳(时溪),阿里巴巴技术专家,目前就任于阿里巴巴计算平台事业部,负责实时计算中 Flink 运维开发。