快手基于 Flink 的持续优化与实践

简介: 快手基于 Flink 的持续优化与实践的介绍。

一、Flink 稳定性持续优化

第一部分是 Flink 稳定性的持续优化。该部分包括两个方面,第一个方面,主要介绍快手在 Flink Kafka Connector 方面做的一些高可用,是基于内部的双机房读或双机房写和一些容错的策略。第二部分关于 Flink 任务的故障恢复。我们在加速故障恢复方面做了一些优化工作。

 

首先,介绍 Source 方面的高可用。在公司内部比较重要的数据写 Kafka 时,Kafka 层面为保障高可用一般都会创建双集群的 topic。双集群的 topic 共同承担全部流量,如果单集群发生故障,上游自动分流。Kafka 层面通过这种方式做到双集群的高可用。但是 Flink 任务在消费双集群 topic 时,本身是不能做到高可用的。Flink 任务通过两个 Source union 方式消费,Source 分别感知上游 topic 故障,单集群故障需手动将故障 Source 摘除。这种方式的缺点是故障时需要人工的干预,必须手动去修改代码的逻辑,程序内部本身是不能做到高可用的。这是做双机房读的背景。

 

为了解决上述问题,我们封装了一个 Kafka 的 Cluster Source,它在 API 上支持读取双集群的 topic。同时做到,可以容忍单集群故障,集群故障恢复时也可以自动将故障集群重新加入。

 

接下来是关于 Sink 方面的高可用。Flink 写双集群 Kafka topic,会定义不同集群 Sink,逻辑内控制拆流。这种方式灵活性差,且不能容忍单机房故障。如果单集群发生故障,仍需要手动摘除对应的 Sink。

 

同样,针对 sink 我们也定制了一个 Cluster Sink,它 API 上支持写双集群 topic。具体写的策略,可以支持轮询和主从写的方式。如果单集群发生故障,逻辑内会自动将流量切到正常集群 topic。如果单集群故障恢复之后,也能感知到集群的恢复,可以自动的再把相应集群恢复回来。

 

另外,基于 Kafka 的 connector,我们也做了一些容错的策略,这里提到三点。

  • 第一点就是 Kafka Sink 容忍丢失。该问题的背景是,如果 Kafka 服务异常引发任务失败,并且业务可以容忍少量数据丢失,但是不期望任务挂掉的情况。针对该问题,我们的优化是,设置 Kafka Sink 容忍 M 时间内 X% 丢失。具体实现上,Sink 单 task 统计失败频率,失败频率超过阈值任务才失败。
  • 第二点是 Kafka Source 一键丢 lag。该问题背景是, 一旦任务 lag 较长时间,未及时发现,或者任务 debug 环节,需要丢掉历史验证。之前只能靠重启任务来丢弃 lag,任务重启代码比较好,耗时长。我们优化后,可以热更新、无需重启任务即可以丢弃 lag。实现逻辑是动态发操作命令给 source,source 收到命令后 seek 到最新位置。
  • 第三点是 Kafka broker 列表动态获取。该问题背景是, 生产环境中 Kafka broker 机器可能会故障下线,一旦请求到下线机器,会发生获取 metadata 超时,任务频繁失败。我们优化后,Source task 启动,可以获取集群信息,动态重新获取 Kafka brokerlist,避免频繁重启。

 

第二部分是 Flink 任务的故障恢复优化,分为两个过程。一个是故障发现,另外一个是故障恢复。实际的生产环境中,一些不稳定的因素会导致故障恢复的时间特别的长,用户的感知会比较差。同时,内部也有一些比较高优的任务,它对稳定性的要求比较高。我们希望做一些事情,把整个故障恢复的时间尽可能缩短。我们定了一个优化目标,20 秒内做到一个自动的恢复。

在故障发现阶段的优化包括三点:

  • 第一,内部自研 Hawk 系统,5s 发现宕机。
  • 第二,Yarn 整合 Hawk,快速感知宕机。
  • 第三,Flink 感知宕机 container release。

在故障恢复阶段的优化包括:

  • 第一,允许冗余部分 Container。
  • 第二,适当调整 cancel task timeout 时间。
  • 第三,针对适合任务开启 Region Failover。

 

二、Flink 任务启动优化

第二部分是任务启动优化,Flink 任务启动的时候,一般会涉及到比较多的角色,还有多个实例。如下图所示,它的启动在客户端包括,初始化 Client,构建 jobGraph,上传 Flink lib、job jar,申请 AM。在 Job Master,AM 启动后、初始化,构建 ExectutionGraph,申请、启动 Container,Job Task 调度。在 Task Manager 端, 容器申请到之后,启动下载 jar 包资源,再去初始化 Task Manager 服务,然后收到 task 后才会去做部署。我们发现,线上启动一个任务的时候,基本上在分钟级别,耗时比较长。如果有一些任务需要升级,比如说,改了一些简单的逻辑,需要将原来的任务停掉,然后再去重新启动一个新的任务,这种场景可能就会更慢。因此,我在任务启动的时候做一些优化,尽可能缩短任务启动的时间,业务的断流时间也进一步缩短。

 

在 Flink 新任务启动优化方面,我们发现 IO 交互会比较耗时。在客户端的 IO 包括,Flink 引擎 lib 包上传 HDFS,用户上传 jar 包上传 HDFS。在 JobMaster 包括, Container 下载启动资源,TaskManager conf 上传 HDFS。在 TaskManager 包括, Container 下载启动资源,Conf 文件下载。

因此,想尽量的减少这样的一些 lO 的操作。针对 Flink 引擎 lib 包,设置 Public 权限,App 之间共享。对于用户 jar 包,提供工具,提前预发布到集群机器。对于 Conf 文件,通过环境变量传递。针对 JobMaster 启动 TM 频繁文件判断,增加 cache 缓存。

 

以上是针对一个新任务启动场景,下面介绍任务升级的场景。以前是同步升级,比如说,任务 A 在运行着,然后我要把任务 A 停掉,再去启动新的任务 B。如下图所示,不可用时间包括停任务 A 和启动新任务 B。是否可以不用等任务 A 完全停掉之后,再启动任务 B。针对这个想法我们做了一个异步升级的策略。新任务提前启动,初始化到 JobMaster 阶段。旧任务停掉后,完成新任务后续启动工作,这样新旧任务无缝切换。通过内部提交平台将该步骤串联起来,目标是异步升级在 20s 以内完成。

 

三、Flink SQL 实践与优化

第三部分会介绍一下我们在使用 Flink SQL 的一些实践和优化。首先介绍一下 Flink SQL 在快手的现状。目前,我们内部 Flink SQL 的任务占比在 30% 左右。Flink SQL 的任务个数是 360 多个。然后它的峰值处理的条目数还是比较高的,大约是 4亿每秒。在我们内部的一些重要活动的实时大屏的场景下,目前 Flink SQL 也作为一条链路,参与了相关指标的计算。

 

接下来介绍一下我们在使用 Flink SQL 的时候遇到的一些问题,以及我们做的一些优化。首先,关于 Flink SQL 的倾斜问题,在 UnBounded Agg 场景下的倾斜问题,已经有比较全面的思路去解决,总结为三点。

  • 第一,MiniBatch Aggregation,思路是内存缓存 batch 数据再进行聚合,减少状态访问次数。
  • 第二,Local Global Aggregation,思路是聚合操作拆分为两阶段, Local 阶段预聚合减少数据条数,Global 解决全局聚合。
  • 第三,Split Distinct Aggregation,思路是针对 count distinct 场景, 对分组 key 先分桶预聚合, 再对分桶结果全局聚合。

 

所以我们解决的第一个问题就是 Bounded Agg 的倾斜问题。如下图所示,拿左边的 SQL 作为例子,group by一个user,假定一天的窗口,然后去 select 每一个用户总的交易额。右边的图,假定有一些用户的交易特别多,就会造成某一些 Window Agg 的数据量特别大。

 

解决思路分为两点。

  • 第一,两阶段聚合,分为 Local window Agg 和 Global window Agg。Local window Agg:预聚合 window 大小与 global 阶段保持一致,checkpoint 时将结果写出,不保存状态 。Global window Agg:全量聚合。
  • 第二,增加 mini-batch,好处是 local 阶段 mini-batch 避免数据量缓存过多,Global 阶段 mini-batch 减少状态访问次数。

 

我们解决的第二个问题是 Flink SQL 下的 UDF 函数复用的问题。如下图所示,以左边的 SQL 为例,可以看到有两个 UDF 的函数,这两个函数在 SQL 里面都重复出现了多次。

  • 优化前:相同 UDF 多次执行,性能变差。
  • 优化后:同一条数据下 UDF 结果复用,避免多次调用执行,节约资源,性能也得到提升。拿示例 SQL 来说,性能提升了 2 倍。

 

四、未来工作

第四部分介绍我们未来的一些规划,分为三块。

  • 第一,关于资源利用率。目标是提升集群整体资源利用均衡性,Flink 任务内调度均衡性,以及 Flink 任务资源使用合理性。
  • 第二,关于 Flink SQL。我们会持续的去做推广。我们希望提升 SQL 任务稳定性和 SQL 任务资源的利用率。
  • 第三,探索流批统一,这也是业界的一个方向。我们希望可以一套代码就解决问题,不用重复开发两套任务。

 

作者:阿里云实时计算Flink

原文链接

本文为阿里云原创内容,未经允许不得转载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平台建设的7大问题:蚂蚁AI平台实践深度总结

简介: 在支持蚂蚁几乎所有核心业务运行和发展的过程中,我们在平台建设、业务支持、平台运营、AI创新以及AI整体运营等各个方面做了很多尝试,有了不少的收获和感悟,在此分享给大家。 过去几年,我和团队一直在负责蚂蚁集…

知乎热问:进入内核态究竟是什么意思?

‍‍知乎上有一个问题:进入内核态究竟是什么意思?暂且忘记这个问题,让我们从另一个问题出发,一步步引出这个问题的答案。特权指令问题现代计算机里面,同时运行了很多程序,比如Office软件、浏览器、QQ、还有…

我在阿里云做云开发平台

简介: 你体验过云上的研发模式了没? 各大云厂商今年在开发者阵地侧逐渐开始向“云”化开发发展,最为显著的产品就是Cloud IDE,催生出来的趋势就是云端开发。云开发现阶段尽管在各大公司内部无法作为日常开发工具普遍推广&#xff…

mysql 事务日志备份_事务日志备份与恢复 5

14.5 用Bak文件恢复到故障点的奥秘如果数据库被损坏,我们就只能利用备份集文件(通常扩展名为BAK)来恢复数据库,如果备份集中包含了尾日志备份,我们同样能将数据库恢复到故障点。前面我们已经介绍了使用restore headeronly命令可以查看备份集文…

从no-code到low-code:企业级hpaPaaS的未来

简介: 本文将简单谈一谈基于 no-code > low-code > pro-code 渐进式思路的研发体系。 引子 宜搭负责人骁勇给我举过一个例子,我们小时候逢年过节穿的衣服,都是去裁缝店选一下材料、量一下尺寸,等个半个来月,讨回…

“解救”外卖骑手,美团首次公开算法规则!

整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)相信大家点外卖的时候都会注意到“预估到达时间”这一栏,那你是否好奇过这个时间是怎么得出来的呢?简单用距离除以速度?还是结合送餐距离、出餐时间和天气情况等更多…

Serverless 极致弹性解构在线游戏行业痛点

简介: 本文将通过剖析一个个具体的场景案例,以期望给相关的游戏开发同学带来共鸣,同时也希望能给非游戏行业的同学带来一些启发。 一、前言 1. 游戏客户上云关注点 游戏行业是一个富有创意又竞争激烈的市场,被称为第九艺术。游戏…

ACK正式支持对基于Alibaba Cloud Linux操作系统的集群进行等保加固

简介: 我们对基于Alibaba Cloud linux操作系统的ACK集群进行等保加固,意味着阿里云在云产品开发和交付的过程中将安全作为重要组成部分,将合规融入到产品的“血液”中,把安全植入产品的“骨髓”里,能够帮助有等保诉求的…

华为一口气发布十余款新品,HarmonyOS用户过亿

9月13日19:30,华为在线上举办了智慧办公新品发布会。本次发布会带来了华为MateBook 13s笔记本电脑、华为MateBook 14s笔记本电脑、华为MateStation X一体机、华为PixLab X1打印机、华为MateView GT 27英寸曲面屏显示器以及华为MatePad Pro 12.6英寸套装版等十余款新…

labelme实例分割_MaskRCNN在多个实例数据集上实践

刚刚开通付费功能,好奇心驱使我试试效果,这不,前两天试了一下,感觉也没啥新奇的。我的公众号使命是记录和分享个人学习经历,不会使用付费功能的。在此也非常感谢之前给我付费的小伙伴哈,哈哈,话…

技术干货 | 阿里云数据库PostgreSQL 13大版本揭秘

简介: 阿里云RDS PostgreSQL是一款兼容开源PostgreSQL的全托管云数据库产品,自2015年首次发布以来,根据用户需求不断升级迭代,已支持9.4、10、11、12等多个版本,覆盖了高可用版、基础版、只读实例等多种形态&#xff0…

国家能源集团携手华为首次部署矿鸿操作系统,开创工控新纪元

9月14日,由国家能源集团携手华为公司共同举办的“矿鸿操作系统”发布会在北京圆满举行。矿监局、工信部、科技部、能源局、煤炭工业协会、国家能源集团、华为等政府机构与企业代表出席,共同见证了“矿鸿操作系统”的正式发布。面对煤矿数字化、智能化的快…

MaxCompute在电商场景中如何进行漏斗模型分析

简介: 本文以某电商案例为例,通过案例为您介绍如何使用离线计算并制作漏斗图。 背景 漏斗模型其实是通过产品各项数据的转化率来判断产品运营情况的工具。转化漏斗则是通过各阶段数据的转化,来判断产品在哪一个环节出了问题,然后…

ado.net mysql 事务_ADO.NET事务

在发布System.Transaction命名空间之前,可以直接用ADO.NET创建事务,也可以通过组件、特性和COM运行库(位于System.EnterpriseServices命名空间中)进行事务处理。本文如题所示,介绍在这些传统事务处理方式中较为简单的“ASP.NET事务”。在传统…

这可能是大型复杂项目下数据流的最佳实践

简介: 实际项目中沉淀的数据流最佳实践。 数据流是前端一直以来都存在的一个问题,我们项目沉淀了一套最佳实践,如有问题,欢迎探讨 在旧的 Done 项目中,代码复杂度高,已经到了“牵一发而动全身”&#xff0c…

淘宝推荐、视频搜索背后的检索技术竟是它!深度揭秘达摩院向量检索引擎Proxima

简介: 淘宝搜索推荐、视频搜索的背后使用了什么样的检索技术?非结构化数据检索,向量检索,以及多模态检索,它们到底解决了什么问题?今天由阿里巴巴达摩院的科学家从业务问题出发,抽丝剥茧&#x…

ipython和jupyter哪个好_对Python开发者而言,IPython仍然是Jupyter Notebook的核心

如果你不明白 Jupyter 是什么,这么说吧,它拥有和 IPython 同样的代码,并且是由同一批人开发的,只不过取了一个新名字、安了一个新家。下面这个注脚进一步说明了这一点:我从声明中解读出来的信息是,“Jupyte…

这个高薪行业正在大量招人,你会考虑吗?

作者 | 侯淼淼 出品 | 《新程序员》当人们提及“程序员”这一职业的时候,大多数人的第一想法往往是高薪。然而近年来,随着造车势力的兴起,新一轮的高薪岗位抢人大战正式打响。2021年以来,一汽、东风等传统车厂招聘岗位数量持…

AI在出行场景的应用实践:路线规划、ETA、动态事件挖掘…

简介: 本文是#春招专栏#系列的第1篇,根据高德机器学习研发部负责人damon在AT技术讲坛所分享的《AI在出行领域的应用实践》的内容整理而成。 前言:又到春招季!作为国民级出行服务平台,高德业务快速发展,大量…

lsof查看进程占用文件_Linux 利用lsof命令查找已经删除的文件来释放磁盘空间

测试环境一台服务器/ 根目录空间使用率达到94%,但是通过du -sh * 发现实际空间没没用用到那么多,初步怀疑,之前删除的文件,有运行中的进程一直占用,导致空间没有释放,如图通过du -sh * 发现共实际使用不到1…