一、前言
随着大数据技术的飞速发展,实时处理能力变得越来越重要。在众多实时处理框架中,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 自适应调度器)
下面主要从上述的这四个特性上来重点讲解我们的成果。
简化资源调度
背景:常规通过配置任务的高级参数进行提交任务,不利于资源的拓展,以及用户想设置多个SlotSharingGroup也无法通用地实现。
SQL/DataStream任务都可通过我们的Flink编译器Generator编译完成后生成一个流图资源信息JSON。
![01.jpg]()
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缺乏这部分的热迁移能力。
![04.jpg]()
从投入生产迁移Tm资源的断流耗时情况来看,几乎能做到断流1~5s内的快速迁移:
![05.jpg]()
TmRestart重启策略
背景:Flink社区只提供了FullRestart、RegionRestart,往往在生产环境中我们经常会遇到各种不可抗力Cancel用户的代码会超时或堆外有泄漏的情况。
![06.jpg]()
TmRestart重启,可根据任务异常情况、作业配置等按需重启Tm进程,支持修改JVM的参数。
四、总结
本文主要介绍了以下内容:
*文 / 天然卷
本文属得物技术原创,更多精彩文章请看:得物技术
未经得物技术许可严禁转载,否则依法追究法律责任!