得物Flink内核探索实践

news2025/1/3 6:10:13

一、前言

随着大数据技术的飞速发展,实时处理能力变得越来越重要。在众多实时处理框架中,Apache Flink以其强大的流处理能力和丰富的功能集,受到了广泛关注和应用。在实时业务日益增长的趋势下,这促使我们深入探索Flink的内核,以更好地保障Flink任务的维护。本次分享将重点介绍得物在Flink内核方面的探索与实践,探讨如何通过深度优化和定制,实现更加高效和稳定的数据处理能力。

二、读者收益

通过阅读本次分享,读者将获得以下收益:

  • 深入理解Flink内核:了解Flink的核心架构和关键组件,掌握Flink内核的运行机制。

  • 优化实践:学习得物在Flink优化方面的实战经验,包括如何通过参数调优和内核定制,提升系统性能。

  • 问题解决方案:掌握处理Flink常见问题的方法和技巧,提高在实际项目中应对复杂场景的能力。

  • 实时处理案例:通过实际案例,了解如何在复杂业务场景中应用Flink,实现高效的实时数据处理。

  • 最佳实践:获得得物在Flink应用中的最佳实践建议,帮助在实际项目中少走弯路,提高开发效率。

无论你是刚接触Flink的初学者,还是有一定经验的开发者,相信通过本次分享,都能有所收获,进一步提升在实时数据处理方面的能力。

三、自研特性

自研调度器

Apache Flink是一个开源的流处理框架,调度器是其重要的一部分。

在调度器上,我们新增了一款集合社区各款调度器优点的DwScheduler。

SchedulerNG (interface)
   |
   +-- SchedulerBase (implements SchedulerNG)
         |
         +-- DefaultScheduler (extends SchedulerBase 默认资源调度器)
               |
               +-- AdaptiveBatchScheduler (extends DefaultScheduler 自适应批调度器)
                     |
                     +-- SpeculativeScheduler (extends AdaptiveBatchScheduler 预测执行调度器)
               |
               |
               +-- DwScheduler (extends DefaultScheduler 自研调度器)
   |
   +-- AdaptiveScheduler (implements SchedulerNG 自适应调度器)
  • 在流任务生产环境中目前现有的调度并不很理想,在生产中我们常常遇到一些问题,例如

    • 任务JobGraph与资源调度没有直接的联系,难于变化和修改;

    • 不能以TaskManager维度均衡分配所有task到所有slot上;

    • 1.18以前没有直接动态扩缩容的接口、1.18以后也没有整体算子同时扩缩容的能力;

    • 流任务调度器没有可以迁移task/Tm的迁移计算节点的能力。

  • DwScheduler整合了社区调度器的各项优点,并提供了很多适应我们生产情况的特性

    • 建立了JobGraph与资源之间的直接联系,用JSON可修改和表示流图信息和资源并进行调度;

    • 能够均衡调度所有task到所有TaskManager上;

    • 支持动态扩缩容各个算子,并且热更新资源规格的能力;

    • 支持热迁移task/Tm的能力。

下面主要从上述的这四个特性上来重点讲解我们的成果。

简化资源调度

背景:常规通过配置任务的高级参数进行提交任务,不利于资源的拓展,以及用户想设置多个SlotSharingGroup也无法通用地实现。

SQL/DataStream任务都可通过我们的Flink编译器Generator编译完成后生成一个流图资源信息JSON。

01.jpg

  • 调度器支持通过JobResourceProfile JSON信息来进行资源申请。

    • JobResourceProfile的信息用户可自由编辑,同样我们也提供了便捷的UI给用户操作算子和流图的以及资源的配置。

    • 我们支持配置算子的并行度、最大并行度、SlotSharingGroup,以及资源的CPU、MEM、堆外内存部分我们也做了合理的管理让用户只需要配置一个比例,自动化设置资源的堆外各项参数降低OOM的风险,简化了用户对资源配置的操作难度

  • 支持接收新的资源资源JobResourceProfile JSON重新调度任务,支持同时扩缩容多个Operator算子的并行度

    • 在JobManager里我们提供了接收资源变更的Handler;

    • DwScheduler可以接收多元化的Service发起过来的资源变更请求;

    • 并且它提供了六个回调接口,不同的Service可以通过实现它来执行不同的逻辑。

default void preRequestResource() {}

default void postRequestResource(Throwable throwable) {}

default void preRestart() {}

default void postRestart() {}

default void preDeploy() {}

default void postDeploy(Throwable throwable) {}

Flink支持通过资源JobResourceProfile+JobGraph流图提交任务,JM支持动态接收新的JobResourceProfile更新任务资源,可以按标签申请不同的资源机型。

均衡调度Task

背景:Flink的task分配是基于slot维度进行全局调度的,即使配置了cluster.evenly-spread-out-slots 也同样会有在Tm维度上的task分配不均衡的问题。

使用自研调度器的情况下,能够使用JobResourceProfile提前计算出每个TaskManager应该分配多少task,在此基础上我们实现了自己的DwSlotSharingStrategy,可以有效的按TaskManager来分配task个数,而不仅仅是在slot层面做到资源的均衡。

02.jpg

在同一个任务使用原生社区调度器和使用我们自研调度器,我们得出了一些数据效果,从Tm维度来看CPU使用均衡了许多。

从CPU使用率上来看,明显均衡了很多,减少了不均衡分配带来的性能瓶颈问题。

03.jpg

TaskManager热迁移

背景:在日常生产运维中,经常有需要迁移热点机器或故障机器的底层场景,Flink缺乏这部分的热迁移能力。

  • 自研Scheduler为我们解决了这一问题,我们支持了热迁移TaskManager

    • 同样使用DwScheduler提供的六个回调接口以及触发资源变更的请求来完成Tm的热迁移

    • 热迁移的Service只需要对应地实现下它的功能,不必关心调度的流程

04.jpg

从投入生产迁移Tm资源的断流耗时情况来看,几乎能做到断流1~5s内的快速迁移:

05.jpg

TmRestart重启策略

背景:Flink社区只提供了FullRestart、RegionRestart,往往在生产环境中我们经常会遇到各种不可抗力Cancel用户的代码会超时或堆外有泄漏的情况。

  • 为解决这一问题,我们在Restart层面增加了一种TmRestart策略:

    • 我们将Tm Pod的主进程修改为常驻Shell,可以在Cancel超过一定时间能快速退出进程进行重启,也可以根据JM请求的重启参数直接触发TmRestart;

    • 修改Pod的主进程我们需要解决一些问题如:信号量传递给子进程、进程返回码的协调与重新拉起;

    • 另外我们也通过Shell主进程对Tm进程的IO探活、Process D监控等等;

    • 在重启过程中会对zk有一定的重连,我们改造了这部分代码,尝试无法链接上一次的JM地址失败后才会去访问zk获取最新的leader地址。

  • 同时我们也可以调整重新拉起的Tm进程的JVM参数

    • 在特殊场景通过对Tm退出的异常原因进行分析,列如k8s判定是OOM或是容器等待内存回收的延时分布次数过高,判断重新拉起的Tm是否应该进行JVM参数适当调整。

06.jpg

TmRestart重启,可根据任务异常情况、作业配置等按需重启Tm进程,支持修改JVM的参数。

四、总结

本文主要介绍了以下内容:

  • Flink调度器的基本生产优化和改造。

  • 重建Flink资源模型和支持热迁移等功能的特性介绍。

  • Flink的Task分配策略优化和重启逻辑新特性TmRestart。

*文 / 天然卷

本文属得物技术原创,更多精彩文章请看:得物技术

未经得物技术许可严禁转载,否则依法追究法律责任!

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

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

相关文章

程序员的第一法则:DRY —— 永远不要重复自己

1. 前言 在编程的世界里,有一条被广泛接受且极其重要的法则,它简明扼要,却道出了高效编程的核心:DRY,即 Don’t Repeat Yourself(不要重复自己)。这不仅仅是一句口号,而是每个程序员…

解锁微信公众号超强功能,让你的品牌火遍朋友圈!

微信公众号是微信官方提供的一种自媒体平台,允许个人和企业在微信上创建自己的公众号,并通过公众号发布文章、图片、视频等多种形式的内容。 微信公众号主要分为订阅号、服务号等类型。企业和个人可以使用公众号吸引关注者,与关注者进行互动…

计算机网络 DNS HTTP HTTPS,缓存

文章目录 输入URL之后的全过程URL URI DNS (Domain Name System)为什么分布式域名的层级关系解析过程递归查询和迭代查询 HTTP特性版本演变0.91.01.1问题优化 2兼容改变推送实现与HTTP1对比并发实现缺陷 3特点QUIC协议 缓存强制缓存协商缓存基于Last-Modified和If-Modified-Sin…

海外问卷调查的目的与动态IP的需求

海外问卷调查是一种重要的市场调研方式,被广泛应用于企业和组织对特定市场、产品或服务的深入了解。这种调研方法通过向目标市场的消费者发放问卷,收集他们对某一产品、服务或市场的看法和意见,从而帮助企业或组织更好地把握市场需求&#xf…

Stable Diffusion 必学技能——从零开始训练专属 Lora 模型!

接触AI绘画的小伙伴,一定听过Lora。 Lora模型全称是:Low-Rank Adaptation of Large Language Models,可以理解为Stable-Diffusion中的一个插件,在生成图片时,Lora模型会与大模型结合使用,从而实现对输出图…

AVAX雪崩协议/网络 详解及价格预测

AVAX是否能继续增长,关键看它能否在与以太坊等其他区块链的竞争中占据更大的份额。 以下内容涉及技术原理,经济模型及锁仓价值,与其他公链的对比。 来整体多维度的分析雪崩网络AVAX的未来及价格预测。 核心团队 Avalanche 的创建团队是 Ava …

【图形学】TA之路-矩阵

在 Unity 中,矩阵广泛用于处理各种图形变换,例如平移、旋转、缩放等。矩阵的使用不仅限于三维空间,还可以应用于二维空间的操作。了解矩阵及其运算对于游戏开发和计算机图形学非常重要。Unity 中使用的是行向量不是列向量,这个要注…

中职物联网实训室

一、中职物联网实训室建设背景 在当今科技日新月异的浪潮中,物联网技术以其迅猛的发展势头,成为了撬动数字化转型的关键杠杆,深刻地重塑着经济社会的面貌。面对这一变革,社会对精通物联网技术的应用型人才需求激增。鉴于此&#x…

高等数学:每日一题1/判断极值点和驻点数目

函数 ( ) A. 1个驻点,1一个极值点 B. 1个驻点,2一个极值点 C. 2个驻点,1一个极值点 D. 2个驻点,2一个极值点 知识点: 1.驻点与极值点的定义 2.极值点的充分条件与必要条件 本题的解题思路是对上述函数进行分段&#…

公网kafka消费者账号密码spring项目对接

公网kafka消费者带有账号密码方式的spring项目对接 最近接到一个对接的活,对方公司给出的是公网kafka模式,就是不断给你配置的消费者推送消息,并且是带有指定的账号密码方式。下面就给大家具体说一说我是怎么配置的和我配置过程中遇到的问题。…

【git】将本地文件上传到github

安装git 选择一个文件夹作为git仓库,cd到文件夹输入 git init文件夹出现.git文件夹,该文件夹默认为隐藏文件夹,设置为不隐藏 在cmd中输入 ssh-keygen -t rsa -C "xxxxxx.com"该邮箱为github邮箱,然后一路enter出现以…

并查集-应用方向以及衍生汇总+代码实现(c++)-学习一个数据结构就会做三类大题!

并查集的核心功能,合并集合,查找元素,这两个最基本的功能相关题目本文不列举了,主要是一些和图相关的: 并查集的核心母题 一、连通性检测: 问题:判断在一个图中,任意两点是否连通。…

《Python爬虫逆向实战》绕过debugger的方法汇总

禁用断点 打开控制台,点击右边的禁用断点按钮。 点击之后再刷新下,就会发现debugger失效了。 注:这种方法有个 弊端,就是我们在代码中下的断点也都将失效。 Add script to ignore list 在代码文件中任意位置右键,然…

SpringBoot读取resources下文件,不区分window和Linux系统

起因 每次发布读取项目下的文件总是要区分系统环境,烦人。 解决 log.info("读取excel开始");//获取文件路径ClassLoader classLoader getClass().getClassLoader();//获取文件流InputStream stream classLoader.getResourceAsStream("1.xlsx&qu…

PHP西陆多城市多门店多端健身系统小程序源码

🏋️‍♀️全国畅练无阻!探索“多城市多门店多端健身系统”的无限可能🏃‍♂️ 🌍 开篇:跨越地域的健身自由 你是否曾因工作调动、旅行或是居住地变化而烦恼健身计划的中断?别担心,“多城市多…

数字化营销:以数据为笔,绘品牌与消费者的未来画卷

数据在数字化营销中的重要性简直超乎想象!它能让企业精准洞察消费者的需求。就像电商平台,根据咱们的浏览和购买记录,就能推荐个性化的商品,是不是感觉特贴心,购买意愿也瞬间提高了?而且数据还能帮企业优化…

大数据-84 Spark 集群 RDD创建 RDD-Transformation操作算子 详解

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

CSS 伪类和伪元素

也是选择器的一种,被称为伪类和伪元素。这一类选择器的数量众多,通常用于很明确的目的。 伪类 什么是伪类 伪类是选择器的一种,它用于选择处于特定状态的元素。 比如当它们是这一类型的第一个元素时(:first-child)&…

Sentinel入门与进阶:微服务流量控制的最佳实践 ( 六 )

8.Gateway 整合 Sentinel(熔断、限流) 8.1.引入依赖 在 Spring Cloud Alibaba 2.1.6之前的版本,引入的是 sentinel-spring-cloud-gateway-adapter 包,并且需要自己实现好多配置类,2.1.6 之后的版本内部已经帮我们实现…

php 在app中唤起微信app进行支付,并处理回调通知

<?phpnamespace app\api\controller;use think\facade\Db; use think\facade\Log;class Wxzf {