大数据是企业发展的重要生产力,数据开发是数据资产内容建设的主战场,是数据价值生产过程中的核心环节。近年来随着快手业务的高速发展,越来越多不同角色的用户开始进行数据开发。开发平台面临如何低门槛满足产品、技术、运营、数据工程师等角色开发需求;超过EB级别数据量和日均百万级的任务数,如何能够降低运维成本;在资源有限的情况下如何保证数据准时产出等挑战。本文主要介绍面临如上挑战快手大数据开发平台的解决方案和实践经验。
本文是快手数据平台在SACC 2022中国系统架构师大会《大数据架构应用设计与实践》专题分享内容整理而成,主要围绕下面三点展开介绍:
01 快手大数据平台
02 快手大数据开发平台建设实践
03 未来规划
1 快手大数据平台
快手是一款全民短视频社区,用于用户记录和分享生产、生活的平台。快手的使命是帮助人们发现所需、发挥所长,持续提升每个人独特的幸福感。一些核心数据如下:
流量方面,日活用户数 3.47亿,月活用户数 5.867亿,平均使用时长 125.2分钟
内容方面,月活用户中内容创作者占比超过 25%
粘性方面,互关用户对数累计超过 200亿
快手大数据平台作为业务的重要合作伙伴。希望以领先的大数据技术,激活数据价值,赋能业务,打造快手核心竞争力 ,为快手业务的飞速发展提供数据新能源。快手作为头部短视频平台,快手大数据的体量规模巨大,当前整个大数据集群规模数万台、总数据量EB级别、日净增数据量PB级别、日任务数数十万级别、平台日活跃用户数万级别。
2 快手大数据开发平台建设实践
本节主要从以下三个部分来展开介绍
2.1 平台定位与发展历程
2.2 平台核心模块与关键技术
2.3 低代码开发实践
从数据的流动上看大数据生命周期主要包括六个阶段:
数据上报阶段:将移动端、PC端等产生的用户行为等数据;Mysql的binlog等数据上报到数据采集服务中
数据采集阶段:将上报的数据统一收集到Kafka消息队列中
数据同步阶段:将Kafka中的数据同步到数据仓库Hive中
数据加工阶段:离线开发基于数据仓库Hive中原始数据进行离线数仓建设;实时开发基于kafka中的数据进行加工
数据分发阶段:将加工好的结果数据通过数据分发同步到OLAP、OLTP等存储中
数据服务阶段:通过服务化API的形式对外提供数据服务,满足看板、线上推荐/搜索等数据使用场景
快手一站式大数据开发平台主要涵盖数据同步、加工、分发三个核心环节,满足用户的一站式数据开发和运维体验。
快手一站式大数据开发平台的发展历史可以主要划分为三个阶段:
原始时代:在2016年,大多基于开源工具完成数据开发和运维,例如离线开发和调度基于Airflow,数据同步基于Sqoop等。整体数据开发的用户规模在百人左右,任务数在数千左右
1.0时代:在2019年,成立统一的数据工具和产品技术团队来负责大数据平台工具和产品统一建设。由此进入快手大数据开发平台的1.0时代,进过3年左右建设,到2021年底基本完成一站式大数据开发平台建设,涵盖同步、离线、实时等数据开发的核心环节,具备通用化的同步和调度基座,并且提供体系化的保障能力。整体数据开发的用户规模增长到数千人,任务量增长到数十万规模
2.0时代:在2022年初,随着业务发展,越来越多研发、产品、运营等不同角色的用户使用数据开发。目前快手大数据开发平台中有超过90%的是非数据平台的同学,此类用户往往对大数据的技术了解较少,开发门槛较高。因此快手大数据开发平台逐步在低代码、智能化等方面进行探索来降低用户开发门槛
快手大数据开发平台目前服务包括短视频、直播、电商、广告等内部业务。整体规模在业界属于头部平台,目前离线任务量在数十万级别、实时任务量在数万级别、日增数据量在PB级别、重要链路任务数超过数千。
2.2 平台整体架构
整体架构主要分为三层:
引擎层:
统一调度引擎Kwaiflow,主要复杂离线场景下的任务定时、依赖调度等能力
统一数据目录Kwaicat,主要负责管理Mysql、Kafka、Redis等异构数据源信息
服务层:由于数据同步、离线开发、实时开发所面临的挑战和技术差异较大,所以在服务能力上分为3个服务独立建设
数据同步主要对外提供多类型同步任务发布、执行以及任务监控能力
离线开发主要对外提供代码提示、规范验证、测试环境隔离等开发能力以及运维管理、任务诊断、补数据等运维能力
实时开发主要对外提供Flink SQL/Jar类型的实时任务开发和运维能力
产品层:
通过把目录树、版本管理等通用化能力沉淀,结合应用层统一框架,以一站式形式对外提供开发运维能力,主要包括数据查询、开发中心、运维中心、系统管理4大模块
2.2 平台核心模块与关键技术
本节主要从数据同步、离线开发、实时开发以及SLA保障四个模块来展开介绍
典型业务场景:
实时同步场景,将Kafka中的数据实时同步到Hive、ClickHouse等存储中
离线同步场景,将数据定时的在Hive、Redis、ClickHouse等异构数据存储之间进行交换
整体架构主要分为三层
API层负责提供任务创建、更新、下线和运维能力
存储层负责存储元信息,包括任务信息,分区检查点、运行事件等信息
调度层
实时同步包括两大模块,协调器负责作业调度、数据源检查、异步分区发布等功能;执行器负责数据拉取、解析、写入功能
离线同步任务调度能力通过Kwaiflow来实现。执行器负责数据拉取、解析、写入功能
在快手,每天的Kafka消息数非常大,可以达到数十万亿量级。业务对数据的时效性要求非常高,需要分钟级的就绪时间。面对实时同步的低延迟保障,主要有两个问题:
流量过大消费不及时。快手的业务场景,高峰期QPS高达几个亿,pb非常复杂可能会有上千甚至上万个字段。在活动数据量徒增10倍甚至100倍等场景时,无法通过扩分区等常规手段进行处理。快手通过多线程模式解决该问题,将数据同步过程中各个环节通过队列解耦,数据读取后放入到队列中,由多个线程并发来进行数据解析、转换和写入操作。并且可以通过配置来指定线程的数量,从而更好的充分利用计算资源加速大数据量的同步效率。
拖尾问题。数据同步是一个分布式系统,整个同步任务完成时间取决于最晚完成的子任务决定,例如100个分区,只有1个没有完成数据也无法就绪。常见的导致拖尾问题的原因有数据倾斜、调度不均匀、算力不均匀。为了优化拖尾问题快手主要通过以下方式
分级限速,通过限制低优任务的调度来保障高优任务能够得到充分的资源
任务重分布,针对调度可能出现不均匀的情况,例如很多个大作业或者高优作业调度到一个节点上,资源无法保障,定时进行任务重分布,保障大作业尽可能的分布均匀
基准核,通过跑分方式来拉齐新旧程度、型号等不同的机器间性能基准,通过对照基准服务器来折算不同比例拉齐机器间的实际算力差距
经过优化目前快手的平均拖尾时间大概在2min左右
在快手,目前大概有几十种存储引擎,针对离线同步数据源种类非常多的问题,借鉴星型模型思想,通过引入同步框架层实现数据源读和写插件化开发,加速离线同步接入新引擎的效率。
离线同步任务执行过程,读插件读取数据来源存储中的数据,通过统一数据传输对象完成数据的转换处理,之后写插件完成数据写入到数据去向存储中。同时为加速大数据量任务的执行速度,基于MR框架实现任务的分布式执行,首先会将数据来源存储的底层文件进行分组,之后父任务会拆分成对应数量的子任务,每个子任务处理一个文件组的数据实现并发执行,之后将子任务的结果进行合并。
2.2.2 离线开发
调度层,整体依赖Kwaiflow来实现任务的例行调度
服务层,整体包括任务开发和任务运维两大模块
任务开发模块,SQLScan服务支持SQL解析、规范校验等能力提升用户代码编写效率和规范程度;SQL渲染服务支持SQL模版和渲染能力,并基于模版支持环境隔离能力
任务运维模块,通过增量消费和全量同步方式从基础服务中采集任务调度信息、引擎信息等。通过实时、定时方式加工任务画像、实例血缘关系、任务执行诊断分析等数据提供包括任务运维、全链路监控告警、任务智能诊断等任务运维保障能力
产品层,提供包括数据查询、任务开发、任务运维、监控告警、系统管理等产品化能力
在快手离线开发主要面临如下问题和挑战,
开发效率低、质量差,包括测试流程不规范缺少环境隔离导致线上数据污染,开发流程和规范落地难,测试验证效率低等问题。
快手业务复杂,且数据量非常大(TB级别表),整个任务依赖链路长、执行环节多、涉及系统多。任务分析运维效率非常低。
针对开发效率低、质量差的问题,将离线任务的开发流程标准化为任务编写、配置、调试、审核、上线 5个步骤的模版化开发流程。
任务开发过程中,通过SQLScan服务,将SQL进行解析得到AST抽象语法树进行语法规则验证;通过语法树获取到SQL中包含的各种信息(包括表、字段、函数等)进行信息提示。通过规则引擎验证SQL是否符合预设的编码、依赖、权限等规范。通过抽象规范DSL实现平台、部门等不同生效范围的开发规范配置化。
任务测试发布过程中,核心是环境隔离,以及测试结果的验证。通过SQL渲染服务,传入SQL模版 和 运行上下文信息,实现逻辑环境隔离能力,避免测试环节污染线上数据。并提供宏变量、条件/分支等表达拓展SQL表达场景。渲染后的代码提交至任务调度进行执行,通过任务诊断服务 如果测试失败诊断失败原因,如果成功则进行数据结果验证(包括行数、枚举值、多表对比等),分析任务执行的资源消耗、以及是否存在数据倾斜等异常的健康度分析。最终生成诊断报告提供审核依据,完成任务的一键发布上线。
数据加工任务执行涉及分布式系统多(任务调度、计算引擎等),问题排查对专业能力要求非常高,用户自助式运维门槛高。同时随着业务发展任务量不断增长导致Oncall压力巨大。
为满足用户自主式运维且降低Oncall压力。快手构建多层级全生命周期的任务诊断系统
数据采集:采集任务调度、计算引擎、资源调度等分布式系统的任务执行信息
诊断算法:通过固定规则、图遍历和图对比等算法对任务执行前、中、后的整个过程进行分析和比对,提供多层级任务诊断能力
诊断能力:任务执行前未启动原因;执行中数据倾斜、执行计划异常等异常诊断;执行后失败原因、健康度分析等能力。并提供相应的优化建议
帮助用户完成从发现问题、分析问题、解决问题自助式运维闭环。目前可以覆盖数据倾斜、OOM、资源不足等常见15种场景,通过样本验证准确率超过90%。
2.2.3 实时开发
相比离线,实时因为其实效性的优势,在快手越来越多的业务场景开始进行实时的开发,典型的包括活动大屏、实时监控等业务场景。
整体框架上
API层:提供任务发布、管理以及UDF、逻辑表等生产资源的管理能力
服务层:提供任务调试、任务发布和监控报警的能力
调试能力:通过将任务改写进行执行(跑固定时间或输出固定条数结果)并将数据结果可视化展示给用户
发布能力:通过协调器完成应用指令下发到Flink引擎以及Flink任务的状态同步
监控报警:通过采集Flink和Yarn的数据进行任务健康检查和监控报警能力
在快手实时开发面临的主要挑战是,Jar模式开发更加灵活但是门槛高效率低。SQL模式门槛更低,但需对接Kafka、Redis等不同存储, 如何降低实时开发门槛是重要的建设目标之一
为降低实时开发对接不同异构数据源成本,将数据源抽象为逻辑表。通过在SQL中使用逻辑表来描述不同数据源。用户可以方便使用SQL操作对应逻辑表完成异构数据源之间的Join等加工操作,SQL提交后自动解析优化后转化成实际的Flink SQL完成最终的执行和计算。在快手通过调研,SQL化开发效率相比Jar模式提升超过70%。
2.2.4 SLA保障
随着快手业务的发展,任务量越来越大。任务间的依赖变得复杂且链路长,下图是快手目前线上一个真实的任务依赖图。目前快手有数十万任务,以核心日报为例,链路深度超过20层,上游任务超过2千个,且横跨多个部门。再加上资源有限,想要保障数据准时产出十分困难。
为保障数据准时产出,快手整体采用分级保障策略,通过组织 + 规范 + 工具相结合的方式保障策略落地。
组织:通过数据研发、数据架构、开发工具等多角色参与的SLA保障虚拟组织保障工作的推进和落地
规范:通过制定优先级管理和SLA故障定级规范统一拉齐SLA的标准
工具:通过基线工具完成SLA保障的具体实施和监控
快手任务优先级体系分为 P0 ~ P3四个级别,依次是公司级核心数据,部门级重要数据,部门级次要数据和不重要的数据,资源分配的优先级权重依次递减。任务个数和对应的资源消耗也基本呈金字塔分布。
工具层面主要是通过基线工具完成SLA保障的具体实施和监控。主要包括优先级管理和进度监控两大能力。
优先级管理:通过优先级服务,基于血缘自动推导上游任务优先级。优先级的变化自动归因,避免计算错误导致问题。最终加载到缓存中提供统一的任务画像查询出口完成系统间的逐级下发,最终通过为高优任务隔离、优先提供更多的资源等手段来保障高优任务的SLA。
进度监控:通过进度预测和监控服务,基于实例血缘关系,通过顺推算法预测任务进度,并结合关键路径算法预测链路余量是否足够,提供余量预警、余量变差、基线破线完善的链路报警策略。通过逆推算法预测任务的最晚开始和结束时间,并结合实时的实例失败事件。提供任务启动过晚、执行膨胀、执行失败完善的任务报警策略。通过诊断分析,快速定位链路报警中的关键节点和影响范围,分析任务报警的原因。进行及时的报警进处理避免及时性故障。
除了日常场景,针对春节等大型活动,在资源有限的情况下,可通过基线进行快速调整优先级保障活动数据的准时产出。目前保障任务的及时性异常基本可以提前到 90min 监控发现,可以有充足的时间来处理避免故障。
2.3 低代码开发实践
客户端埋点数据可以分为业务埋点,用于描述用户行为,例如访问、曝光等数据;技术埋点,用于分析系统性能、监控等数据。客户端研发在监控和排查问题场景下经常需要对技术埋点数据进行分析,当前在快手进行技术埋点分析面临很多问题,主要包括
排期难:
排期长:与业务埋点需求不同,技术埋点分析需求,通常没有专门的 DE、DA 资源,需求通常需要等排期
更新多:客户端指标口径灵活、简单,需要经常更新,每次更新还要等 DE、DA 资源,要至少 3 ~ 5 天才能落地
自助难:
平台多:一个技术埋点分析需求,需要进行数据同步、离线开发、实时开发、申请资源等步骤,操作路径长
门槛高:客户端同学不太擅长写SQL,且需要学习各个平台的操作流程,学习成本高
2.3.2 解决思路
业务埋点分析场景,特点是强调质量、重规范;加工逻辑复杂。对工具要求是流程规范可扩展,通用化基础能力。
技术埋点分析场景,特点是强调效率;加工逻辑简单。对工具要求是低门槛、自闭环
快手针对不同场景特点,进行分层式的加工能力建设,整体自上而下,灵活性提高,效率降低;自下而上,灵活性降低,效率提高。具体包括
标准模版化任务,提供Hive、Bash等标准化任务,满足任务级通用化开发场景
自定义链路化任务,基于标准模版化任务,满足链接级通用化开发场景
场景化解决方案,针对固定开发场景,提供场景化解决方案降低开发门槛
2.3.3 技术架构
低代码服务底层依赖埋点元数据、离线开发、实时开发等基础能力。采用“配置即生产”的配置化模式,用户通过表单化的任务配置,即可以便捷地完成数据接入、加工、分发,进行数据加工和分析。任务发布后,自动探查数据来源并通过实时数据分流、任务分组合并、优化计算逻辑等多种方式,减少资源消耗。之后自动解析配置生成任务代码,并完成任务编排和执行。
2.3.4 成功收益
通过上述低代码场景落地,带来收益如下:
门槛降低:通过SQ 配置化,弱化实时逻辑表、离线数据链路,用户无需关心 SQL、逻辑表、离线链路,降低使用门槛。改变以往依赖DE&DA进行数据分析的模式,客户端研发可以自助接入。
操作路径优化:通过场景化任务类型完成通用能力的打通,之前多个平台的操作步骤缩短为1个平台操作
降低成本:通过实时数据分流、任务分组合并、优化计算逻辑等多种方式,减少资源消耗。
通过调研用户反馈平均人效提升70%。
3 未来规划
1.0时代主要实现一站式,2.0时代希望能够进一步降低数据开发门槛实现数据民主化,即人人都会数据开发。具体包括
通过场景化,拖拽化等低代码形式进一步降低数据开发门槛;
基于逻辑模型,自动生成和优化物理模型,提升数据交付效率;通过智能调度、诊断等能力提升自动化运维效率
基于Hudi + Flink的批流一体,统一离线和实时场景下开发语言降低学习成本
作者简介:韩江,曾就职于百度。2018年加入快手,当前主要负责快手一站式大数据开发平台的相关的服务和产品建设,包括离线开发、实时开发、任务运维与管理等内容。近几年深耕在数据开发领域,熟知数据生产全链路整体解决方案,有丰富的大数据开发和数据治理相关经验。
快手数据中台团队介绍:快手核心大数据中台团队,为全公司构建业界领先的智能大数据生产和分析平台,赋能全业务线提升公司数据创新效率。目前涉及方向包括数据开发工具链(离线和实时数据开发平台、数据同步、大规模工作流调度、全链路质检平台)、数据服务工具链(智能指标模型平台、百万级并发数据服务化平台)、数据分析工具链(一站式数据分析平台、专题式数据分析产品)、数据管理工具链(全链路元数据平台、资源管理平台、数据地图、数据安全平台)。也欢迎优秀同学加入我们!