阿里巴巴大规模应用Flink的实战经验:常见问题诊断思路

2020 年 8 月 20 日

阿里巴巴大规模应用Flink的实战经验:常见问题诊断思路

本文主要介绍阿里巴巴在Flink应用实战中的常见问题诊断模块与思路,内容涵盖以下几个方面:

  • 常见运维问题

  • 问题处理方式

  • 作业生命周期

  • 工具化经验


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 申请。


■ 环境高可用


  1. JM 高可用,AppMaster(JobManager) 异常后,可以通过 Yarn 的 APP attempt 与 ZooKeeper 机制来保证高可用;

  2. 数据高可用,作业做 checkpoint 时,TaskManager 优先写本地磁盘,同时异步写到 HDFS;当作业再次启动时可以从 HDFS 上恢复到上次 checkpoint 的点位继续作业流程。


1.2 为什么我的作业延时了?


■ 时间类型


  • Processing time

  • Processing time 是指 task 处理数据时所在机器的系统时间

  • Event time

  • Event time 是指数据当中某一数据列的时间

  • Ingestion time

  • Ingestion time 是指在 flink source 节点收到这条数据时的系统系统时间


■ 延时定义


自定义 Source 源解析中加入 Gauge 类型指标埋点,汇报如下指标:


  1. 记录最新的一条数据中的 event time,在汇报指标时使用当前系统时间 - event time。

  2. 记录读取到数据的系统时间-数据中的 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
复制代码


■ 常见处理方式



  1. 增加反压节点的并发数。

  2. 调整节点资源,增加 CPU,内存。

  3. 拆分节点,将 chain 起来的消耗资源较多的 operator 拆分。

  4. 作业或集群优化,通过主键打散,数据去重,数据倾斜,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 关联分析


  1. 作业指标/事件 - Taskmanager,JobManager

  2. Yarn 事件 - 资源抢占,NodeManager Decommission

  3. 机器异常 - 宕机、替换

  4. Failover 日志聚类


在做了这些指标和日志的处理之后,可以对各组件的事件进行关联,比如说当 TaskManager failover 时,有可能是因为机器的异常。也可以通过 Flink 作业解析 Yarn 的事件,关联作业与 Container 资源抢占,NodeManager 下线的事件等。


作者简介:


杨阳(时溪),阿里巴巴技术专家,目前就职于阿里巴巴计算平台事业部,负责实时计算中 Flink 运维开发。


推荐阅读:



2020 年 8 月 20 日 08:001203

评论

发布
暂无评论
发现更多内容

灯下黑中的自己

非著名程序员

个人成长 管理 管理者

让黑产无处遁形 京东智联云推出风险识别服务

京东智联云开发者

人工智能 学习 风险识别

mongodb 源码实现、调优、最佳实践系列-百万级高并发mongodb集群性能数十倍提升优化实践(下篇)

杨亚洲(专注mongodb及高性能中间件)

MySQL nosql mongodb 架构 分布式 分布式数据库mongodb

出炉!华为18A自爆SpringCloud微服务分布式笔记

996小迁

Java 编程 架构 面试 SpringCloud

直播预告 | 云时代的数据库客户端——CloudQuery最佳实践

CloudQuery社区

数据库 sql 安全 工具软件

几行代码轻松实现跨系统传递 traceId,再也不用担心对不上日志了!

程序员小航

Java 日志 链路追踪 工作笔记 traceId

mongodb内核源码实现、性能调优、最佳运维实践系列-百万级高并发mongodb集群性能数十倍提升优化实践(上篇)

杨亚洲(专注mongodb及高性能中间件)

MySQL 数据库 nosql mongodb 分布式数据库mongodb

成为 Apache 贡献者,So easy!

海豚调度

Apache 贡献

想要高效搭建企业信息平台?教你轻松选择开发框架!

Marilyn

敏捷开发 快速开发

你听过CatBoost吗?本文教你如何使用CatBoost进行快速梯度提升

计算机与AI

Python 学习 优化

jvm笔记

pCat

Java JVM

Go发起HTTP2.0请求流程分析(中篇)——数据帧&流控制

新世界杂货铺

golang 后端 HTTP2.0

LeetCode题解:98. 验证二叉搜索树,递归,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

Linux下diff的操作详解

良知犹存

Linux

数字货币交易所开发方案,撮合系统搭建app源码

WX13823153201

Github惊现高星神作,两份算法宝典让你横扫大厂算法面试题

云流

编程 程序员 算法 计算机

台湾地区为什么会丢包高?

德胜网络-阳

SpringBoot有多重要?面试用SpringBoot把面试官唬住了要30k都行!

Java架构之路

Java 程序员 架构 面试 编程语言

华为鲲鹏专家解读:90%代码如何移植到鲲鹏平台

华为云开发者社区

软件 鲲鹏

成为一名合格的技术类产品经理

小清新同学

产品经理

日常工作问题集锦

hasWhere

华为云数据安全中心正式公测,8大核心数据安全能力守护你的数据

华为云开发者社区

华为 安全 数据

第四周学习心得

熊桂平

极客大学架构师训练营

从理论到工具:带你全面了解自动化测试框架

开源 DevOps 工具 自动化测试

阿里P8大牛呕心沥血总结整理的《Java面经手册》,通过实践的方式向你深度讲解Java核心知识点

Java架构之路

Java 程序员 架构 面试 编程语言

Week 4 命题作业及总结

阿泰

详细分析定制企业应用的价格

Learun

敏捷开发 快速开发 软件架构

java安全编码指南之:Thread API调用规则

程序那些事

Java并发 多线程 java安全编码 java安全编码指南 java编码规范

面试大厂被面试官用MyBatis怼到“哑口无言”?这份MyBatis源码笔记助你吊打面试官!

Java架构之路

Java 程序员 架构 面试 编程语言

程序员的美丽假期(并不)

Philips

敏捷开发 快速开发

深入理解 JVM 垃圾回收算法 - 复制算法

Java架构师迁哥

阿里巴巴大规模应用Flink的实战经验:常见问题诊断思路-InfoQ