滴滴 Flink-1.10 升级之路

简介: 滴滴实时计算引擎从 Flink-1.4 无缝升级到 Flink-1.10 版本,做到了完全对用户透明。并且在新版本的指标、调度、SQL 引擎等进行了一些优化,在性能和易用性上相较旧版本都有很大提升。

一、 背景

在本次升级之前,我们使用的主要版本为 Flink-1.4.2,并且在社区版本上进行了一些增强,提供了 StreamSQL 和低阶 API 两种服务形式。现有集群规模达到了 1500 台物理机,运行任务数超过 12000 ,日均处理数据 3 万亿条左右。

不过随着社区的发展,尤其是 Blink 合入 master 后有很多功能和架构上的升级,我们希望能通过版本升级提供更好的流计算服务。今年 2 月份,里程碑版本 Flink-1.10 发布,我们开始在新版上上进行开发工作,踏上了充满挑战的升级之路。

二、 Flink-1.10 新特性

作为 Flink 社区至今为止的最大的一次版本升级,加入的新特性解决了之前遇到很多的痛点。

1. 原生 DDL 语法与 Catalog 支持

Flink SQL 原生支持了 DDL 语法,比如 CREATE TABLE/CREATE FUNCTION,可以使用 SQL 进行元数据的注册,而不需要使用代码的方式。

也提供了 Catalog 的支持,默认使用 InMemoryCatalog 将信息临时保存在内存中,同时也提供了 HiveCatalog 可以与 HiveMetastore 进行集成。也可以通过自己拓展 Catalog 接口实现自定义的元数据管理。

2.Flink SQL 的增强

  • 基于 ROW_NUMBER 实现的 TopN 和去重语法,拓展了 StreamSQL 的使用场景。
  • 实现了 BinaryRow 类型作为内部数据交互,将数据直接以二进制的方式构建而不是对象数组,比如使用一条数据中的某个字段时,可以只反序列其中部分数据,减少了不必要的序列化开销。
  • 新增了大量内置函数,例如字符串处理、FIRST/LAST_VALUE 等等,由于不需要转换为外部类型,相较于自定义函数效率更高。
  • 增加了 MiniBatch 优化,通过微批的处理方式提升任务的吞吐

3.内存配置优化

之前对 Flink 内存的管理一直是一个比较头疼的问题,尤其是在使用 RocksDB 时,因为一个 TaskManager 中可能存在多个 RocksDB 实例,不好估算内存使用量,就导致经常发生内存超过限制被杀。

在新版上增加了一些内存配置,例如 state.backend.rocksdb.memory.fixed-per-slot 可以轻松限制每个 slot的RocksDB 内存的使用上限,避免了 OOM 的风险。

三、挑战与应对

本次升级最大的挑战是,如何保证 StreamSQL 的兼容性。StreamSQL 的目的就是为了对用户屏蔽底层细节,能够更加专注业务逻辑,而我们可以通过版本升级甚至更换引擎来提供更好的服务。保证任务的平滑升级是最基本的要求。

1. 内部 patch 如何兼容

由于跨越多个版本架构差距巨大,内部 patch 基本无法直接合入,需要在新版本上重新实现。我们首先整理了所有的历史 commit,筛选出那些必要的修改并且在新版上进行重新实现,目的是能覆盖已有的所有功能,确保新版本能支持现有的所有任务需求。

例如:

  • 新增或修改 Connectors 以支持公司内部需要,例如 DDMQ(滴滴开源消息队列产品),权限认证功能等。
  • 新增 Formats 实现,例如 binlog,内部日志采集格式的解析等。
  • 增加 ADD JAR 语法,可以在 SQL 任务中引用外部依赖,比如 UDF JAR,自定义 Source/Sink。
  • 增加 SET 语法,可以在 SQL 中设置 TableConfig,指导执行计划的生成

2. StreamSQL 语法兼容

社区在 1.4 版本时,FlinkSQL还处于比较初始的阶段,也没有原生的 DDL 语法支持,我们使用 Antlr 实现了一套自定义的 DDL 语法。但是在 Flink1.10 版本上,社区已经提供了原生的 DDL 支持,而且与我们内部的语法差别较大。现在摆在我们面前有几条路可以选择:

  • 放弃内部语法的支持,修改全部任务至新语法。(违背了平滑迁移的初衷,而且对已有用户学习成本高)
  • 修改 Flink 内语法解析的模块(sql-parser),支持对内部语法的解析。(实现较为复杂,且不利于后续的版本升级)
  • 在 sql-parser 之上封装一层语法转换层,将原本的 SQL 解析提取有效信息后,通过字符串拼接的方式组织成社区语法再运行。

最终我们选用了第三种方案,这样可以最大限度的减少和引擎的耦合,作为插件运行,未来再有引擎升级完全可以复用现有的逻辑,能够降低很多的开发成本。

例如:我们在旧版本上使用 "json-path" 的库实现了 json 解析,通过在建表语句里定义类似 $.status 的表达式表示如何提取此字段。

新版本上原生的 json 类型解析可以使用 ROW 类型来表示嵌套结构,在转换为新语法的过程中,将原本的表达是解析为树并构建出新的字段类型,再使用计算列的方式提取出原始表中的字段,确保表结构与之前一致。类型名称、配置属性也通过映射转换为社区语法。

3. 兼容性测试

最后是测试阶段,需要进行完善的测试确保所有任务都能做到平滑升级。我们原本的计划是准备进行回归测试,对已有的所有任务替换配置后进行回放,但是在实际操作中有很多问题:

  • 测试流程过长,一次运行可能需要数个小时。
  • 出现问题时不好定位,可能发生在任务的整个生命周期的任何阶段。
  • 无法验证计算结果,即新旧版本语义是否一致

所以我们按任务的提交流程分成多个阶段进行测试,只有在当前阶段能够全部测试通过后后进入下一个阶段测试,提前发现问题,将问题定位范围缩小到当前阶段,提高测试效率。

  • 转换测试:对所有任务进行转换,测试结果符合预期,抽象典型场景为单元测试。
  • 编译测试:确保所有任务可以通过 TablePlanner 生成执行计划,在编译成 JobGraph,真正提交运行前结束。
  • 回归测试:在测试环境对任务替换配置后进行回放,确认任务可以提交运行
  • 对照测试:对采样数据以文件的形式提交至新旧两个版本中运行,对比结果是否完全一致(因为部分任务结果不具有确定性,所以使用旧版本连续运行 2 次,筛选出确定性任务,作为测试用例)

四、引擎增强

除了对旧版本的兼容,我们也结合了新版本的特性,对引擎进行了增强。

1. Task-Load 指标

我们一直希望能精确衡量任务的负载状况,使用反压指标指标只能粗略的判断任务的资源够或者不够。

结合新版的 Mailbox 线程模型,所有互斥操作全部运行在 TaskThread 中,只需统计出线程的占用时间,就可以精确计算任务负载的百分比。

未来可以使用指标进行任务的资源推荐,让任务负载维持在一个比较健康的水平。

2. SubTask 均衡调度

在 FLIP-6 后,Flink 修改了资源调度模型,移除了--container 参数,slot 按需申请确保不会有闲置资源。但是这也导致了一个问题,Source 的并发数常常是小于最大并发数的,而 SubTask 调度是按 DAG 的拓扑顺序调度,这样 SourceTask 就会集中在某些 TaskManager 中导致热点。

我们加入了"最小 slot 数"的配置,保证在 Flink session 启动后立即申请相应数量的 slot,且闲置时也不主动退出,搭配 cluster.evenly-spread-out-slots 参数可以保证在 slot 数充足的情况下,SubTask 会均匀分布在所有的 TaskManager 上。

3. 窗口函数增强

以滚动窗口为例 TUMBLE(time_attr, INTERVAL '1' DAY),窗口为一天时开始和结束时间固定为每天 0 点 -24 点,无法做到生产每天 12 点-次日 12 点的窗口。

对于代码可以通过指定偏移量实现,但是 SQL 目前还未实现,通过增加参数 TUMBLE(time_attr, INTERVAL '1' DAY, TIME '12:00:00') 表示偏移时间为 12 小时。

还有另外一种场景,比如统计一天的 UV,同时希望展示当前时刻的计算结果,例如每分钟触发窗口计算。对于代码开发的方式可以通过自定义 Trigger 的方式决定窗口的触发逻辑,而且 Flink 也内置了一些 Tigger 实现,比如 ContinuousTimeTrigger 就很适合这种场景。所以我们又在窗口函数里增加了一种可选参数,代表窗口的触发周期,TUMBLE(time_attr, INTERVAL '1' DAY, INTERVAL '1' MINUTES) 。

通过增加 offset 和 tiggger 周期参数(TUMBLE(time_attr, size[,offset_time][,trigger_interval])),拓展了 SQL 中窗口的使用场景,类似上面的场景可以直接使用 SQL 开发而不需要使用代码的方式。

4. RexCall 结果复用

在很多 SQL 的使用场景里,会多次使用上一个计算结果,比如将 JSON 解析成 Map 并提取多个字段 。

虽然通过子查询,看起来 json 解析只调用一次,但是经过引擎的优化后,通过结果表的投影 (Projection) 生成函数调用链 (RexCall),结果类似:

这样会导致 json 解析的计算重复运行了3次,即使使用视图分割成两步操作,经过 Planner 的优化一样会变成上边的样子。

对于确定性 (isDeterministic=true) 的函数来说,相同的输入一定代表相同的结果,重复执行 3 次 json 解析其实是没有意义的,如何优化才能实现对函数结果的复用呢?

在代码生成时,将 RexCall 生成的唯一标识(Digest)和变量符号的映射保存在 CodeGenContext 中,如果遇到 Digest 相同的函数调用,则可以复用已经存在的结果变量,这样解析 JSON 只需要执行第一次,之后就可以复用第一次的结果。

五、总结

通过几个月的努力,新版本已经上线运行,并且作为 StreamSQL 的默认引擎,任务重启后直接使用新版本运行。兼容性测试的通过率达到 99.9%,可以基本做到对用户的透明升级。对于新接触 StreamSQL 用户可以使用社区 SQL 语法进行开发,已有任务也可以修改 DML 部分语句来使用新特性。现在新版本已经支持了公司内许多业务场景,例如公司实时数据仓库团队依托于新版本更强的表达能力和性能,承接了多种多样的数据需求做到稳定运行且与离线口径保持一致。

版本升级不是我们的终点,随着实时计算的发展,公司内也有越来越多团队需要使用 Flink 引擎, 也向我们提出了更多的挑战,例如与 Hive 的整合做到将结果直接写入 Hive 或直接使用 Flink 作为批处理引擎,这些也是我们探索和发展的方向,通过不断的迭代向用户提供更加简单好用的流计算服务。

五、总结

通过几个月的努力,新版本已经上线运行,并且作为 StreamSQL 的默认引擎,任务重启后直接使用新版本运行。兼容性测试的通过率达到 99.9%,可以基本做到对用户的透明升级。对于新接触 StreamSQL 用户可以使用社区 SQL 语法进行开发,已有任务也可以修改 DML 部分语句来使用新特性。现在新版本已经支持了公司内许多业务场景,例如公司实时数据仓库团队依托于新版本更强的表达能力和性能,承接了多种多样的数据需求做到稳定运行且与离线口径保持一致。

版本升级不是我们的终点,随着实时计算的发展,公司内也有越来越多团队需要使用 Flink 引擎, 也向我们提出了更多的挑战,例如与 Hive 的整合做到将结果直接写入 Hive 或直接使用 Flink 作为批处理引擎,这些也是我们探索和发展的方向,通过不断的迭代向用户提供更加简单好用的流计算服务。

作者:Alan

原文链接

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

 

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

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

相关文章

苹果新算法已混进 iOS 14.3!CSAM 检测技术再遭网友争议

整理 | 禾木木出品 | CSDN云计算(ID:CSDNcloud)苹果宣布即将推出 CSAM 检测系统时,遭到了 4000 多个组织及个人的公开反对,他们质疑苹果会破坏用户隐私和端到端加密机制。一位 Reddit 用户发现 CSAM 算法竟已被悄悄地隐…

数字化时代,阿里云云效如何构建下一代研发协作工具平台?

简介: 本次分享主要由四部分组成: 1、企业在成长过程中遇到的研发效能困境; 2、研发管理从信息化走向数字化的路径,以及背后的逻辑; 3、云原生和 AI 两项新技术在研发平台上的落地; 4、结合阿里巴巴自身案例…

珠海小学计算机比赛,欢聚一堂 共叙佳话 —— 参加珠海市中小学信息技术工作年会纪要...

欢聚一堂 共叙佳话——参加珠海市中小学信息技术工作年会纪要2012年12月22日,香洲区中小学信息技术工作室一行8人赴金湾一小,参加了珠海市教育学会中小学信息技术教学专业委员会组织的第三届年会,会议分为四项议程。一、近两年工作总结上午&a…

安谋科技发布新业务品牌“核芯动力”,先手布局智能计算产业

安谋科技(中国)有限公司(“安谋科技”)举行“创芯生,赋未来” 新业务品牌战略发布会,重磅发布“双轮驱动”战略以及新业务品牌“核芯动力”。新业务品牌的发布代表安谋科技引领智能计算产业发展趋势、推动计…

技术方案设计的方法论及案例分享

简介: 怎么去体现技术方案设计的深度是大家普遍关心的一个问题,这个问题不是个例问题,因此本文主要分享下作者个人的一些观点和看法。 怎么去体现技术方案设计的深度是大家普遍关心的一个问题,这个问题不是个例问题,因…

第四范式:现代存储架构下的系统优化实践

8月21日,白玉兰开源联合示说网主办的“开源大数据技术线上meetup”特邀约大数据领域的前沿技术专家,就大数据存储的关键技术、挑战和当前应用展开交流讨论,阵容强大、内容全面。第四范式体系架构科学家,高性能计算Team leader卢冕…

穿越疫情,阿里云3000万补贴助力中小企业寒冬突围

简介: 2021年,活下去,是所有中小企业的一致心愿。冬将尽,春将来。我们也都在迫切等待着百花齐放的春天到来,阿里云愿和广大中小企业一起守望相助,共待山河无恙,春暖花开! 简介&#…

KubeVela:标准化的云原生平台构建引擎

简介: 本文由“GO 开源说”第三期 KubeVela 直播内容修改整理而成,视频内容较长,本文内容有所删减和重构。 KubeVela 的背景 KubeVela 是一个基于 Go 语言开发的云原生平台级开源项目,这个项目是去年 11 月中旬正式发布的。虽然发…

漫画:什么是自动驾驶?

作者:小灰来源:程序员小灰什么是自动驾驶自动驾驶,也被称为无人驾驶,顾名思义,是指交通工具在没有人类操作的情况下,也能够完成环境的感知与导航,顺利到达目的地。从传统的手动驾驶到智能的自动…

一场关于动态化开发实践的技术探讨

简介: 开发团队在面临业务高并发需求时,如何对技术模型进行迭代升级? 在过去的一年中,经过跟支付宝移动端团队和广大开发者的交流和沟通,我们了解到大家在涉及到关于移动应用跨端开发的过程中遇到的一些问题&#xff0…

云效故障定位研究论文被ICSE 2021 SEIP track收录

近期,由阿里云云效团队联合复旦大学CodeWisdom研究团队、阿里技术风险部安全生产团队,合作完成的论文《MicroHECL: High-Efficient Root Cause Localization in Large-Scale Microservice Systems》被ICSE 2021 SEIP track录用。本文针对大规模微服务系统…

CSDN 开学见面礼!3 周带你 Get 大厂工程师基础能力

暑假即将结束,金秋开学季来袭。别让年轻的自己虚度光阴,现在加入C友会,大厂CTO级别导师陪你加buff!10+场考前辅导,50个任务文档,600+分钟大咖讲解与答疑,3周带你掌握大厂…

迷雾世界无限号服务器,迷雾世界部分服务器互通公告_迷雾世界部分服务器3月31日数据互通详情分析_手心游戏...

迷雾世界部分服务器3月31日数据互通公告!迷雾世界亲爱的玩家:为了优化游戏体验,更好地提升组队、交互的互动体验,开发组在3.27 -3.30对所有玩家进行了关于数据互通的调查投票。结果显示,78%的玩家投票同意。因此&#…

一文读懂云上DevOps能力体系

简介: 阿里云ECS自动化运维套件架构师,深度拆解云上运维能力体系建设:自动化运维等级金字塔、自动化运维的进阶模式、DevOps的基础核心、云上标准化部署三大能力…… 序言 云计算行业已经有十多年的发展了,话题早已从“要不要上云…

mcem r语言代码_R语言阈值自回归模型(TAR)代码示例

原文链接:R语言时间序列TAR阈值模型分析​tecdat.cn阈值模型用于统计的几个不同区域,而不仅仅是时间序列。一般的想法是,当变量的值超过某个阈值时,过程可能表现不同。也就是说,当值大于阈值时,可以应用不同…

【洛谷算法题】P4414-[COCI2006-2007#2] ABC【入门2分支结构】Java题解

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P4414-[COCI2006-2007#2] ABC【入门2分支结构】Java题解🌏题目描述&a…

EDAS微服务应用同城容灾最佳实践

简介: 大多数业务应用只要做到同城双活,就可以避免掉大多数数据中心不可用故障。本实践就是帮助大家高效、低成本地实现自己的业务应用具备同城双活容灾能力。 前言 上云目前已经是绝大数企业首选的IT基础设施建设方案,但是云上仍然存在一些…

脸书推出VR视频会议应用程序 正式跨出元宇宙第一步;三家公司新入选福布斯2021云计算百强榜;微软挖来亚马逊云业务顶级高管贝尔...

NEWS本周新闻回顾微软挖来亚马逊云业务顶级高管贝尔微软公司已经聘请亚马逊云业务高管查理贝尔担任其企业副总裁。鉴于微软的Azure 云业务正试图从亚马逊 AWS 手中争夺份额,这一挖角行动可以说是微软的一次胜利。在亚马逊前 AWS 主管安迪贾西被任命为亚马逊 CEO 后&…

三字经带拼音a4打印版_人教版八年级下册英语6单元重点单词带音标打印版

UNIT 6shoot [ʃu:t] v. 投篮,射击,发射stone [stəʊn] n. 石头weak [wi:k] adj. 虚弱的,柔弱的god [ɡɒd] n. 上帝,神remind [rɪmaɪnd] v. 提醒,使想起bit [bɪt] n. 一点,小块a little bit 有点儿&am…

拥抱云原生,Fluid结合JindoFS :阿里云OSS加速利器

简介: Fluid 是一个开源的 Kubernetes 原生的分布式数据集编排和加速引擎,主要服务于云原生场景下的数据密集型应用。在 Fluid 上使用和部署 JindoRuntime 实现数据集的可见性、弹性伸缩、数据迁移、计算加速等,并流程简单、兼容原生 k8s 环境…