Flink 引擎在快手的深度优化与生产实践

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 快手实时计算团队技术专家刘建刚在 FFA 2021 的演讲。

摘要:本文整理自快手实时计算团队技术专家刘建刚在 Flink Forward Asia 2021 生产实践专场的演讲。主要内容包括:

  1. 快手 Flink 的历史及现状
  2. Flink 容错能力提升
  3. Flink 引擎控制与实践
  4. 快手批处理实践
  5. 未来规划

点击查看直播回放 & 演讲PDF

一、快手 Flink 的历史与现状

img

快手从 2018 年开始对 Flink 进行深度整合,经过 4 年发展,实时计算平台逐渐完善并赋能周边各种组件。

  • 2018 年我们针对 Flink 1.4 进行了平台化建设并大幅提升运维管理能力,达到了生产可用。
  • 2019 年我们开始基于 1.6 版本进行迭代开发,很多业务都开始实时化,比如优化 interval join 为商业化等平台带来显著收益、开发实时多维分析加速超大多维报表的实时化,这一年我们的 Flink SQL 平台也投入使用。
  • 到了 2020 年,我们升级到 1.10,对 sql 的功能进行了非常多的完善,同时进一步优化 Flink 的核心引擎,保障了 Flink 的易用性、稳定性、可维护性。
  • 2021 年我们开始发力离线计算,支持湖仓一体的建设,进一步完善 Flink 生态。

img

上图是快手基于 Flink 的技术栈。

  • 最核心、最底层是 Flink 的计算引擎,包括流计算和批处理,我们针对稳定性和性能做了大量工作。
  • 外面一层是跟 Flink 打交道的周边组件,既有 Kafka、rocketMQ 等中间件,也有 ClickHouse、Hive 等数据分析工具,还有 Hudi 等数据湖的使用。用户可以基于 Flink 和这些组件构建各种应用,涵盖了实时、近实时、批处理的各种场景。
  • 最外层是具体的使用场景,常见的有电商、商业化等视频相关的业务方,应用场景包含机器学习、多维分析等。另外还有很多技术部门基于 Flink 来实现数据的导入、转换,比如 CDC、湖仓一体等。

img

应用规模上,我们有 50 万 CPU 核,主要通过 Yarn 和 K8s 的方式进行资源托管,上面运行着 2000+ 作业,峰值处理达到了 6亿/秒,日处理条数达到了 31.7 万亿,节假日或活动的时候流量甚至会翻倍。

二、容错能力提升

img

容错能力主要包含以下部分:

  • 首先是单点恢复,支持任意多个 task 失败时的原地重启,long-running 作业基本可以做到永不断流;
  • 其次,是集群故障的应对,包含冷备、热备以及 Kafka 双集群的集成;最后是黑名单的使用。

img

Flink 为了做到 exactly-once,任何节点出现故障都需要重启整个作业,全局重启会带来长时间的停顿,最高可达十几分钟。有些场景不追求 exactly-once,比如推荐等实时场景,但它们对服务可用性的要求很高,无法容忍作业的断流,还有模型训练等初始化很慢的场景,重启时间特别长,一旦重启将会造成很大的影响。基于以上考虑,我们开发了单点恢复功能。

img

上图是单点恢复的基本原理。如图有三个 task,其中中间的 task 失败了,那么首先 Flink 的主节点会重新调度中间的 task,此时上下游的 task 不会失败,而是等待重连。等中间的 task 调度成功后,master 节点会通知下游的 task 去重连上游的 task,与此同时中间的 task 也会去连它上游的 task,通过重新构建读视图来恢复数据的读取。等上下游都连接成功后这个作业就可以正常工作了。

img

了解完基本原理,再来看一下线上多 task 恢复的案例。实际环境中经常会出现多个 task 同时失败的情况,这个时候我们会按照拓扑顺序来逐个恢复失败的 task,比如上图中是按照从左往右的顺序恢复。

这个功能上线之后,我们内部有将近 100 个作业使用了这个功能,常规故障下作业都可以做到不断流,即便出现小的流量波动,业务也可以做到无感知,业务方彻底告别了服务断流的噩梦。

img

集群故障一旦发生就是致命性的,所有的数据都会流失,服务也会挂掉。我们的方案主要包含冷备、热备,以及 Flink 和 Kafka 的双集群集成。

img

冷备主要指的是对数据做备份,集群挂掉以后可以快速在另外一个集群启动计算任务。

如上图,KwaiJobManager 是快手的作业管理服务,其中的 failover coordinator 主要负责故障处理。我们会把所有 jar 包等文件保存在 HDFS,所有的信息保存在 Mysql,这两者都做到了高可用。作业运行在主集群 ClusterA,线上用的是增量快照,会存在文件依赖的问题,所以我们定期做 savepoint 并拷贝到备集群。为了避免文件过多,我们设置了定时删除历史快照。

一旦服务检测到集群 A 故障,就会立刻在集群B启动作业,并从最近一次的快照恢复,确保了状态不丢失。对于用户来说,只需要设置一下主备集群,剩下的全都交由平台方来做,用户全程对故障无感知。

img

热备就是双集群同时运行一样的任务。我们的热备都是全链路的,Kafka 或者 ClickHouse 等都是双跑。最上面的展示层只会使用其中一份结果数据做展示,一旦出现故障,展示层会立刻切换到另外一份数据,切换过程在一秒以内,用户全程无感知。

相比冷备,热备需要等量的资源来备份运行,但切换的速度更快,比较适用于春晚等要求极高的场景。

img

Flink 与 Kafka 的双集群集成,主要是因为快手的 Kafka 都具备双集群的能力,所以需要 Flink 支持读写双集群的 Kafka topic,这样某个 Kafka 集群挂掉时Flink可以在线无缝切换。如上图所示,我们 Flink 对 Kafka 双集群做了抽象,一个逻辑上的 topic 底层对应两个物理上的 topic,里面由多个 partition 组合而成,Flink 消费逻辑 topic 就相当于同时读取底层两个物理 topic 的数据。

针对集群的各种变动,我们全部抽象成了 partition 上的扩缩容,比如集群挂掉,可以看成是逻辑 topic 的 partition 缩容;单集群切双集群,可以看成是逻辑 topic 的扩容;topic 的迁移,可以看成逻辑 topic 先扩容再缩容。这里我们都是按照双集群来举例,实际上无论是双集群还是更多的集群,原理都是一样的,我们都提供了支持。

img

出现以下两种情况的时候需要使用黑名单功能。第一种是反复调度有故障的机器,导致作业频繁失败。另一种是机器因为硬件或网络等原因,导致 Flink 个别节点卡主但未失败。

针对第一种情况,我们开发了阈值拉黑,如果作业在同一个机器上失败或者多次部署阈值失败,超过配置的阈值就会拉黑;针对第二种情况,我们建立了异常分类机制,针对网络卡顿和磁盘卡顿情况,直接驱除容器并且拉黑机器。另外我们还对外暴露了拉黑接口,打通了运维 Yarn 等外部系统,实现了实时拉黑。我们还以 Flink 黑名单为契机,建立了一套完整的硬件异常处理流程,实现了作业自动迁移,全程自动化运维,用户无感知。

三、Flink 引擎控制与实践

3.1 Flink实时控制

img

针对 long-running 的实时作业,用户经常需要作出变更比如调整参数来更改行为,还有一些系统运维比如作业降级、修改日志级别等,这些变更都需要重启作业来生效,有时会高达几分钟到几十分钟,在一些重要的场合,这是无法容忍的。比如在活动期间或者排查问题的关键点,作业一旦停止将会功亏一篑,所以我们需要在不停止作业的情况下实时调整作业的行为,也就是实时控制。

img

从更广泛的角度来看,Flink 不仅是计算任务,也是一个 long-running service。我们的实时控制正是基于这样的考虑,来为实时计算提供交互式的控制模式。如上图所示,用户通过经典的 kv 数据类型与 Flink dispatcher 交互,Flink 收到消息后,会先将它们持久化到 zk 用于 failover,然后根据具体的消息做相应的控制,比如控制 resource manager、控制 job master 或者其他组件。

img

我们既支持用户自定义动态参数,也为用户提供了很多现成的系统控制。用户自定义主要是使用 RichFunction 来获取动态参数,并且实现相应的逻辑,这样在作业运行的时候就可以实时传入参数,达到实时控制的效果。

系统提供的实时控制能力,主要包含数据源限速、采样、重置 Kafka offset、调整快照参数以及运维相关的更改日志级别、拉黑节点等功能。除此之外,我们还支持动态修改部分 Flink 原生配置。

快手内部对实时控制功能实现了产品化,用户使用起来非常方便。

3.2 源端控制能力

img

Flink 处理历史任务或者作业性能跟不上的的时候,会引发以下的问题:

首先 source 的各个并发处理速度不一致,会进一步加重数据的乱序、丢失、对齐慢等问题。其次,快照会持续变大,严重影响作业性能。另外还有流量资源的不可控,在高负载的情况下会引发 CPU 打满、oom 等稳定性问题。

由于 Flink 是一种 pipeline 实时计算,因此从数据源入手可以从根本上解决问题。

img

首先来看下历史数据精准回放功能。上图是以二倍速率去消费 Kafka 的历史数据,Flink 作业追上 lag 之后就可以转成实时消费。通过这种方式可以有效解决复杂任务的稳定性问题。

上图的公式是一个基本原理,消费倍率 = Kafka 的时间差 / Flink 的系统时间差,用户使用的时候只需要配置倍率即可。

img

另外一个能力是 QPS 限速。数据流量很大的时候,会导致 Flink 的负载很高以及作业不稳定。我们基于令牌桶算法,实现了一套分布式的限速策略,可以有效减缓 Flink 的压力。使用 QPS 限速后,作业变得非常健康,上图绿色部分可见。19 年的春晚大屏,我们就是通过这个技术实现了柔性可用的保障。

另外我们还支持自动适配 partition 的变更和实时控制,用户可以随时随地调整作业的 QPS。

img

最后一个功能是数据源对齐,主要指 watermark 的对齐。首先每个 subtask 都会定期向主节点汇报自己的 watermark 进度,主要包括 watermark 的大小和速度。主节点会计算下一个周期的 target,即预期的最大 watermark,再加一个 diff 返回给各个节点。各个 source task 会保证下一个周期的 watermark 不超过设置的 target。上图最下面是 target 的计算公式,预测每个 task 下个周期结束时候的 waterMark 值,再加上我们允许的 maxdiff 然后取最大值,通过这种方式可以保障各个 source 的进度一致,避免 diff 过大导致的稳定性问题。

3.3 作业均衡调度

img

生产环境中经常会出现资源不均衡的现象,比如第一点 Flink 的 task 分布不均匀,导致 task manager 资源使用不均衡,而作业的性能又往往受限于最繁忙的节点。针对这个问题,我们开发了作业均衡调度的策略;第二点是 CPU 使用不均衡,有些机器被打满而有些机器很闲。针对这个问题,我们开发了 CPU 均衡调度的功能。

img

上图中有三个 jobVertex,通过 hash shuffle 的方式来连接。上图中间部分显示了 Flink 的调度,每个 jobVertex 都是自上而下往 slot 里调度 task,结果就是前两个 slot 很满而其他 slot 很空闲,第一个 task manager 很满而第二个 task manager 很空闲。这是一个很典型的资源倾斜的场景,我们对此进行了优化。调度的时候首先计算需要的总资源,也就是需要多少个 task manager,然后计算每个 TM 分配的 slot 个数,确保 TM 中的 slot 资源均衡。最后均衡分配 task 到各个 slot 中,确保 slot 中 task 均衡。

img

实际运行过程中还存在另外一种倾斜情况 —— CPU 倾斜,我们来看下怎么解决这个问题。上图左侧,用户申请了一个核但实际只使用了 0.5 个核,也有申请了一个核实际使用了一个核。按照默认调度策略,大量此类 case 可能会导致有的机器 CPU 使用率很高,有的却很闲,负载高的机器不论是性能还是稳定性都会比较差。那么如何让申请和使用的 diff 尽可能小?

我们的方案是对作业资源精准画像,具体做法分为以下步骤:作业运行过程中统计每个 task 所在容器的 CPU 使用率,然后建立 task 到 executionSlotSharingGroup,再到 container 的映射,这样就知道了每个 task 所在 slot 的 CPU 使用情况,然后根据映射关系重启作业,根据 task 所在 slot 的历史 CPU 使用率来申请相应的资源,一般来说会预留一些 buffer。如上图右图所示,如果预测足够准,重启后 task manager 使用的资源不变,但是申请值变小了,二者的 diff 就变小了。

其实业界一些先进的系统,比如 borg 是支持动态修改申请值的,但我们的底层调度资源不持这种策略,所以只能在 Flink 这一层使用资源画像来解决这个问题。当然资源画像不能保证百分百准确,我们还有其他策略,比如限制高 CPU 负载的机器继续分配资源,尽可能减少不均衡。另外我们还建立了分级保障制度,不同优先级的作业有不同的 cgroup 限制,比如低优先级作业不再超配,高优先级作业允许少量超配,从而避免 CPU 使用过多导致的不均衡。

四、快手批处理实践

img

上图是我们的批处理架构图。最底层为离线集群,中间是 Flink 引擎以及 Flink 的 data stream API、SQL API,再上面是一些平台方比如 sql 入口、定时调度平台等,此外还有一些流批一体的探索,最上面是各种用户比如视频、商业化等。

流批一体中,流的特性是低延时,批的特性是高吞吐。针对流批一体,我们期待系统既能处理 unfield batch 数据,也可以调整数据块的 shuffle 大小等来均衡作业的吞吐和时延。

img

快手内部对流批一体进行了很多探索,我们为存储数据建立了统一的 Schema 标准,包括流表和批表,用户可以使用相同的代码来处理流表和批表,只是配置不同。产生的结果也需要符合统一的 Schema 标准,这样就可以打通上下游,实现尽可能多的逻辑复用。Schema 统一是我们快手数据治理的一部分,湖仓一体等场景也都有这个需求。

应用场景主要包括以下几个方面:

  • 指标计算,比如实时指标和报表计算。
  • 数据回溯,利用已有的离线数据重新生成其他指标。
  • 数仓加速,主要是数据仓库和数据湖的实时加速。

流批一体带来的收益是多方面的,首先是降低了开发和运维成本,实现了尽可能多的代码逻辑复用,运维不再需要维护多个系统。其次是实时处理和批处理的口径保持一致,保障了最终结果的一致。最后是资源方面的收益,有些场景只需要一套实时系统。

img

我们在调度方面进行了优化。如上图所示的三个 task,起初 a 和 c 已经完成,b 还在运行。这时 a 失败了,按照默认的策略 ABC 都需要重新运行,即便 c 已经完成。在实际场景中会有大量的 c 进行重算,带来巨大的资源损耗。针对这种情况如果,我们默认开启了以下策略:如果 a 的结果是决定性的(实际上大部分批处理的输出都是决定性的),可以不再重算 c,只需计算 a 和 b。

img

上图是我们快手内部针对批处理的优化和改进。

第一个是 shuffle service,现在既有内部的集成,也在试用社区的版本,主要是为了实现存储和计算的解耦,同时提高 shuffle 的性能。第二个是动态资源的调度,主要是根据数据量来自动决定算子的并发,避免人工反复调整。第三个是慢节点规避,也叫推测执行,主要是为了减少长尾效应,减少总执行时间。第四个是 hive 的优化,比如 UDF 适配、语法兼容。另外针对 partition 生成 split,我们增加了缓存、多线程生成等方式,极大减少了分片的时间。最后是一些压缩方式的支持,比如支持 gzip、zstd 等。

五、未来规划

img

我们的未来规划主要分为以下几个方面:

  • 首先是实时计算,进一步增强 Flink 的性能、稳定性和应用性,并通过实时计算来加速各种业务场景。
  • 第二个是在线和离线的统一,包含实时、近实时和批处理。我们期待能用 Flink 统一快手的数据同步、转换和在离线计算,让ETL、数仓、数据湖处理等各类场景,都使用一套 Flink 计算系统。
  • 最后一个是弹性可伸缩,主要是云原生相关,包含在离线混部和作业的弹性伸缩等。

点击查看直播回放 & 演讲PDF


更多 Flink 相关技术问题,可扫码加入社区钉钉交流群
第一时间获取最新技术文章和社区动态,请关注公众号~

O1CN01tmtpiy1iazJYZdixL_!!6000000004430-2-tps-899-548.png"

活动推荐

阿里云基于 Apache Flink 构建的企业级产品-实时计算Flink版现开启活动:
99 元试用 实时计算Flink版(包年包月、10CU)即有机会获得 Flink 独家定制卫衣;另包 3 个月及以上还有 85 折优惠!
了解活动详情:https://www.aliyun.com/product/bigdata/sc

image.png

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
打赏
0
1
0
0
36033
分享
相关文章
基于 Flink 的中国电信星海时空数据多引擎实时改造
本文整理自中国电信集团大数据架构师李新虎老师在Flink Forward Asia 2024的分享,围绕星海时空智能系统展开,涵盖四个核心部分:时空数据现状、实时场景多引擎化、典型应用及未来展望。系统日处理8000亿条数据,具备亚米级定位能力,通过Flink多引擎架构解决数据膨胀与响应时效等问题,优化资源利用并提升计算效率。应用场景包括运动状态识别、个体行为分析和群智感知,未来将推进湖仓一体改造与三维时空服务体系建设,助力数字化转型与智慧城市建设。
493 3
基于 Flink 的中国电信星海时空数据多引擎实时改造
京东物流基于Flink & StarRocks的湖仓建设实践
本文整理自京东物流高级数据开发工程师梁宝彬在Flink Forward Asia 2024的分享,聚焦实时湖仓的探索与建设、应用实践、问题思考及未来展望。内容涵盖京东物流通过Flink和Paimon等技术构建实时湖仓体系的过程,解决复杂业务场景下的数据分析挑战,如多维OLAP分析、大屏监控等。同时,文章详细介绍了基于StarRocks的湖仓一体方案,优化存储成本并提升查询效率,以及存算分离的应用实践。最后,对未来数据服务的发展方向进行了展望,计划推广长周期数据存储服务和原生数据湖建设,进一步提升数据分析能力。
312 1
京东物流基于Flink & StarRocks的湖仓建设实践
Flink批处理自适应执行计划优化
本文整理自阿里集团高级开发工程师孙夏在Flink Forward Asia 2024的分享,聚焦Flink自适应逻辑执行计划与Join算子优化。内容涵盖自适应批处理调度器、动态逻辑执行计划、自适应Broadcast Hash Join及Join倾斜优化等技术细节,并展望未来改进方向,如支持更多场景和智能优化策略。文章还介绍了Flink UI调整及性能优化措施,为批处理任务提供更高效、灵活的解决方案。
159 0
Flink批处理自适应执行计划优化
Flink在B站的大规模云原生实践
本文基于哔哩哔哩资深开发工程师丁国涛在Flink Forward Asia 2024云原生专场的分享,围绕Flink On K8S的实践展开。内容涵盖五个部分:背景介绍、功能及稳定性优化、性能优化、运维优化和未来展望。文章详细分析了从YARN迁移到K8S的优势与挑战,包括资源池统一、环境一致性改进及隔离性提升,并针对镜像优化、Pod异常处理、启动速度优化等问题提出解决方案。此外,还探讨了多机房容灾、负载均衡及潮汐混部等未来发展方向,为Flink云原生化提供了全面的技术参考。
147 9
Flink在B站的大规模云原生实践
Flink x Paimon 在抖音集团生活服务的落地实践
本文整理自抖音集团数据工程师陆魏与流式计算工程冯向宇在Flink Forward Asia 2024的分享,聚焦抖音生活服务业务中的实时数仓技术演变及Paimon湖仓实践。文章分为三部分:背景及现状、Paimon湖仓实践与技术优化。通过引入Paimon,解决了传统实时数仓开发效率低、资源浪费、稳定性差等问题,显著提升了开发运维效率、节省资源并增强了任务稳定性。同时,文中详细探讨了Paimon在维表实践、宽表建设、标签变更检测等场景的应用,并介绍了其核心技术优化与未来规划。
268 10
Flink x Paimon 在抖音集团生活服务的落地实践
Flink CDC 3.4 发布, 优化高频 DDL 处理,支持 Batch 模式,新增 Iceberg 支持
Apache Flink CDC 3.4.0 版本正式发布!经过4个月的开发,此版本强化了对高频表结构变更的支持,新增 batch 执行模式和 Apache Iceberg Sink 连接器,可将数据库数据全增量实时写入 Iceberg 数据湖。51位贡献者完成了259次代码提交,优化了 MySQL、MongoDB 等连接器,并修复多个缺陷。未来 3.5 版本将聚焦脏数据处理、数据限流等能力及 AI 生态对接。欢迎下载体验并提出反馈!
442 1
Flink CDC 3.4 发布, 优化高频 DDL 处理,支持 Batch 模式,新增 Iceberg 支持
网易游戏 Flink 云原生实践
本文分享了网易游戏在Flink实时计算领域的资源管理与架构演进经验,从Yarn到K8s云原生,再到混合云的实践历程。文章详细解析了各阶段的技术挑战与解决方案,包括资源隔离、弹性伸缩、自动扩缩容及服务混部等关键能力的实现。通过混合云架构,网易游戏显著提升了资源利用率,降低了30%机器成本,小作业计算成本下降40%,并为未来性能优化、流批一体及智能运维奠定了基础。
179 9
网易游戏 Flink 云原生实践
万字长文带你深入广告场景Paimon+Flink全链路探索与实践
本文将结合实时、离线数据研发痛点和当下Paimon的特性,以实例呈现低门槛、低成本、分钟级延迟的流批一体化方案,点击文章阅读详细内容~
阿里云实时计算Flink版测评报告
该测评报告详细介绍了阿里云实时计算Flink版在用户行为分析与标签画像中的应用实践,展示了其毫秒级的数据处理能力和高效的开发流程。报告还全面评测了该服务在稳定性、性能、开发运维及安全性方面的卓越表现,并对比自建Flink集群的优势。最后,报告评估了其成本效益,强调了其灵活扩展性和高投资回报率,适合各类实时数据处理需求。
实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎
本文介绍了阿里云开源大数据团队在实时计算领域的最新成果——向量化流计算引擎Flash。文章主要内容包括:Apache Flink 成为业界流计算标准、Flash 核心技术解读、性能测试数据以及在阿里巴巴集团的落地效果。Flash 是一款完全兼容 Apache Flink 的新一代流计算引擎,通过向量化技术和 C++ 实现,大幅提升了性能和成本效益。
2852 73
实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎

相关产品

  • 实时计算 Flink版
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等

    登录插画

    登录以查看您的控制台资源

    管理云资源
    状态一览
    快捷访问