知乎 AB 实验平台业务背景介绍
知乎 AB 实验平台是知乎主站、盐言故事、知乎知学堂等多条业务线的基础设施,每天运行上千个实验,处理日均百亿级进组用户数据。平台支持基础计算类、留存类、LTN 类等 4000 多个指标分析,具备离群值剔除、多维度下钻等功能。
知乎 AB 实验平台架构演进历程
知乎 - AB2.0 基于Clickhouse的平台架构
AB 2.0 平台采用预计算方式,将结果写入 ClickHouse,利用其单表查询能力。实验数据加工流程包括 AB 进组用户表和业务指标表,前者记录用户 ID、设备 ID、实验分组 ID 等信息,后者记录指标数据。
知乎 - AB 2.0 平台实验数据加工流程
AB 进组用户表包含 uid、cId、ab_id、enter_time、p_date 等字段,业务指标表包含 cId、frequency、content_consum_duration、content_consum_cnt、p_date 等字段。
知乎 - AB 2.0 架构的核心痛点
AB 2.0 架构存在三大痛点:
- 预计算资源消耗大,影响集群其他任务,只能做 Cube 剪枝。
- ClickHouse 对多表或大表 Join 支持有限,无法满足部分业务场景。
- 已有指标数据无法复用,造成资源重复消耗。
知乎 - 新架构选型的二大核心目标
新 OLAP 引擎需满足:
- AB 进组用户表和业务指标表进行即席关联查询,部分场景需 3-4 张表 Join。
- 支持每日百亿级数据量写入,支持事务导入,数据精准写入。
知乎 - 基于 Apache Doris 的 AB 数据流
切换到 Doris 后,数据流程清晰简单:
- Hive 只做 AB 进组用户的落表和指标数据的加工。
- 通过 Broker Load / Steam Load 进行 Doris 的数据写入。
- AB 平台直接对接 Doris 进行即席数据查询。
知乎 - 新旧 AB 平台功能与收益对比
Doris 新平台相比 ClickHouse 旧架构的优势:
- Hadoop 资源消耗大幅降低。
- Doris 在多表 Join 下性能表现优秀,实现相关性分析、归因分析、指标离群值剔除等功能。
- 业务可根据已有数据进行指标口径自定义,缩短数据加工链路。
知乎 AB 在 Doris 上的实践
知乎 - 表结构设计基本准则
- 利用前缀索引。
- 使用 zstd 压缩方式。
- 合理的 bucket 数量。
- 指定 Group,查询优先命中 Colocate Join。
- 排序列。
知乎 - 进组用户表设计
- 使用业务字段 exp_name 进行物理分区。
- Spark 直接按照分区生成对应 parquet 文件,进行 broker load。
- 使用 AGG 模型,部分列更新,提升查询和写入效率。
知乎 - 精准进组用户分析(bitmap)
通过将用户的进组日期写到 Bitmap 里,使用 bitmap_and_count 函数与筛选日期做交叉查询,实现精准分析。
知乎 - 指标查询逻辑
- 指标拆解,按需查询。
- 归属同一张表的指标查询 SQL 合并。
- 缓存加速。
知乎 - 数据导入优化
- 参数调整:desired_max_waiting_jobs=200、async_pending_load_task_pool_size=15、async_loading_load_task_pool_size=15。
- 通过临时分区实现数据的原子导入。
知乎 - Join调优
根据不同场景选择合适的 Join 方式:
- Broadcast Join:无网络开销,但物理算子条件限制。
- Shuffle Join:网络开销较大,但适用范围广。
- Bucket Shuffle Join:Join 条件中存在左表的分布式列,且左表执行时为单分区。
- Colocate Join:Join 条件中存在左表的分布式列,且左表同属于一个 Clocate Group。
知乎 - Profiling
通过 Profiling 分析查询性能,优化查询计划。
知乎 - Apache Doris 调优后收益
- 查询耗时降低:SQL 执行总耗时降低了 35%。
- 查询性能提升:Doris 查询 P99 的用时,由 8s+ 降低到了 3s+,降幅 60%。
未来展望
- 数据冷热存储。
- 更多字段支持。
- Local Shuffle 优化。