Flink 在米哈游的落地实践
摘要:本文作者米哈游大数据部实时计算负责人张剑,分享 Flink 在米哈游的应用及实践。本篇内容主要分为四个部分:
-
背景介绍 -
实时平台建设 -
实时数仓和数据湖探索 -
未来发展与展望
一、背景介绍
米哈游成立于 2011 年,致力于为用户提供美好的、超出预期的产品与内容。公司陆续推出了多款高品质人气产品,包括《崩坏学园2》、《崩坏3》、《未定事件簿》、《原神》,动态桌面软件《人工桌面》以及社区产品《米游社》,并围绕原创 IP 打造了动画、漫画、音乐、小说及周边等多元产品。总部位于中国上海,并在新加坡、美国、加拿大、日本、韩国等国家和地区进行全球化布局。
Flink 在米哈游大数据发展过程中,一直扮演着重要角色。自实时计算平台建立以来,Flink 作为实时计算引擎,经历了多个发展阶段,实时计算平台也在不断地迭代完善。在米哈游内部,实时计算平台被称作 Mlink,主要以 Flink 为主,兼容 Spark Streaming 任务。从起初的 Flink Jar 包任务为主,发展到以 Flink Sql 为主,不断的降低了使用门槛和提高了任务的开发效率;从起初基础的 Flink 任务开发,发展到跨区域、跨云厂商的任务多版本管理,满足了业务发展的需求。在发展的过程中,米哈游不断地关注着社区的发展,并同社区和阿里云同学保持密切的联系。
Mlink 主要是基于 Yarn 资源管理的计算平台,支持了数仓、算法、推荐、风控、大屏等业务。任务数 1000+,Sql 任务占比 80% 左右。使用的 Yarn Vcores 超 5000 核,内存 10T 左右,其中单个任务峰值吞吐在 500 万 QPS,每天吞吐的数据规模超千亿。
二、实时平台建设
2.1 遇到的问题
在 Flink 探索发展的过程中,都会遇到 Flink 使用的一些痛点,大家遇到的,同样在我们探索和实践的过程中也有所感触。总结起来,大概是以下五个方面:
-
一是 Jar 任务的开发成本高,对于不熟悉 Flink 代码的同学来说使用成本过高。同时,Jar 任务维护成本高,一些代码逻辑的改动会涉及到重新打包、上传,上线等动作;
-
二是任务管理功能缺失,其中多租户、历史版本回溯、开发版本和线上版本管理、UDF 管理、血缘管理是实时平台管理的重要内容;
-
三是 Flink 引擎本身管理,主要涉及到多 Flink 版本管理,任务参数配置、常用 Connector 的二次开发、多资源环境管理等问题;
-
四是任务的告警监控管理,任务问题诊断;
-
五是同离线数仓互通,包括 Hive Catalog 管理,实时和离线调度依赖管理等。
2.2 解决方案
2.3 遇到的挑战
平台建设和迭代过程中,我们遇到了不少的挑战,也产生了一些比较好的实践。主要分享四个方面。
■ 第一是 Executor Service 开发和维护方面
■ 第二是监控方面
■ 第三是 Connector 二次开发方面
■ 第四是数据入湖和离线调度方面
三、实时数仓和数据湖探索
-
一是日志类型,主要是通过 Filebeat 采集写入 Kafka,Es 作为 Filebeat 的监控;
-
二是 Api 接口上报服务,后端接入 Kafka;
-
三是 CDC 采集全量加增量 Mysql 数据,写入 Kafka 或者直接写入 Iceberg。之前是采用 Canal 作为增量采集方案,现在已经全部改为了 CDC。
-
一是将 Kafka 和 Iceberg 作为混合 Source 方案,Flink 任务读取混合 Source 之后,基于 Iceberg 快照记录的 Kafka 位点,确定读取范围和切换点;
-
二是社区 Flip-188 提出的引入 Dynamic Table 存储实现。 Flink 内置表由两部分组成,LogStore 和 FileStore。 LogStore 将满足消息系统的需要,而 FileStore 是列式格式文件系统。 在每个时间点,LogStore 和 FileStore 都会为最新写入的数据存储完全相同的数据 (LogStore 有 TTL),但物理布局不同。
-
一是 CDC 采集问题,特别是多库多表采集,会集中采集到 Kafka,减少多个 CDC 任务对同一数据库影响;
-
二是 Iceberg 支持 V2 表写入,包括写入的索引过滤减少 Delete 文件,Iceberg 管理中心合并和提交冲突;
-
三是支持分库分表的数据校验和数据延迟检查;
-
四是一键式任务生成。对于用户而言,只需要填写数据库相关信息,目标 Iceberg 表库名和表名,并支持使用 Kafka 中转,避免多个 CDC 实例采集同一个数据库实例。
四、未来发展与展望
-
一是 Flink 动态表存储能够尽快实现落地,实现真正的实时数仓和流表一体;
-
二是 Flink 任务动态扩缩容、基于任务诊断的主动资源调整、细粒度资源调整;
-
三是 Flink 对批任务的读写优化,目前批任务 Flink 的使用面不如 Spark,如果未来能够在此补足,可以做到流批操作一个引擎,开发成本会显著降低;
-
四是 Flink 加数据湖更好的落地推广。
戳我,查看更多技术内容~