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

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 本文中介绍的作业运行环境主要是在阿里巴巴集团内,构建在 Hadoop 生态之上的 Flink 集群,包含 Yarn、HDFS、ZK 等组件;作业提交模式采用 yarn per-job Detached 模式。

整理:张宋庆(Flink 社区志愿者)
校对:李庆(Flink 社区志愿者)
作者:杨阳(时溪),阿里巴巴技术专家

摘要:本文由阿里巴巴高级运维工程师杨阳(时溪)分享,主要介绍阿里巴巴常见问题诊断模块与思路,内容涵盖以下几个方面:

  • 常见运维问题
  • 问题处理方式
  • 作业生命周期
  • 工具化经验

Tips:点击「阅读原文」链接可查看作者原版 PPT 及分享视频~

1.常见运维问题

1.1 作业运行环境

本文中介绍的作业运行环境主要是在阿里巴巴集团内,构建在 Hadoop 生态之上的 Flink 集群,包含 Yarn、HDFS、ZK 等组件;作业提交模式采用 yarn per-job Detached 模式。

01.png

  • 第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)
说明:反应实时计算的实际处理能力。

■ 延时分析

02.png

  • 从上游源头,查看每个源头并发情况
  • 是否上游数据稀疏导致
  • 作业性能问题

1.3 为什么我的作业 failover 了?

■ 作业 failover 主要分为两大类

03.png

Flink Failover 主要有两类,一类是 Job Manager 的 Failover,还有一类是 Task Manager 的 Failover。

1.4 作业无法提交、异常停止

■ 无法提交

  • Yarn 问题 – 资源限制
  • HDFS 问题 - Jar 包过大,HDFS 异常
  • JobManager 资源不足,无法响应 TM 注册
  • TaskManager 启动过程中异常

■ 异常停止-指标监控无法覆盖

  • 重启策略配置错误
  • 重启次数达到上限

2.处理方式

2.1 延时问题处理方式

04.png

  • 通过 delay、fetch_delay 判断是否上游稀疏导致延时或者作业性能不足导致延时
  • 确定延时后,通过反压分析,找到反压节点
  • 分析反压节点指标参数
  • 通过分析 JVM 进程或者堆栈信息
  • 通过查看 TaskManager 等日志

■ 延时与吞吐

05.png

观察延时与 tps 指标之间关联,是否由于 tps 的异常增高,导致作业性能不足延时

■ 反压

  • 找到反压的源头。
  • 节点之间的数据传输方式 shuffle/rebalance/hash。
  • 节点各并发的吞吐情况,反压是不是由于数据倾斜导致。
  • 业务逻辑,是否有正则,外部系统访问等。IO/CPU 瓶颈,导致节点的性能不足。

■ 指标

06.png

  • 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

■ 常见处理方式

07.png

  1. 增加反压节点的并发数。
  2. 调整节点资源,增加 CPU,内存。
  3. 拆分节点,将 chain 起来的消耗资源较多的 operator 拆分。
  4. 作业或集群优化,通过主键打散,数据去重,数据倾斜,GC 参数,Jobmanager 参数等方式调优。

2.2 作业 failover 分析

08.png

  • 查看作业 failover 时打印的一些日志信息
  • 查看 failover 的 Subtask 找到所在 Taskmanager 节点
  • 结合 Job/Taskmanager 等日志信息
  • 结合 Yarn 和 OS 等相关日志

3.作业生命周期

3.1 作业状态变化-JobStatus

09.png

上图中可以看到作业的整个状态转换。从作业创建、到运行、失败,重启,成功等整个生命周期。

这里需要注意的是 reconciling 的状态,这个状态表示 yarn 中 AppMaster 重新启动,恢复其中的 JobManager 模块,这个作业会从 created 进入到 reconciling 的状态,等待其他 Taskmanager 汇报,恢复 JobManager 的 failover,然后从 reconciling 再到正常 running。

3.2 Task 状态变化 -ExecutionState

10.png

上图是作业的 Task 状态转换,需要注意的是,作业状态处于 running 状态时,并不意味着作业一定在运行消费信息。在流式计算中只有等所有的 task 都在 running 时,作业才算真正运行。

通过记录作业各个阶段的状态变化,形成生命周期,我们能很清楚地展示作业是什么时候开始运行、什么时候失败,以及 taskmanager failover 等关键事件,进一步能分析出集群中有多少个作业正在运行,形成 SLA 标准。

4.工具化经验

4.1 指标

11.png

如何去衡量一个作业是否正常?

  • 延时与吞吐
    对于 Flink 作业来说,最关键的指标就是延时和吞吐。在多少 TPS 水位的情况下,作业才会开始延时.
  • 外部系统调用
    从指标上还可以建立对外部系统调用的耗时统计,比如说维表 join,sink 写入到外部系统需要消耗多少时间,有助于我们排除外部的一些系统异常的一些因素。
  • 基线管理
    建立指标基线管理。比如说 state 访问耗时,平时没有延时的时候,state 访问耗时是多少?每个 checkpoint 的数据量大概是多少?在异常情况下,这些都有助于我们对 Flink 的作业的问题进行排查。

4.2 日志

12.png

  • 错误日志
    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 运维开发。

相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
相关文章
|
11月前
|
分布式计算 数据处理 Apache
Spark和Flink的区别是什么?如何选择?都应用在哪些行业?
【10月更文挑战第10天】Spark和Flink的区别是什么?如何选择?都应用在哪些行业?
983 1
|
4月前
|
消息中间件 运维 Kafka
直播预告|Kafka+Flink双引擎实战:手把手带你搭建分布式实时分析平台!
在数字化转型中,企业亟需从海量数据中快速提取价值并转化为业务增长动力。5月15日19:00-21:00,阿里云三位技术专家将讲解Kafka与Flink的强强联合方案,帮助企业零门槛构建分布式实时分析平台。此组合广泛应用于实时风控、用户行为追踪等场景,具备高吞吐、弹性扩缩容及亚秒级响应优势。直播适合初学者、开发者和数据工程师,参与还有机会领取定制好礼!扫描海报二维码或点击链接预约直播:[https://developer.aliyun.com/live/255088](https://developer.aliyun.com/live/255088)
311 35
直播预告|Kafka+Flink双引擎实战:手把手带你搭建分布式实时分析平台!
|
4月前
|
消息中间件 运维 Kafka
直播预告|Kafka+Flink 双引擎实战:手把手带你搭建分布式实时分析平台!
直播预告|Kafka+Flink 双引擎实战:手把手带你搭建分布式实时分析平台!
142 11
|
3月前
|
资源调度 Kubernetes 流计算
Flink在B站的大规模云原生实践
本文基于哔哩哔哩资深开发工程师丁国涛在Flink Forward Asia 2024云原生专场的分享,围绕Flink On K8S的实践展开。内容涵盖五个部分:背景介绍、功能及稳定性优化、性能优化、运维优化和未来展望。文章详细分析了从YARN迁移到K8S的优势与挑战,包括资源池统一、环境一致性改进及隔离性提升,并针对镜像优化、Pod异常处理、启动速度优化等问题提出解决方案。此外,还探讨了多机房容灾、负载均衡及潮汐混部等未来发展方向,为Flink云原生化提供了全面的技术参考。
193 9
Flink在B站的大规模云原生实践
|
10月前
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
628 2
ClickHouse与大数据生态集成:Spark & Flink 实战
|
6月前
|
存储 运维 监控
阿里妈妈基于 Flink+Paimon 的 Lakehouse 应用实践
本文总结了阿里妈妈数据技术专家陈亮在Flink Forward Asia 2024大会上的分享,围绕广告业务背景、架构设计及湖仓方案演进展开。内容涵盖广告生态运作、实时数仓挑战与优化,以及基于Paimon的湖仓方案优势。通过分层设计与技术优化,实现业务交付周期缩短30%以上,资源开销降低40%,并大幅提升系统稳定性和运营效率。文章还介绍了阿里云实时计算Flink版的免费试用活动,助力企业探索实时计算与湖仓一体化解决方案。
768 3
阿里妈妈基于 Flink+Paimon 的 Lakehouse 应用实践
|
6月前
|
SQL 弹性计算 DataWorks
Flink CDC 在阿里云 DataWorks 数据集成入湖场景的应用实践
Flink CDC 在阿里云 DataWorks 数据集成入湖场景的应用实践
237 6
|
6月前
|
消息中间件 JSON 数据库
探索Flink动态CEP:杭州银行的实战案例
探索Flink动态CEP:杭州银行的实战案例
171 5
|
9月前
|
消息中间件 JSON 数据库
探索Flink动态CEP:杭州银行的实战案例
本文由杭州银行大数据工程师唐占峰、欧阳武林撰写,介绍Flink动态CEP的定义、应用场景、技术实现及使用方式。Flink动态CEP是基于Flink的复杂事件处理库,支持在不重启服务的情况下动态更新规则,适应快速变化的业务需求。文章详细阐述了其在反洗钱、反欺诈和实时营销等金融领域的应用,并展示了某金融机构的实际应用案例。通过动态CEP,用户可以实时调整规则,提高系统的灵活性和响应速度,降低维护成本。文中还提供了具体的代码示例和技术细节,帮助读者理解和使用Flink动态CEP。
1047 2
探索Flink动态CEP:杭州银行的实战案例
|
API C# Shell
WPF与Windows Shell完美融合:深入解析文件系统操作技巧——从基本文件管理到高级Shell功能调用,全面掌握WPF中的文件处理艺术
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的关键组件,用于构建 Windows 桌面应用程序。WPF 提供了丰富的功能来创建美观且功能强大的用户界面。本文通过问题解答的形式,探讨了如何在 WPF 应用中集成 Windows Shell 功能,并通过具体示例代码展示了文件系统的操作方法,包括列出目录下的所有文件、创建和删除文件、移动和复制文件以及打开文件夹或文件等。
275 0

相关产品

  • 实时计算 Flink版