3

亿级用户背后的字节跳动云原生计算最佳实践

 1 year ago
source link: https://juejin.cn/post/7114235555491086372
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

字节跳动的大数据业务和底层运算能力近年来发展迅速,本文介绍了字节跳动在流式计算和批式计算方面的重大演进以及最佳实践。

互联网时代数据出现爆发式增长,数字化、实时化的趋势也明显加快。基于数据驱动的业务场景不断涌现,无一不在加速着大数据的繁荣发展。而随着云原生概念的兴起,大数据技术产品逐步迭代升级,云原生大数据技术产品开始引领产业变革的浪潮。

字节跳动大数据业务背景

从 2017 年起,字节跳动陆续推出多款广为人知的热门应用,如抖音、今日头条、西瓜视频、剪映、番茄小说、懂车帝等。应用形态从图文、点播,逐步走向更具实时化的直播、实时音视频。海量的数据规模、愈加复杂的实时场景使得各大业务对字节跳动底层运算能力的要求不断提高。

image.png

字节跳动业务的数据存储和日志规模每日已达到 EB 级别

实时推荐峰值每秒达到百万次

以抖音的实时推荐为例。系统需要从亿万级别的内容库中选出用户可能感兴趣的内容,运用复杂的模型对内容进行打分排序,再通过广告系统的处理,最后呈现给用户,整个过程需要在 300 毫秒内完成。这就对背后的计算能力提出了很高的要求,只有庞大的计算资源和极致的性能优化,才能达到这一业务需求。

云原生技术在字节跳动的敏捷迭代和创新的背后发挥了重要的作用,也正是这项关键的技术让字节跳动可以在 27 天内完成央视春晚红包项目的备战。字节跳动的大数据生态和云原生技术从早期的独立发展,到后来的大规模在离线混部, 再到今天的融合调度,大数据已经完全融入到云原生的生态中。

字节跳动云原生计算发展历程

流式计算引擎

字节跳动的流式计算引擎经历了由 Storm/JStorm 完全替换为 Flink 的演进。

在 2017 年以前,字节跳动一直在使用 Storm/JStorm 框架作为流式计算引擎。但随着业务的不断发展,Storm 不支持 Exactly Once、缺少 SQL 以及状态的支持、运维比较复杂、稳定性不高等缺点愈加凸显。

经过一系列调研,2017 年中,字节跳动基础架构团队正式开始尝试使用 Flink 作为流式计算引擎。

流式计算 Flink 引擎的高速发展

由于推荐系统和线上服务的大规模应用,字节跳动早期的技术体系主要是以 Python 为主。为了更好地实现生态对接,基础架构的工程师们在底层计算引擎上封装了一套 Python 的接口,各业务作业通过 Python 框架使用流式计算引擎。

得益于 Python 框架的存在,底层引擎从 JStorm 变更为 Flink 的工作得以在业务用户无感知的情况下完成,即用户仍然可以使用同样的 API 来实现自己的业务逻辑。在这个过程中还主要解决了两个问题:

  • 通过 SmartResources,防止资源空置和浪费。早期的流式计算引擎使用 YARN 作为调度系统,而从 JStorm 迁移而来的业务用户对设置 CPU 和 Memory 没有概念。为了保障作业的稳定运行,业务用户往往倾向于设置很大的资源量,这也就导致非常大的资源浪费。SmartResources 可以通过作业历史和当前的运行状况,自动调整 Container CPU 和内存的实际资源使用量,这在防止资源浪费上能够提供很大的收益。
  • 通过单点故障重启,解决大规模模型训练场景下的作业重启问题。Flink Exactly Once 的特性决定了任何一个 Worker 失败都会导致整个作业的重启。但在大规模模型训练场景下,重启时间对线上效果的影响将会被无限放大。在此背景下,基础架构的工程师们修改了 Flink DAG 的 Failover 实现,使得在特定的 Topology 下,单 Task 失败可以只重启单个 Task,从而实现了非常短的时间内的故障恢复。

到 2019 年,流式计算引擎已经完成了 JStorm 作业的 100%迁移。基于开源社区对 SQL 能力的增强,基础架构流式计算团队开始在公司内部大力推广 Flink SQL,Flink 的应用场景在字节内部得到不断拓展,特别是与直播、广告等业务团队一起共同探索流批一体应用场景。此外,流式计算团队开始在公司内部推动 Flink Batch 的落地,数据 Binlog 同步等业务场景的支持,目前每天大概有 10w+ Flink Batch 作业运行。

消息处理峰值 90 亿 QPS

图片

截至目前,字节跳动业务流式作业数量已经达到 4 万个,其中 SQL 作业占 30%,随着 Flink SQL 在字节内部的推行,这一占比还将会继续扩大。而在这 4 万个作业中,已有 1.8 万个作业开启了 Checkpoint,高峰流量吞吐达到 600GB/s。在资源层面,目前业务平均使用的 Flink 资源已经超过 400 万核。

可以想象一下,每当今日头条、抖音等软件在夜晚迎来使用高峰时,字节跳动内部的实时计算引擎也随之进入高速运转。据统计,每晚 Flink 作业处理消息的 QPS 可达到 90 亿。

批式计算引擎

长期以来,字节跳动批式计算引擎 Spark 支持构建了公司内绝大部分的数据仓库。发展至今,Spark 作业数已达 90W,涵盖 SQL/Java/Scala/Python 多种语言。资源核数达 500 万 Core,在这其中包括了大量的大规模在离线混部资源。

在 Spark 引擎不断发展的过程中,字节批式计算团队的工程师们同样遇到了诸多挑战。

  • 如何提升 Shuffle 稳定性以保障 SLA

在大规模作业下,开源 ExternalShuffleService 的实现机制容易出现大量随机读导致的磁盘 IOPS 瓶颈, Shuffle Fetch 的请求积压等问题,从而致使运算过程中经常出现 Stage 重算甚至作业失败,继而引起资源使用的恶性循环,严重影响 SLA。对此,团队提出了 Cloud Shuffle Service 解决方案,解决了 ESS 机制上的一些缺陷,同时独立部署服务,更好地对接更多混部资源。

  • 如何降低运维和资源成本

伴随着业务需求的不断发展,公司内部批式计算作业数量也在不断增加,同时存在资源利用率低,工单数量大等问题。由此,团队开始考虑通过自动化方案 BatchBrain 来解决。BatchBrain 可提供异常作业(慢作业、失败作业)的自动诊断,以及推荐参数,从而达到降低成本的目的。

字节跳动业务验证下的行业标准解决方案

经过字节跳动的大规模业务验证,当前火山引擎正式推出流式计算 Flink 版批式计算 Spark 版两款云上产品。

流式计算 Flink 版

依托于字节跳动在业内最大规模实时计算集群实践。火山引擎流式计算 Flink 版基于火山引擎容器服务(VKE/VCI),提供 Serverless 极致弹性,是开箱即用的全托管流式计算引擎。在 100%兼容开源 Flink 的前提下,对产品功能也进行了企业级增强。

  • 开发效率提升。流式计算 Flink 版支持算子级别 Debug 输出、Queryable State、Temporal Table Function DDL,在开发效率上对开源版本 Flink 有显著提升。
  • 可靠性提升。流式计算 Flink 版针对单个 Task 进行 Checkpoint,提高了大并发下的 Checkpoint 成功率。单点任务恢复和节点黑名单机制功能,保障了对故障节点的快速响应,避免业务整体重启。
图片

流式计算 Flink 版 - 产品功能架构

典型的多维实时场景支持

当前业界通常把 Flink 引擎定义为实时场景下的行业标准解决方案。同样,经过企业级功能增强后的火山引擎流式计算 Flink 版可以支持典型的多维实时场景。

  1. 实时 ETL 场景。提供丰富的内置 Connector,全面支持各种数据源及存储,企业级 SQL 能力高效构建实时数据处理平台;
  2. 实时监控场景。可提供状态管理等支持,内置 CEP 复杂事件处理模块,协助企业简化规则告警配置、降低监测平台维护成本;
  3. 实时数仓场景。支持海量数据实时处理和高并发实时入仓,协助企业建立数字化运营体系,为经营决策提供实时数据支持;
  4. 实时推荐场景。具备实时样本拼接能力,通过实时模型训练,创建实时增量模型,为客户提供更加精准和实时的推荐能力。

业内最大规模实时计算集群最佳实践

在字节跳动内部,抖音/头条/穿山甲等业务的广告推荐以及模型训练都深度使用了流式计算 Flink 版提供的流式计算引擎能力。

在流式训练方面,流式计算 Flink 版支持数据预处理、样本拼接、特征和稳定性指标的更新,为推荐效果的实时性和稳定性提供了有力保障。

在模型训练方面,流式计算 Flink 版支撑了推荐算法模型的核心训练任务,帮助模型及数据流快速迭代,提升模型稳定性,从而更好地协助业务团队助力广告主投放与媒体变现能力的增长。

值得一提的是,火山引擎流式计算 Flink 版支持云中立模式,支持公共云、混合云及多云部署,全面贴合企业上云策略。目前产品正在公测中,欢迎申请试用:

图片

批式计算 Spark 版

火山引擎批式计算 Spark 版支持了今日头条、抖音的超大规模批计算,提供面向深度学习场景的深度优化。在 100%兼容 Apache Spark 的同时,实现企业级功能增强,配备火山引擎独有的 Cloud Shuffle Service 以保障 Spark 的作业性能和稳定性。批式计算 Spark 版提供租户级端到端安全隔离,具备基于火山引擎 VKE/VCI 的 Serverless 极致弹性扩展能力。

图片

批式计算 Spark 版 - 产品功能架构

覆盖流批一体和深度学习场景

  • 流批一体数据处理场景。火山引擎批式处理 Spark 可提供 Streaming/Batch 流批一体的数据处理能力,同时提供结构化、半结构化数据支持,支持丰富的上下游数据源与数据存储。
  • 云原生数据湖场景。通过字节增强版 Iceberg 提供服务化的云原生数据湖平台:支持 Schema 校验、数据 Time-Travel、小文件自动优化、 ACID 事务性、Merge on Read 等功能。
  • 深度学习场景。提供火山引擎自研通用深度学习框架和 Feature Store 服务,高效支持大规模分布式深度学习训练。端到端大数据 AI 一体化服务,提供一站式大数据+AI 解决方案。

字节跳动批式计算应用的最佳实践

目前字节跳动内部数据仓库都是基于 Spark 来构建,包括今日头条、抖音等业务的超大规模批计算作业。火山引擎批式计算 Spark 承载了字节跳动内部大部分离线 ETL 的海量数据处理任务,帮助内部用户高效构建离线数仓;同时也给 BI 分析师等业务方提供基于 Spark 的 Ad-Hoc 查询服务。

在穿山甲等相关业务的机器学习场景下,特征工程是机器学习领域中重要一环。火山引擎 Spark 承担了特征提取、离线调研、训练预处理等相关工作。

火山引擎批式计算 Spark 版同样支持公共云、混合云及多云部署。公测申请请点击:

图片

了解更多火山引擎云原生计算混合云相关信息,可发送邮件至 [email protected]

了解更多云原生计算信息,欢迎扫码加入飞书【云原生计算技术交流群】~

👇 云原生计算技术交流群 👇

图片

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK