业务方要“随便拖拽维度看数”——千万级数据的自助多维分析怎么支撑?
先说结论
自助多维分析两条技术路线:预计算和现场计算(MPP直查)。预计算把维度组合提前算成Cube,查询快但维度组合爆炸、灵活性差;现场计算靠MPP引擎硬算明细或轻聚合表,灵活但要控住大查询。当前主流选择是以Doris/StarRocks/ClickHouse/Hologres为代表的现场计算路线,用物化视图补预计算的确定性。
自助分析成败的另一半在数据侧:没有治理好的宽表和语义层(维度、指标、口径的统一定义),自助就是把口径混乱的成本转嫁给业务方。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
固定报表做得再多,也追不上业务方的问题清单,于是所有数据团队最终都会走到这一步:给业务方开自助分析,让他们自己拖维度、选指标。但“自助”这两个字背后全是技术账——业务方一个随手的维度组合,可能就是一个扫千万行的大查询。这道题考的是你对OLAP技术路线的理解,以及“把数据交给业务方”时的工程兜底能力。
两条技术路线的账
| 维度 | 预计算(Kylin类Cube) | 现场计算(Doris/CK/Holo) | BI内置抽取(Extract) |
|---|---|---|---|
| 查询延迟 | 亚秒,最稳定 | 亚秒~几秒,看建模 | 亚秒,但数据是快照 |
| 维度灵活性 | 差:没预算的组合查不了 | 好:任意组合现算 | 中:受抽取列限制 |
| 存储成本 | 维度爆炸时指数膨胀 | 明细+少量物化,可控 | BI侧多存一份 |
| 数据新鲜度 | 构建周期决定,T+1常见 | 分钟级可达 | 抽取周期决定 |
| 适合场景 | 维度固定的超高并发 | 绝大多数自助场景 | 小数据量部门级 |
预计算路线的致命伤是维度爆炸:20个维度的全组合是2的20次方个Cuboid,就算剪枝也扛不住业务方“再加一个维度”的日常请求。所以近几年的主流打法是:MPP引擎现算保灵活性,对其中高频的固定模式(首页看板、核心下钻路径)再用物化视图定点加速——把预计算从“全量策略”降级成“热点补丁”。
我的实践:Doris上的自助分析分层
在某元宇宙社交应用,运营的自助分析需求(按国家/房间/礼物类型/用户等级任意组合看收入和活跃)就是用Doris扛的,数据分三层:
-- 第1层:明细层(保留下钻到底的能力)
-- 事件宽表,DUPLICATE模型,按天分区,保留90天
CREATE TABLE dwd_gift_event (
event_time DATETIME, country VARCHAR(32),
room_id BIGINT, gift_type VARCHAR(32),
user_level INT, gift_amount DECIMAL(18,2)
) DUPLICATE KEY(event_time)
PARTITION BY RANGE(event_time)()
DISTRIBUTED BY HASH(room_id) BUCKETS 32;
-- 第2层:聚合层(自助拖拽主战场)
-- 天×核心维度的AGGREGATE表,行数是明细的千分之一
-- 第3层:物化视图(热点模式定点加速)
CREATE MATERIALIZED VIEW mv_country_day AS
SELECT country, DATE(event_time), SUM(gift_amount)
FROM dwd_gift_event GROUP BY country, DATE(event_time);
-- 查询自动路由:命中物化走物化,没命中回聚合层/明细层
BI侧配置默认查聚合层,只有点“查看明细”才穿透到明细层。运营感知到的是“什么都能拖”,引擎侧其实90%的查询落在千分之一行数的聚合层上——自助分析的性能秘诀不在引擎多强,在于让大多数查询根本碰不到明细。
语义层:自助不等于放羊
技术层搞定后,更难的是口径问题:业务方自己拖出来的数,和正式报表对不上怎么办?答案是语义层收口——在BI里把数据集的维度、指标、聚合方式、口径描述全部预定义好,业务方只能在定义好的积木上组合,不能自己写表达式、自己选聚合方式。
# BI数据集(语义层)的配置规范——我们团队的checklist
1. 指标必须绑定聚合方式:金额=SUM,去重人数=禁止SUM(配bitmap或穿透)
2. 指标描述必须引用指标字典编码,口径鼠标悬停可见
3. 维度值做映射治理:country统一ISO码,不出现 US/us/USA 三份
4. 时间维度绑定日期维表:周、月、同环比口径全局一致
5. 默认过滤内置:测试流量、内部账号在数据集层面就剔掉
6. 敏感字段(成本、毛利)按角色行列级权限控制
# 原则:业务方的每一次拖拽,都在治理过的轨道上跑
第5条特别值得强调:把“剔除测试流量”这类全局过滤做在数据集层面,而不是指望业务方每次记得勾选——防呆永远比培训有效。这些规范一半来自我们在硬件品牌做埋点治理的教训:源头不治理,下游全遭殃。
面试高频追问
追问一:业务方拖了个大查询把集群打挂了怎么办?
事前、事中、事后三道机制。事前:BI层强制默认时间范围(近30天)、限制单次返回行数、高基数维度组合(比如用户ID×分钟)直接禁止配置出来。事中:引擎侧开启查询队列和资源组隔离,最坏情况是自助查询排队或被杀,核心报表不受影响:
-- Doris资源隔离:自助分析和核心看板分灶吃饭
CREATE WORKLOAD GROUP selfservice PROPERTIES (
'cpu_share' = '20', -- 自助查询最多占20%CPU
'memory_limit' = '30%', -- 内存上限
'max_concurrency' = '10', -- 并发上限,超出排队
'query_timeout' = '60' -- 60秒强制超时
);
-- 核心看板走独立的 core_report 组,cpu_share=60
-- 自助用户绑定到selfservice组:最坏是自己排队,拖不垮别人
事后:慢查询日志每周review,高频慢模式要么建物化视图加速,要么找到那个用户聊聊他真正想要什么——经常发现他其实需要的是一张固定报表。
追问二:自助分析出的数和正式报表不一致,业务方拿着质问你,怎么办?
先按第1篇的套路排查差异原因,但更重要的是制度定位:我们对外明确“自助分析结果用于探索参考,正式对外数字以口径报表为准”,这句话写在自助平台首页。技术上尽最大努力让两边一致(语义层和报表同源、同一套出数层),但自助的自由度决定了总有边界情况(业务方自己加了个过滤器忘了),所以必须有“谁是最终口径”的裁决规则。这和实时vs离线“谁是终审”是同一个治理思想。
追问三:怎么衡量自助分析做得成不成功?
我看三个数:自助查询的周活跃用户数和查询量(有没有人真用)、数据团队临时取数需求量的变化(有没有真分流——我们当时目标就是把第3篇里说的临时取数压下去)、自助查询的P95延迟和失败率(体验守不守得住)。还有一个反直觉的指标:自助平台上被创建后30天无访问的看板比例——太高说明业务方在“创建即弃用”,往往是易用性或数据可信度出了问题,要回访解决。
实战踩坑:给了明细权限,一周后集群天天卡
在元宇宙社交应用刚开自助分析时,我犯过“过度慷慨”的错误:为了显得诚意足,直接把90天明细表开放给了运营团队拖拽。第一周相安无事,第二周开始集群每天下午卡顿——排查慢查询日志发现,有运营配了个“按用户ID看90天送礼明细”的表格图,每次打开扫几亿行,而且这个看板被设成了团队首页,每个人打开BI就触发一次。更糟的是他们还开了5分钟自动刷新。当时的临时处置是杀查询+下线那个看板,长期修复就是上面那套分层:默认聚合层、明细穿透要申请、强制时间范围、查询队列隔离。事后复盘,责任其实在我——把没有护栏的能力交给不了解成本的人,出事是必然的。
教训:自助分析的产品设计里,“默认值”就是治理工具:默认查聚合层、默认近30天、默认不自动刷新。业务方不会读文档,但一定会用默认值。
总结
自助多维分析的方案=MPP现场计算路线(Doris/StarRocks/CK/Holo)+分层数据(明细/聚合/物化视图,让90%查询碰不到明细)+语义层收口(指标绑定聚合方式、全局过滤内置、口径可见)+资源护栏(默认值、行数上限、查询队列隔离)。面试时把“预计算vs现场计算”的路线取舍讲清楚,再补一个把集群拖挂的踩坑故事,深度和实战感就都有了。
下一篇聊让所有报表人头皮发麻的活儿:报表和业务系统的数差了3%,财务要个说法——跨系统对账怎么做?
你们开自助分析了吗?业务方最离谱的一次拖拽是什么?评论区聊聊~
关注「Wood聊大数据」| 9年大数据老兵,聊技术、聊职场、聊成长