网易首页 > 网易号 > 正文 申请入驻

3000+任务迁移K8s后,作业帮资源成本直降20%:

0
分享至


作者 | 作业帮大数据团队(刘泽强、孙建业)

作业帮实时计算主要基于 Flink 构建,共有 3000 多个任务,均采用 Per-Job 模式部署在 Yarn 集群,因 SLA 要求差异不同部门间集群独立。历史 on Yarn 模式主要面临以下问题:

资源隔离粒度粗。Yarn 集群本质通过内存隔离,因业务线差异,流量类 Flink 任务处理大量字符串匹配消耗 CPU 多,导致同集群其他任务吞吐下降,出现延迟。

资源利用率低。无论采用多集群部署还是单集群 Node Label 方式,都需要预留资源防止机器故障、新增任务等情况,导致资源利用率偏低。同时各部门场景差异,集群资源使用特点不同,资源共池管理、任务间资源强隔离后可实现互补。例如流量类场景会做大量字符串匹配 CPU 消耗高,简单数据同步 CPU 消耗低等。

平台逻辑复杂。部分业务有高可用需求,我们部署两套 Yarn 集群作为主备,状态存储在对象存储,Flink 任务托管平台提供切换能力,单集群异常时自动切换。这种模式调度逻辑非常复杂,同时备用资源存在浪费。

技术选型:为何放弃 Yarn 拥抱 K8s Operator

目前行业中有多种提交方式。首先 Standalone 模式,这种模式资源静态分配,Flink 任务扩缩繁琐。其次是 Native 模式,Flink 原生支持,通过构造 Flink 命令提交任务,在平台层可根据多版本历史任务情况灵活适配。核心逻辑是 Flink 内置了 Kubernetes client,直接和 K8s API Server 服务通讯,创建 JobManager 部署。Flink 的 ResourceManager 将与 K8s API Server 服务器通信,动态按需分配和释放 TaskManager pod,与 Yarn 原理类似。

还有 Flink Operator 模式,更贴近 K8s 生态,通过构造 Flink CR 提交给 K8s API Server,Operator Observer 通过 K8s API 检查 JM Deployment 状态、Flink Rest API 获取 job 指标等信息,Validate 根据预设规则检查用户提交 spec 是否合法,Reconciler 对比"观察到"的状态与"期望"的状态决定操作动作,Updater 将最终的执行结果和新的状态再次同步给 K8s API Server,Operator 托管了 Flink 任务完整生命周期。对平台而言复杂度大大降低,同时 Operator 模式还兼顾动态扩缩能力,为实时离线资源弹性提供基础。最终采用了 Flink K8s Operator 模式。

Flink 任务可观测性建设

Flink 任务可观测性主要分为如下几个方面:

Flink 运行态 WebUI:通过 Ingress Service 来代理实现。

Flink 历史日志查看:通过部署 LogAgent 收集 pod 日志到 Kafka,然后落到对象存储中,通过 LogSearch 检索。LogAgent 和 LogSearch 复用了在线业务日志能力。

Flink Metrics 监控:在官方 PrometheusReporter 的基础上增加了 discovery 的功能。Container 的 HTTPServer 启动后,把对应的 ip:port 以临时节点的形式注册到 ZK 上,然后利用 Prometheus 的 discover targets 监听 ZK 节点的变化。由于是临时节点,Container 销毁时节点消失,Prometheus 感知后停止抓取。

K8s Events 信息:通过 K8s watch 机制订阅关键事件进行存储。

大规模迁移实践:万核级任务平稳切换

作业帮大数据是建立在多个公有云半托管 EMR 上的,Flink on Yarn 模式转变为 K8s 时切换到了公有云的 K8s 产品。Flink 任务虽然是两阶段资源申请,但整体形态和在线业务场景很像,都是长时服务,在调度方面已有能力基本都能满足需求。Flink 整体资源规模万核左右,pod 个数大概 1.3 万,常规 K8s 集群调度效率百级每秒,全部任务 1min 左右拉起来,性能满足需求。

考虑降本效果,单云一个 K8s 集群,采用固定节点和公有云 serverless 兜底的方式最大化消除 buffer 资源。每个业务部门一个 Flink K8s Operator 和 namespace 来代替 Yarn 队列概念,通过 quota 控制资源使用上限。为保障单节点利用效率 request = 0.1*slot(1 slot 等于 1 core),limit = request × 超用系数。超用系数根据 Flink 任务特点、稳定性、节点负载等情况调节。业务成本分摊由按集群、队列方式转变为根据任务实际占用情况分摊,优化任务后降本效果立刻体现,避免了平台和业务的沟通、运维成本。

核心两个方面变化,一个是调度服务解除了 Flink 生命周期管理,并且服务本身无状态仅用于处理请求。修改 Operator 将任务状态主动上报调度服务。二是高可用保障利用 K8s 拉齐,不再依赖主备集群模式,低保障集群状态全部切换到对象存储。

版本升级与数据对数:双跑验证保准确

我们线上 Flink 任务版本比较杂 1.14.x、1.12.x 甚至还有 1.9.x,历史较低版本的 Flink 在能力和性能上还存在缺陷,我们做了一些适配和优化,当前绝大多数能力在最新版本基本都已解决。同时 Operator 模式对 Flink 最低版本有要求,所以在迁移时将 Flink 任务升级到最新稳定版。考虑整体变化比较多,最靠谱的方式双跑对数保障准确,根据已有监控关注延迟保障效率。

验数整体思想是将 Flink 无界流利用 source offset 转为有界流,工具化解析并替换为测试 source、sink,分别启动新老版本的测试任务,通过 sum(hash(fields)) 和 count(1) 方式验证数据准确性。


Jar 任务整体占比不足 10%,提供对数工具、解决方案等辅助方式配合业务迁移。

踩坑实录:7大典型问题与解决方案

1. Flink 高、低版本 Kafka state 不兼容问题

针对需要从 state 恢复的任务,我们需要在迁移任务的过程中,通过 state processor API 读取老的 state,然后适配为新的 state(state name、state 序列化类等),然后迁移任务。

2. 高版本 cast 方法要求更严格

如果要达到和低版本 cast 一样的效果,需要使用 try_cast。

3. 不同类型数据隐式转换失败问题

比如 int -> string,高版本要求更严格,会直接报错失败,需要修改 Flink DDL 对应数据类型。

4. 高版本 Flink UDF 针对 nested 返回格式的函数要求更严格

需要显式在 UDF 中设置相关的 DataTypeHint,否则运行失败。

5. 高版本 Kafka connector 和低版本 Kafka connector 逻辑差异

低版本解析数据失败,try catch 打印错误;高版本会直接让任务失败。在 SQL 中设置 parse-fail.ignore 参数解决。

6. Flink 升级后,upsert sink 相关的任务的 state 一直变大,最终任务 OOM 挂掉

高版本 Flink 针对 CDC 数据写入 Upsert Sink,会引入 SinkMaterializer 算子,保证乱序数据的准确性,会导致算子 state 一直扩大。

原理:高版本 Flink 针对 CDC 数据写入 Upsert Sink,为了防止 change log 乱序造成的数据准确性的问题,引入了 SinkUpsertMaterializer 算子,该算子会根据主键维护一个 keyedState,在主键比较多的情况下,会占用很大的 state。

解决:确保主键不乱序的情况下,设置 table.exec.sink.upsert-materialize = None 或者设置 state TTL。

7. 透明大页导致 pod OOM-kill

问题原因:pod OOM-kill 基本都是 JVM 的堆外内存溢出导致的,经过内存分析,发现是 K8s 节点的透明大页开启导致(Yarn 节点默认关闭)。

核心原理:透明大页主要是 Linux 为了解决大内存分配场景下,因为默认 page 较小导致 page table 过大,CPU 查找虚拟地址到物理地址映射(TLB, Translation Lookaside Buffer)的效率降低引入的。但是针对 Flink 应用等小内存场景下,却会导致内存过度分配等问题。

解决方案:因为我们的 Flink 场景下,pod 都是小内存,普遍 2G 左右,透明大页会造成内存浪费的问题。关闭透明大页后,堆外内存溢出的问题基本没再出现。

CPU Throttling 导致任务延迟


问题原因:任务的 CPU 使用率没有超过 pod 的 limit 限制,机器的 CPU 使用率也比较低,但是任务却延迟严重。原因为 K8s CPU Throttling 导致的,虽然没有超过 limit,但是已经触发了多次的 throttling。

核心原理:Kubernetes 进行 CPU 资源隔离是通过 Linux CGroup 的(时间周期,默认 100ms=10000us)和(周期内的 CPU 时间上限)共同限制进程 CPU 使用,若进程在周期内用尽,内核会 throttle(暂停)其 CPU 使用,直到下一个周期开始。实际生产中,突发/波动流量会导致进程快速消耗完,进入 throttling 状态,从而造成进程无法继续用 CPU,引发业务延迟。

解决方案:全局配置 CPU burst 超用,或者任务配置更大的 slot(CPU limit)缓解 throttling(我们线上采用这种方式)。

Remote Artifact Fetching 能力扩展

Flink on K8s 支持了 remote artifact fetching 能力,但是不支持 zip 依赖、http 重定向报错、TM 无法引用等问题。对 HttpArtifactFetcher 进行了扩展:

支持递归提取 tgz、zip 等压缩包中的 jar 包,确保依赖资源的正确加载。

兼容 http 到 https 的协议重定向,解决了跨协议资源获取的问题。

在 TaskManager 启动时,将相关依赖加载到其 classpath 中,保证任务的正常运行。

Etcd 1MB 限制与 ConfigMap 压缩

默认 Flink 保留近三天的 checkpoint,个数比较多,ConfigMap 中存储的元信息比较大,导致超过 etcd 1MB 大小限制。同时当 ConfigMap 较大、大量 Flink 作业访问 ConfigMap 时,对 etcd 的网络 IO 和磁盘 IO、API Server 的内存都有较大的压力。

我们的做法是:修改 Flink 源码,在写入 ConfigMap 的时候,将 ConfigMap 相关的信息先 gzip 压缩再存储,读取的时候先 gzip 解压再返回,以此降低存储大小保证管控面的稳定性。另外该能力通过参数的形式进行控制,这样也保留了原生 Flink ConfigMap 读写的能力。

节点负载不均治理

产生节点负载不均的原因有多种场景,例如 CPU 密集型 Flink 任务多个 TM 分配到相同节点导致 CPU 覆盖高、新增任务时非资源使用高峰导致调度误判引起高峰期时负载不均、高峰期过度驱逐导致预期外任务重启。解决方案多种逻辑配合进行:

首先 Pod 反亲和,尽可能将单个 Flink Job pod 打散,避免单资源密集型任务 pod 过度集中。

其次高负载节点降压,以 Pod 实际占用资源和负载情况打分,逐步驱逐高分 Pod。

还有负载调度,预选阶段根据负载指标阈值,排除高负载节点,优选阶段综合考虑节点负载、Pod 亲和性、Pod 数量、镜像本地性等因素进行打分,将任务调度到最优节点。

任务删除耗时优化:从 2min 降到秒级

任务暂停时,我们通过平台调度服务调用 K8s API Server 直接将 FlinkDeployment 删掉,Operator 检测到删除 event 事件后进入 cleanup 流程,清理 metrics、autoscaler 等相关信息、删除 Job Manager Pod、Deployment、HA 数据等。整体流程似乎没啥问题,但是耗时比较慢大概 1~2min,即便任务 pod 数量很少也是一样。

分析 Operator 日志发现,耗时主要发生在删除 JobManager 阶段。老的 TaskManager 收到 SIGNAL 15: SIGTERM,然后 JobManager 申请新的 TaskManager。分析 K8s 的审计日志,在删除 deployment 的时候出现了 TaskManager pod 新创建的情况,新增的 TaskManager pod 因为 Flink ConfigMap 被删除,导致 pod 无法 mount,然后 pending 1~2min。

综合分析,FlinkDeployment finalizer 自身的删除逻辑和 K8s 资源删除逻辑同步执行,导致触发了 Flink 任务的 failover 流程,从而出现新增 TaskManager pod 的情况;同时由于 Flink ConfigMap 也同步被删除,导致 creating pod 卡住,进一步导致 deployment 的删除卡住。解决方案在删除资源的时候,把 Propagation 从 Foreground 改为了默认的 Background,让 K8s 先走完 Operator 自身的删除流程,再走默认的资源清理逻辑。

迁移成果与未来展望

目前整体已有 95% 的任务完成迁移,总体资源消耗降低 20%。集群数量减少,平台复杂度降低,运维成本降低。集群整体 SLA 提高,向上拉齐。

下一步重点:Flink 任务的弹性扩缩和资源调优(基于 Flink Kubernetes Operator)。目前高低峰明显,实际机器资源利用率差 60% 多;现有业务实时、离线场景天然错峰,考虑基于 K8s 弹性混布。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
嘉行公路一房屋突发火情 现场多辆电动自行车烧毁

嘉行公路一房屋突发火情 现场多辆电动自行车烧毁

上观新闻
2026-05-08 20:33:07
民航人要注意“汉坦病毒”,一空姐被感染

民航人要注意“汉坦病毒”,一空姐被感染

中国民航人
2026-05-08 12:10:03
商家回应“190元榴莲遭恶意仅退款,买家被行拘”:我就是要证明自己商品没问题,希望对方公开道歉

商家回应“190元榴莲遭恶意仅退款,买家被行拘”:我就是要证明自己商品没问题,希望对方公开道歉

封面新闻
2026-05-08 18:54:08
珠海居民在小区散步时被掉落的大王椰树叶片砸中背部!十级伤残…

珠海居民在小区散步时被掉落的大王椰树叶片砸中背部!十级伤残…

广东活动
2026-05-08 07:08:14
迅速熄灭怒火!皇马重罚82琼阿梅尼,然而内部矛盾不会就此消失

迅速熄灭怒火!皇马重罚82琼阿梅尼,然而内部矛盾不会就此消失

里芃芃体育
2026-05-09 07:27:38
中国球迷险无法看国足踢世界杯!央视极限压价:2亿买两届转播权

中国球迷险无法看国足踢世界杯!央视极限压价:2亿买两届转播权

念洲
2026-05-07 16:31:49
日本真要变天?高市下跪后,东京爆发大规模抗议,日防长登机离国

日本真要变天?高市下跪后,东京爆发大规模抗议,日防长登机离国

天气观察站
2026-05-08 18:54:16
张凌赫晒出烤肉照片,横店一烤肉店爆火,老板直言十分感谢张凌赫

张凌赫晒出烤肉照片,横店一烤肉店爆火,老板直言十分感谢张凌赫

可爱的巴比龙
2026-05-08 14:22:54
肌肉从30岁就开始流失?新研究:每周两次就能止住

肌肉从30岁就开始流失?新研究:每周两次就能止住

热搜摘要官
2026-05-08 06:06:49
格拉斯纳:对阿森纳和曼城都可能轮换,我要对水晶宫负责

格拉斯纳:对阿森纳和曼城都可能轮换,我要对水晶宫负责

懂球帝
2026-05-09 00:37:06
诺兰新作,炸翻外网:他想让你相信男人们会为了这女人发动战争

诺兰新作,炸翻外网:他想让你相信男人们会为了这女人发动战争

文娱春秋Plus
2026-05-08 14:46:34
与李荣浩的讨伐风波才结束,单依纯再破天花板,让整个娱圈沉默了

与李荣浩的讨伐风波才结束,单依纯再破天花板,让整个娱圈沉默了

何揎室内设计
2026-05-09 05:34:00
彻底打脸!皇马球迷狂喷安切洛蒂下课,如今才懂他有多神

彻底打脸!皇马球迷狂喷安切洛蒂下课,如今才懂他有多神

奶盖熊本熊
2026-05-09 04:50:02
蒋介石看完上甘岭战役后,评价:我不反攻大陆了,我真不如毛泽东

蒋介石看完上甘岭战役后,评价:我不反攻大陆了,我真不如毛泽东

浩渺青史
2026-05-09 03:15:30
在单位里永远要记住一个人际关系的残酷实情:如果领导有事不直接找你,反倒让同事传话告诉你,只能说明这两个问题

在单位里永远要记住一个人际关系的残酷实情:如果领导有事不直接找你,反倒让同事传话告诉你,只能说明这两个问题

心理观察局
2026-05-08 09:11:06
全球同步收到消息,特朗普输了个底朝天,埃及前总理:中国是榜样

全球同步收到消息,特朗普输了个底朝天,埃及前总理:中国是榜样

浪子阿邴聊体育
2026-05-08 05:27:03
给美国造谣是不是造谣?

给美国造谣是不是造谣?

木虫
2026-05-08 13:49:42
斯诺克单赛季奖金榜:赵心童破百万,世界第1历史第3,吴宜泽第2

斯诺克单赛季奖金榜:赵心童破百万,世界第1历史第3,吴宜泽第2

刘姚尧的文字城堡
2026-05-08 09:00:42
美因茨总监:我们不是廉价超市,2500万欧甚至买不到佐野海舟一条腿

美因茨总监:我们不是廉价超市,2500万欧甚至买不到佐野海舟一条腿

懂球帝
2026-05-08 13:52:13
李宗仁谈白崇禧的死亡:他要搞南北朝、炸大陆,被暗杀不值得同情

李宗仁谈白崇禧的死亡:他要搞南北朝、炸大陆,被暗杀不值得同情

史之铭
2026-05-09 03:15:53
2026-05-09 07:59:00
字节漫游指南
字节漫游指南
有态度网友ytd
3459文章数 38关注度
往期回顾 全部

科技要闻

Meta疯狂拥抱人工智能:员工苦不堪言

头条要闻

美公布首批UFO文件 视频公开:阿联酋现水母状物体

头条要闻

美公布首批UFO文件 视频公开:阿联酋现水母状物体

体育要闻

他把首胜让给队友,然后用一年时间还清账单

娱乐要闻

古天乐被曝隐婚生子,新娘竟是她

财经要闻

估值3000亿 DeepSeek寻求500亿元融资

汽车要闻

MG 4X实车亮相 将于5月11日开启盲订

态度原创

房产
本地
数码
艺术
公开课

房产要闻

豪掷6.8亿拿地!何猷君大手笔投资三亚!

本地新闻

用苏绣的方式,打开江西婺源

数码要闻

谷歌正在开发Tensor G7:继续采用2nm工艺 将用于Pixel 12系列

艺术要闻

清风拂面,心旷神怡

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版