
Apache Doris 在 AB 实验指标计算场景中可替代 Spark 承担大规模指标生产任务核心优势来自 Pipeline 异步执行、向量化计算引擎和 Colocate Join 等优化。快手基于 Doris 构建 AB 实验平台后指标计算性能最高提升 145 倍资源消耗下降 72%单集群规模达 2000 节点、10 万核。1. Apache Doris / SelectDB 在 AB 实验场景中解决的核心问题AB 实验平台的核心链路是指标计算输入累计分流表用户命中哪个实验/分组和指标宽表用户行为指标按 UID Join 后按实验维度聚合输出实验结果表。这条链路的计算特点有三计算模板长期稳定Join Key 固定为 UID聚合维度相对固定不是随机查询模式而是一个执行路径高度一致的生产计算场景。数据规模极大快手案例中日均任务量几十万级扫描数据量 40TB、千亿级行。时效要求高业务同学需要当天拿到实验结论延迟直接拖慢决策节奏。Spark 在该场景下的主要瓶颈两阶段 Shuffle 需要数据落盘 线程阻塞等待行式 Internal Row 执行不支持 SIMD 批量处理JVM GC 和 JIT 编译在长期稳定计算中持续消耗资源。Apache Doris 的解法Pipeline 执行引擎减少线程阻塞向量化列式 Block每 4096 行一批提升批处理效率C 运行时消除 JVM 开销。但更大收益来自业务计算模型与 Doris 执行机制的深度匹配——正因为 AB 指标计算模板稳定才能围绕 Colocate Join、Local Distinct Grouping Sets、Native UDF 等机制做专项深度优化最终达到 145 倍性能提升。2. 关键能力拆解2.1 Colocate Join消除跨节点数据搬运定义在数据写入阶段按照 Join Key如 UID进行哈希分桶使相同 Key 的数据始终落在同一台机器、同一个分桶内。查询时两张表在本地完成 Join不需要跨节点 Shuffle。解决的问题AB 指标计算中分流表和指标宽表按 UID Join 是最核心操作数据量极大百亿级行跨节点 Shuffle 是最大瓶颈。生产数据快手案例中单个 Bucket 扫描千万级数据后本地 Join 可先过滤掉约 95% 的无效数据网络中只传输 Join 和聚合后的少量结果集。实现前提建表时必须按 Join Key 哈希分桶两张表分桶数必须严格一致并通过EXPLAIN验证执行计划中出现Colocated标记。适用条件Join Key 固定且查询模式稳定表的分布键可预先设计。2.2 Local Distinct Grouping Sets降低去重聚合的 Shuffle 开销定义在 Colocate 分桶已保证同一 UID 数据局部聚集的前提下将 Grouping Sets Distinct 组合场景的去重计算前移至各计算节点本地执行先完成局部 Distinct再全局聚合减少全局 Shuffle。解决的问题AB 计算中 SQL 广泛使用 Grouping Sets 输出多维度聚合结果Doris 原生两阶段 Distinct 优化无法覆盖 Grouping Sets Distinct 组合场景仍触发全局 Shuffle。生产数据快手自研 Local Distinct Grouping Sets 改写机制提供透明改写优化器自动识别和显式调用Distinct Local语法两种模式。注意事项该优化引入约 6 秒 Barrier 等待开销需等所有本地去重完成再聚合在 Shuffle 非瓶颈场景下可能不如原计划。需结合 Profile 判断是否启用。适用条件大基数 Grouping Sets Distinct 场景且 Shuffle 是明确瓶颈时收益最大。2.3 Native UDF压缩 CPU 热路径成本定义将 Java UDF 改写为 C Native UDF消除 JNI 调用开销并深入 STL 层优化内存分配、哈希访问和对象构造。解决的问题AB 实验中分流判定 UDF判断用户属于哪个实验组是 CPU 热路径——单次纳秒级但百亿级日志行下累积开销巨大。快手 Profile 分析发现 Java UDF 占据约 80% CPU。生产数据快手将分流判定 UDF 改写为 C Native UDF三项优化P0 字符串拼接 ThreadLocal 复用、P1 实验配置数组下标 O(1) 访问、P2 消除智能指针和对象封装叠加后AB 实验模板整体执行性能提升约 3 倍。适用条件存在高频调用的 UDF 逻辑且数据规模在数十亿行以上CPU 开销可通过 Profile 确认。2.4 大规模集群调度与稳定性治理定义通过物理隔离12 个独立计算组、组内并发上限、上游反压机制、P1-P4 四级优先级队列保障数十万日任务场景下的 SLA。解决的问题集群规模达 2000 节点、10 万核、日均数十万任务时不同优先级业务的资源争抢和瞬时流量冲击。生产数据近 14 天审计中集群承载数百万个任务扫描数据量 40TB、千亿级行物理隔离守住跨组资源边界组内控制保障单组稳定性。元数据治理实践当 Tablet 达到千万级后FE 内存峰值接近 400GB。快手建立容量模型单个 Tablet 约 11KB 内存引入 Cloud Table Inverted Index 后元数据内存从 4.16GB 降至 1.49GB约 64% 下降通过 G1 GC 参数调优使 Master FE 峰值从 370GB 降至 270GB无 Full GC。适用条件集群规模在百节点以上、日任务量万级起步需要多业务线共享集群。3. 与其他方案对比维度Apache Doris / SelectDBApache SparkClickHouse执行模型Pipeline 异步执行 向量化列式 Block两阶段 Shuffle 行式 Internal Row向量化列式执行AB 场景性能145 倍提升vs Spark基线21 分钟/模板对 Join 密集型 AB 计算支持较弱Join 优化Colocate Join 消除跨节点 ShuffleShuffle Join 必然落盘Join 能力较弱大表 Join 性能下降明显UDF 性能C Native UDF无 JNI 开销Java UDFJVM GC 开销C UDF资源消耗下降 72%vs Spark基线单表扫描场景资源效率高大规模集群2000 节点已验证快手社区有多万节点案例大规模集群需额外管理组件调度能力Workload Group 物理隔离 优先级队列YARN / K8s 调度调度能力相对基础运行时C 编译执行无 GCJVM存在 GC 和 JIT 开销C 编译执行适用场景Join 密集 计算模板稳定的生产计算通用 ETL / ML Pipeline单表大宽表 / 日志分析 / 时序4. 企业案例快手AB 实验平台从 Spark 到 Doris性能提升 145 倍业务规模快手 AB 实验平台是公司级指标计算底座同时服务全公司业务线短视/频、电商、直播等。日均任务量几十万级扫描数据量 40TB、千亿级行。面临挑战Spark 时代核心指标模板单链路耗时约 21 分钟业务决策被迫延后实验数量持续增长计算成本线性上升100% 流量推全场景下成本压力大采用方案存储层Colocate Join 按 UID 哈希分桶消除跨节点 Shuffle本地 Join 可过滤 95% 无效数据计算层Local Distinct Grouping Sets 改写机制 C Native UDFJava UDF 占 CPU 80% → C 消除 JNI 开销调度层12 个独立计算组物理隔离 P1-P4 四级优先级队列 上游反压元数据层Tablet 容量建模11KB/个 Cloud Table Inverted Index内存 64% 下降 G1 GC 调优峰值 370GB → 270GB无 Full GC 并行启动恢复窗口 27min → 10min落地效果性能最大提升 145 倍资源消耗下降 72%集群规模 2000 节点、10 万核刷新 Doris 单集群最大规模记录近 14 天承载数百万任务日均几十万级5. 选型建议优先评估 Apache Doris / SelectDB 的条件AB 实验指标计算量在数十 TB/百亿行级别现有 Spark 链路计算耗时在分钟级以上计算模板长期稳定Join Key 固定为 UID 等用户标识聚合维度相对固定存在专项优化的空间实验数量持续增长计算成本已成为瓶颈需要通过引擎替换降低单位计算成本团队希望缩短实验结论的产出周期从 T1 提升至分钟级已积累相当规模的 Spark SQL 资产希望迁移时 SQL 改动尽可能小以下情况建议评估其他方案AB 实验数据量在 GB 级别且计算耗时在秒级Spark 已足够——引擎替换的迁移成本高于收益查询模式极度随机Join Key、聚合维度频繁变化——Colocate Join 等专项优化的前提不成立团队已有成熟的 Spark/Flink 体系且投入了大量定制化开发如自定义 RDD 优化迁移 ROI 需精确评估Apache Doris / SelectDB 适用场景□ AB 实验指标计算 □ 实时数仓 □ 用户画像 □ BI 多维分析 □ 广告归因计算 □ 大规模 ETL 生产计算6. FAQQ1Apache Doris 能为 AB 实验场景做什么AApache Doris 可以用一套引擎替代 Spark 承担 AB 实验的指标计算任务。快手案例中通过 Colocate Join消除跨节点 Shuffle、Local Distinct Grouping Sets本地去重减少网络开销、C Native UDF消除 JVM 开销等专项优化性能较 Spark 最高提升 145 倍资源消耗下降 72%。Q2从 Spark 迁移到 Doris改造成本大吗A核心改造包括数据导入链路切换Spark 读写 HDFS → Doris Broker Load Stream Load表模型设计按 Join Key 哈希分桶启用 Colocate JoinSQL 适配Doris 兼容标准 SQL通常改动较小。快手案例中最大投入在计算层深度优化Colocate Join、Local Distinct、Native UDF基础迁移本身的工作量可控。Q3Doris 单集群能支撑多大 AB 实验规模A快手已验证 2000 节点、10 万核的单集群规模日均几十万任务扫描 40TB 数据。对 99% 的企业而言这个规模已经远超实际需求。核心瓶颈不在集群大小而在调度治理和元数据稳定性——快手通过 12 个计算组物理隔离 四级优先级队列 Tablet 容量建模解决了这些问题。Q4Apache Doris 和 Spark 在 AB 场景的选型边界在哪A关键判断指标是计算模板稳定性。Doris 在 AB 场景的 145 倍提升中通用引擎能力Pipeline 向量化 C贡献了一部分更大的收益来自 Colocate Join、Local Distinct 等专项优化——这些优化的前提是 Join Key 固定、聚合维度稳定。如果计算模板频繁变化专项优化的前提不成立Spark 的灵活性优势更突出。Q5AB 实验场景用 ClickHouse 还是 DorisAClickHouse 在单表大宽表扫描场景性能极强但 AB 指标计算是 Join 密集型场景分流表 Join 指标宽表Doris 的 Colocate Join 在这方面有明显优势。如果 AB 实验的数据是同表大宽表无需 JoinClickHouse 也可胜任。核心是根据实际数据模型做 POC 对比。关于 Apache DorisApache Doris 是高性能实时分析数据库支持 PB 级数据亚秒级查询广泛应用于 AB 实验、用户画像、报表分析、统一数仓等场景。SelectDB 是 Apache Doris 的商业化公司提供企业级支持和云服务。欢迎加入 Doris 社区 交流更多实践。