1. 项目背景与挑战
在数字广告领域,快手作为国内领先的短视频平台,每天需要处理海量的广告投放数据。这些数据原本分散存储在不同的系统中,包括用户行为日志、广告点击记录、转化数据等。随着业务规模扩大到万亿级别,传统的数据处理架构面临三大核心挑战:
- 数据孤岛问题:广告主需要跨多个系统获取完整投放效果分析,数据协同效率低下
- 实时性瓶颈:T+1的离线分析模式无法满足实时竞价(RTB)等场景的决策需求
- 成本失控:随着数据量指数级增长,存储和计算资源消耗呈非线性上升
2. 技术选型与架构设计
2.1 为什么选择Apache Doris
经过对主流OLAP引擎的对比测试,技术团队最终选定Apache Doris作为统一分析平台的核心组件,主要基于以下考量:
实时分析能力:
- 支持毫秒级响应的实时数据摄入
- 单节点每秒可处理10万级查询请求
- 内置的MPP架构实现分布式并行计算
成本效益比:
- 数据压缩比达到5:1~10:1
- 冷热数据自动分层存储
- 支持副本动态调整
生态兼容性:
- 完整支持MySQL协议
- 与Flink/Kafka等流处理工具无缝集成
- 提供JDBC/ODBC标准接口
2.2 系统架构演进
原有架构:
graph LR A[用户行为日志] --> B[Hive数仓] C[广告点击数据] --> D[ES集群] E[转化数据] --> F[MySQL集群]新架构实现:
graph TB subgraph 数据源层 A[Kafka] --> B[Flink SQL] C[MySQL Binlog] --> D[Canal] end subgraph Doris集群 B --> E[实时数据流] D --> E E --> F[Base表] F --> G[物化视图] end subgraph 应用层 G --> H[实时报表] G --> I[广告优化] G --> J[风控系统] end3. 关键实现细节
3.1 数据建模优化
针对广告分析场景的特殊性,设计了星型模型与预聚合相结合的策略:
事实表设计:
CREATE TABLE ad_fact ( `timestamp` DATETIME NOT NULL, `ad_id` BIGINT NOT NULL, `user_id` BIGINT NOT NULL, `campaign_id` BIGINT NOT NULL, `click_cost` DECIMAL(20,4), `impression_count` INT SUM DEFAULT "1", `click_count` INT SUM DEFAULT "0", -- 其他20+个维度字段 ) PARTITION BY RANGE(`timestamp`)() DISTRIBUTED BY HASH(`ad_id`) BUCKETS 32 PROPERTIES ( "replication_num" = "3", "storage_medium" = "SSD" );物化视图加速:
CREATE MATERIALIZED VIEW campaign_stats_mv DISTRIBUTED BY HASH(`campaign_id`) BUCKETS 16 REFRESH ASYNC AS SELECT campaign_id, date_trunc('hour', timestamp) as time_slice, sum(click_cost) as total_cost, sum(impression_count) as impressions, sum(click_count) as clicks FROM ad_fact GROUP BY 1,2;3.2 性能调优实践
通过以下措施实现查询性能提升8-10倍:
分区策略:
- 按小时分区处理实时数据
- 按月分区归档历史数据
- 动态分区设置保留策略
索引优化:
- 为高基数维度列创建Bloom Filter
- 对常用查询条件建立倒排索引
- 智能使用前缀索引
资源隔离:
- 通过Resource Group隔离ETL与查询负载
- 关键业务查询设置优先级
- 限制大查询资源占用
4. 落地效果与业务价值
4.1 技术指标提升
| 指标项 | 改造前 | 改造后 | 提升幅度 |
|---|---|---|---|
| 数据时效性 | 1小时 | 30秒 | 120倍 |
| 查询响应时间 | 5-10秒 | 200-500ms | 20-50倍 |
| 存储成本 | 每月200TB | 每月45TB | 77.5%↓ |
| 并发查询能力 | 50QPS | 3000QPS | 60倍 |
4.2 业务场景赋能
实时竞价优化:
- 广告主可每5分钟调整出价策略
- CTR预测模型更新频率从天级提升到分钟级
- 异常流量识别延迟降低到10秒内
跨渠道分析:
- 统一视图展示搜索/信息流/开屏等各场景效果
- 归因分析窗口从7天扩展到30天
- 支持多触点转化路径分析
自助分析平台:
- 95%的常规分析需求通过自助工具完成
- 报表生成时间从小时级降到秒级
- 支持拖拽式多维分析
5. 经验总结与避坑指南
5.1 关键成功因素
渐进式迁移策略:
- 先双写验证数据一致性
- 按业务优先级分批次迁移
- 保留旧系统回滚能力
资源规划原则:
- 每个FE节点配置64C/256G
- BE节点磁盘使用率控制在70%以下
- 预留20%资源应对突发流量
监控体系搭建:
- 重点监控Compaction积压
- 定期检查Tablet均衡状态
- 设置查询超时熔断机制
5.2 典型问题解决方案
问题1:高峰期查询延迟突增
根因:大查询占用大量内存导致GC
解决:
SET exec_mem_limit = 8589934592; -- 限制单查询8GB内存 SET query_timeout = 30; -- 设置30秒超时问题2:数据导入出现版本冲突
根因:高频小批量导入导致版本号耗尽
解决:
ALTER TABLE ad_fact SET ("dynamic_partition.buckets" = "8"); -- 调整导入批次为5分钟/次 -- 启用批量删除的merge-on-write问题3:冷数据访问变慢
根因:自动迁移到HDD后IOPS不足
解决:
ALTER TABLE ad_fact SET ( "storage_cooldown_time" = "7 days", "storage_policy" = "SSD" );这个架构目前稳定支持日均万亿级事件处理,查询P99延迟控制在800ms以内。在实际运维中发现,定期执行ANALYZE TABLE更新统计信息,能有效避免执行计划劣化。对于广告这类时序特征明显的数据,合理设置TTL和冷热分离策略可节省30%以上的存储成本。