Flink on K8s 在京东的持续优化实践
摘要:本文整理自京东资深技术专家付海涛在 Flink Forward Asia 2021 平台建设专场的演讲。主要内容包括:
-
基本介绍 -
生产实践 -
优化改进 -
未来规划
一、基本介绍
-
2018 年初,实时计算平台开始全面容器化改造;
-
到 2018 年 6 月,已经有 20% 的任务运行在 K8s 上,从运行结果看,无论是资源的共享能力、还是业务处理能力,以及敏捷性和效率方面都获得了较大提升,初步达到了预期的效果;
-
到 2019 年 2 月实现了实时计算全部容器化;
-
之后直到现在,我们在 K8s 的环境也一直在进行优化和实践,比如进行弹性伸缩、服务混部、任务快速恢复能力建设等方面的实践。
-
首先混合部署服务和资源共享能力获得了提升,节省机器资源 30%;
-
其次,具有更好的资源隔离和弹性自愈能力,比较容易实现根据业务的负载进行资源的弹性伸缩,保证了业务的稳定性;
-
最后开发、测试、生产一致性的环境,避免环境给整个开发过程带来问题,同时极大提升了部署和运营自动化的能力,降低了管理运维的成本。
二、生产实践
-
一是可以根据机房环境选择合适的网络模式:比如对于我们一些旧的机房,容器网络性能下降特别明显,而且网络的架构也不能升级,采用了主机网络 (如上图所示,在 pod yaml 文件中配置 hostNetwork=true) 来避免损耗的问题,虽说这不太符合 K8s 的风格,但需要根据条件做个权衡;而对于新的机房,由于基础网络的性能提升以及采用了新的高性能网络插件,性能损耗相比主机网非常小,就采用了容器网;
-
二是尽量不要使用异构网络环境,避免 K8s 跨机房,同时适当调整集群网络的相关参数,增加网络的容错能力。比如可以适当调大 akka.ask.timeout
和taskmanager.network.request-backoff.max
两个参数。
-
一是可以考虑使用外挂的 Volume,使用本地存储卷,直接写数据到 host fileSystem 来提升性能;
-
此外也可以调优磁盘 IO 相关参数,比如调优 RocksDB 参数,提升磁盘的访问性能;
-
最后也可以考虑采用一些存储计算分离的方案,比如使用 remote shuffle,提升本地 shuffle 的性能和稳定性。
三、优化改进
-
一是故障恢复前,故障 Task 的上游对于待发送数据和下游对于接收的残留数据如何进行处理?这里我们会将上游输出到故障Task数据直接丢弃掉,下游如果收集到不完整的数据也会丢弃掉;
-
二是上下游无法感知到对方异常时,再恢复的时候如何进行处理?这里可能需要一个强制的更新处理;
-
三是一个 pod 上分布了多个 Task 的情况,如果该 pod 异常,存在多个故障 Task,这些故障 Task 之间如果存在依赖关系,如何正确地进行处理?这里需要按照依赖关系进行顺序的部署。
四、未来规划
-
首先是调度优化:
-
一个是 K8s 层面资源调度优化,更高效地管理大数据的在线服务和离线作业,提升 K8s 集群的利用率和运行效率; -
一个是 Flink 作业调度优化,支持更丰富、更细粒度的调度策略,提升 Flink 作业资源的利用率和稳定性,满足不同的业务场景需要。
-
其次是服务混部:将不同负载的服务混部在一起,在保证服务稳定的前提下尽量提升资源利用率,使服务器的价值最大化;
-
然后是智能运维:支持对任务进行智能诊断,并自适应调整运行参数,实现作业的资质,降低用户调优和平台运维的成本;
-
最后是 Flink AI 的支持:人工智能应用场景中,Flink 在包括特征工程、在线学习、资源预测等方面都有一些独特的优势,后续我们也将在这些场景从平台层面进行探索和实践。
关注小晨说数据,获取更多大厂技术干货分享,目前已经有40000+粉丝关注了。
回复“spark”,“flink”,“中台”,“机器学习”,“用户画像”获取海量学习资料~~~