《Apache Flink 案例集(2022版)》——4.云原生——斗鱼-Apache Flink 在斗鱼的应用与实践(下)

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 《Apache Flink 案例集(2022版)》——4.云原生——斗鱼-Apache Flink 在斗鱼的应用与实践(下)

《Apache Flink 案例集(2022版)》——4.云原生——斗鱼-Apache Flink 在斗鱼的应用与实践(上) https://developer.aliyun.com/article/1228038



生产实践

搭建平台的过程中,斗鱼也遇到了不少的挑战。  


第一个挑战是 Flink on K8s 集群的部署资源问题。方案上斗鱼使用 Standalone Kubernetes 部署,实际是在 K8s 的集群中,创建了两个实例组。一个实例组用来运行 JM 进程,另一个实例组用来运行 TM 进程。两个实例组之间,通过设置 HA 的集群 id 相同来实现绑定。  


JobManager实例组运行多个Pod时,除其中一个作为Master节点外,其他的Pod都将以StandBy的身份运行;


TaskManager实例组运行多个Pod时,每一个Pod都将注册到JobManager上,作为一个作业执行器存在。


image.png

为了使资源充分隔离,依托于 K8s 的能力,生产部署时斗鱼采取一个作业创建一个 Flink 集群的方式。由于K8s创建一个Pod时,需要指定 CPU 和内存的设置,而 Flink 集群启动的时候需要在Flink配置文件指定JobManager和TaskManager的资源配置,因此在这个方案中遇到的挑战就是如何统一设置 K8s 实例资源与 Flink 集群资源。  


为了解决这个问题,斗鱼改造了 Flink 镜像启动脚本 entrypoint,在脚本中增加了两个操作:  


第一是拉取作业定义,以获取作业的运行配置;


第二是替换 flink-conf 文件 memory size 配置。


image.png


值得注意的是,在Flink社区最新的Native Kubenates方案中这个问题已经通过参数化配置解决了。


image.png


平台遇到的第二个挑战是如何去监控每个作业的运行状态。方案上,斗鱼将每个作业抽象成一条消息,存放在基于 ZK 开发的消息队列中。并且在消息队列虚化了 5 个状态,Accept、Running、Failed、Cancel 以及 Finish。  


每个状态都有一个独立的线程池去监控消费。比如 Running 状态,线程池从消息队列中获取一条作业消息,从中解析 Flink 集群信息,获取 FlinkUI 域名,通过 K8s 的 Nginx Ingress,使用域名去访问 Flink JM Pod,从而获取运行作业的状态。当获取作业状态还是 Running 时,将重入队到队尾,否则将移动到对应状态队列下。


image.png


平台遇到的第三个挑战是如何读取Hive表以及如何使用Hive UDF。斗鱼将一个 FlinkSQL 的提交拆分成三个部分:作业组装、上下文初始化和 SQL 执行。其中作业组装实现了两种方式:  


第一个是 SDK GET,通过 SDK 封装的方法,请求平台的服务层,去获取作业定义;


第二个是 FILE GET,直接读取当前机器,指定路径下的 SQL 文件,生成作业定义。第二个方式主要是方便本地不依赖平台服务,可快速调试引擎。


上下文初始化部分也分为两个过程:  


一个是调优参数的设置,类似常用HiveSQL的Set命令


另一个是 Catalog初始化,Flink集群与Hive的集成就是在这个环节实现的  


以Hive为例,在Catalog注入之前,平台元数据管理模块有一个Catalog初始化的过程,预先将 Catalog 的创建语句存储起来。当一个Flink作业提交时,选择需要注入的Catalog,创建Catalog并注册到Flink的上下文中,从而实现Catalog的元素注入。


image.png


随着任务的增加,对于新手来说,在平台上开发 Flink 作业,从 SQL 编写到上线,往往需要改写数十个版本。缺少快速试错的能力是平台面临的第四个挑战,因此斗鱼设计开发了实时监控、实时调试功能。  


在架构方面,斗鱼引入了 Flink Gateway Server 对 Flink 集群接口二次分装。包含语法校验、SQL 提交、SQL 状态检查、SQL 停止、SQL mock 等功能。将 Flink 集群和网关服务的日志统一收集。通过预启动 Flink 集群,缩短作业启动时间,达到快速调试的能力。  


实时调试主要分为四个步骤,即 SQL 解析、规则校验、执行计划,和物理执行。SQL mock 就是改写了原有的 SQL 解析过程。根据 SQL 解析后得到 Node 数,分析 SQL 的血缘关系,去判断 Source 来源表和 Sink 目的表。动态的将 Source 表改写为 dataGen 的数据源,和 Sink 表改写成 console 的数据源。动态修改 Source 和 Sink 表的配置实现数据源mock的好处是线上开发 SQL 可直接用于调试,不需要修改,并且也不用担心会产生脏数据,可快速验证 SQL 逻辑是否符合预期。


image.png


平台面临的最后一个挑战是Flink作业的监控告警。斗鱼使用自定义Metrics Reporter,将监控指标上报到Kafka集群,继而使用Flink任务去消费Kafka里的Metrics信息,完成如聚合、补充链路维度等操作,处理后的数据再推送到 Push Gateway,写入Prometheus中。最后监控大盘基于Grafana绘制。斗鱼的监控大盘分为资源监控,稳定性监控,Kafka 监控和 CPU 内存监控。



未来规划

Flink 让实时计算更加简单,斗鱼在搭建实时计算平台过程中也并非一帆风顺。对于实时计算平台未来的发展,斗鱼有三个展望: 、


第一个是 Flink 的动态扩缩容,实现平台自动化调整 Flink 作业资源,解决业务数据突增引起的问题;


第二个是简化实时数仓开发模型,降低实时数仓开发门槛,在企业内将实时数仓真正大规模推广使用; 最后一个是完善实时数据质量监控体系,实现实时数据质量可验证与可追溯。

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
3天前
|
Kubernetes 负载均衡 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第27天】Kubernetes(简称K8s)是云原生应用的核心容器编排平台,提供自动化、扩展和管理容器化应用的能力。本文介绍Kubernetes的基本概念、安装配置、核心组件(如Pod和Deployment)、服务发现与负载均衡、网络配置及安全性挑战,帮助读者理解和实践Kubernetes在容器编排中的应用。
17 4
|
7天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
2天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
3天前
|
Kubernetes Cloud Native API
云原生架构下微服务治理的深度探索与实践####
本文旨在深入剖析云原生环境下微服务治理的核心要素与最佳实践,通过实际案例分析,揭示高效、稳定的微服务架构设计原则及实施策略。在快速迭代的云计算领域,微服务架构以其高度解耦、灵活扩展的特性成为众多企业的首选。然而,伴随而来的服务间通信、故障隔离、配置管理等挑战亦不容忽视。本研究聚焦于云原生技术栈如何赋能微服务治理,涵盖容器编排(如Kubernetes)、服务网格(如Istio/Envoy)、API网关、分布式追踪系统等关键技术组件的应用与优化,为读者提供一套系统性的解决方案框架,助力企业在云端构建更加健壮、可维护的服务生态。 ####
|
4天前
|
Kubernetes 监控 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第26天】随着云计算技术的发展,容器化成为现代应用部署的核心趋势。Kubernetes(K8s)作为容器编排领域的佼佼者,以其强大的可扩展性和自动化能力,为开发者提供了高效管理和部署容器化应用的平台。本文将详细介绍Kubernetes的基本概念、核心组件、实践过程及面临的挑战,帮助读者更好地理解和应用这一技术。
21 3
|
4天前
|
监控 安全 Cloud Native
云原生安全:Istio在微服务架构中的安全策略与实践
【10月更文挑战第26天】随着云计算的发展,云原生架构成为企业数字化转型的关键。微服务作为其核心组件,虽具备灵活性和可扩展性,但也带来安全挑战。Istio作为开源服务网格,通过双向TLS加密、细粒度访问控制和强大的审计监控功能,有效保障微服务间的通信安全,成为云原生安全的重要工具。
13 2
|
4天前
|
弹性计算 监控 Cloud Native
云原生架构下的性能优化实践与策略####
在数字化转型加速的今天,云原生技术以其弹性、敏捷和高效的特点成为企业IT架构转型的首选。本文深入探讨了云原生架构的核心理念,通过具体案例分析,揭示了性能优化的关键路径与策略,为开发者和企业提供了可操作的实践指南。 ####
|
6天前
|
敏捷开发 Cloud Native 持续交付
云原生技术在现代企业中的应用与实践
【10月更文挑战第23天】本文将深入探讨云原生技术在现代企业中的广泛应用,并结合具体案例分析其对企业数字化转型的推动作用。我们将从云原生技术的基本原理出发,逐步揭示其在提高业务敏捷性、降低成本和增强系统可靠性方面的优势。同时,文章还将分享一系列成功实施云原生技术的企业案例,为读者提供实践中的参考和启示。最后,我们将讨论云原生技术面临的挑战及未来的发展趋势,为企业在这一领域的进一步探索提供指导。
|
7天前
|
监控 Cloud Native 测试技术
云原生架构下的性能优化与实践####
【10月更文挑战第21天】 本文深入探讨了在云原生环境下,如何通过一系列技术手段和最佳实践来提升应用性能。文章首先概述了云原生架构的基本原则与优势,随后详细分析了影响性能的关键因素,包括容器编排、微服务设计、持续集成/持续部署(CI/CD)流程以及监控与日志管理。针对这些因素,文中不仅介绍了具体的优化策略,如资源请求与限制的合理配置、服务间通信的高效实现、自动化测试与部署的优化,还结合案例分析,展示了如何在实际项目中有效实施这些策略以显著提升系统响应速度和处理能力。此外,文章还强调了性能测试的重要性,并提供了几种常用的性能测试工具和方法。最后,总结了云原生性能优化的未来趋势,为开发者和架构师
11 2
|
3天前
|
缓存 资源调度 Cloud Native
云原生架构下的性能优化实践与策略####
【10月更文挑战第26天】 本文深入探讨了云原生环境下性能优化的核心原则与实战技巧,旨在为开发者和企业提供一套系统性的方法,以应对日益复杂的微服务架构挑战。通过剖析真实案例,揭示在动态扩展、资源管理、以及服务间通信等方面的常见瓶颈,并提出针对性的优化策略,助力企业在云端环境中实现更高效、更稳定的应用部署。 ####
7 0

相关产品

  • 实时计算 Flink版
  • 推荐镜像

    更多