说一说有哪些类型的OLAP数仓?

本文探讨了数据仓库的分类,重点介绍了MOLAP(多维预计算)、ROLAP(关系型在线分析)、HOLAP(混合型)和HTAP(混合事务分析处理)的优缺点,针对不同业务场景和数据量选择。开源OLAP系统如Kylin和基于Hadoop的SQL on Hadoop是讨论的重点。

1.按数据量划分
对一件事物或一个东西基于不同角度,可以进行多种分类方式。对数仓产品也一样。偏实时的分析型数仓,Cloudera的Impala、Facebook的Presto和Pivotal的GreenPlum均属于这类系统;如果超过百亿级别数据量,那么一般选择离线数仓,如使用Hive或Spark等(SparkSQL3.0看起来性能提升很明显);对于数据量很小的情况,虽然是分析类应用,也可以直接选择普通的关系型数据库,比如MySQL等,“杀鸡焉用牛刀”。
2.按建模类型划分
下面我们主要关注数据量中等的分析型数仓,聚焦OLAP系统。根据维基百科对OLAP的介绍,一般来说OLAP根据建模方式可分为MOLAP、ROLAP和HOLAP 3种类型,下面分别进行介绍并分析优缺点。
(1)MOLAP
这应该算是最传统的数仓了,1993年Edgar F. Codd提出OLAP概念时,指的就是MOLAP数仓,M即表示多维(Multidimensional)。大多数MOLAP产品均对原始数据进行预计算得到用户可能需要的所有结果,将其存储到优化过的多维数组存储中,可以认为这就是上一篇所提到的“数据立方体”。
由于所有可能结果均已计算出来并持久化存储,查询时无需进行复杂计算,且以数组形式可以进行高效的免索引数据访问,因此用户发起的查询均能够稳定地快速响应。这些结果集是高度结构化的,可以进行压缩/编码来减少存储占用空间。
但高性能并不是没有代价的。首先,MOLAP需要进行预计算,这会花去很多时间。如果每次写入增量数据后均要进行全量预计算,显然是低效率的,因此支持仅对增量数据进行迭代计算非常重要。其次,如果业务发生需求变更,需要进行预定模型之外新的查询操作,现有的MOLAP实例就无能为力了,只能重新进行建模和预计算。

因此,MOLAP适合业务需求比较固定,数据量较大的场景。在开源软件中,由eBay开发并贡献给Apache基金会的Kylin即属于这类OLAP引擎,支持在百亿规模的数据集上进行亚秒级查询。

其架构图较直观得反映了基于cube的预计算模型(build),如下所示:

(2)ROLAP

与MOLAP相反,ROLAP无需预计算,直接在构成多维数据模型的事实表和维度表上进行计算。R即表示关系型(Relational)。显然,这种方式相比MOLAP更具可扩展性,增量数据导入后,无需进行重新计算,用户有新的查询需求时只需写好正确的SQL语句既能完成获取所需的结果。

但ROLAP的不足也很明显,尤其是在数据体量巨大的场景下,用户提交SQL后,获取查询结果所需的时间无法准确预知,可能秒回,也可能需要花费数十分钟甚至数小时。本质上,ROLAP是把MOLAP预计算所需的时间分摊到了用户的每次查询上,肯定会影响用户的查询体验。

当然ROLAP的性能是否能够接受,取决于用户查询的SQL类型,数据规模以及用户对性能的预期。对于相对简单的SQL,比如TPCH中的Query响应时间较快。但如果是复杂SQL,比如TPC-DS中的数据分析和挖掘类的Query,可能需要数分钟。

相比MOLAP,ROLAP的使用门槛更低,在完成星型或雪花型模型的构建,创建对应schema的事实表和维度表并导入数据后,用户只需会写出符合需求的SQL,就可以得到想要的结果。相比创建“数据立方体”,显然更加方便。

有分析表明,虽然ROLAP的性能比如MOLAP,但由于其灵活性、扩展性,ROLAP的使用者是MOLAP的数倍。

(3)HOLAP

MOLAP和ROLAP各有优缺点,而且是互斥的。如果能够将两者的优点进行互补,那么是个更好的选择。而HOLAP的出现就是这个目的,H表示混合型(Hybrid),这个想法很朴素直接。对于查询频繁而稳定但又耗时的那些SQL,通过预计算来提速;对于较快的查询、发生次数较少或新的查询需求,像ROLAP一样直接通过SQL操作事实表和维度表。

目前似乎没有开源的OLAP系统属于这个类型,一些大数据服务公司或互联网厂商,比如HULU有类似的产品。相信未来HOLAP可能会得到进一步发展,并获得更大规模的使用。

(4)HTAP

从另一个维度看,HTAP也算是一种OLAP类型的系统,是ROLAP的一个扩展,具备了OLAP的能力。最新发展显示,有云厂商在HTAP的基础上做了某种妥协,将T(transaction)弱化为S(Serving),朝HSAP方向演进。关于HTAP/HSAP,本文不做进一步展开,可自主查询其他资料。

主流的OLAP数仓系统很多,包含上面所述的各种类型,下图是Gartner 2019 年发布的数据分析市场排名:

图片

可以发现,传统的商业厂商和闭源的云服务厂商占据了绝大部分市场。大部分系统笔者只听过而没有研究过。作为屁股在互联网公司的数据库/数据仓库开发者,本文后续主要聚焦在基于Hadoop生态发展的开源OLAP系统(SQL on Hadoop)。

<think>嗯,用户这次明确要求聚焦在传统迁移到实时架构的挑战和解决方案上,看来ta正在面临实际的据架构升级项目。此前我提供的实时对比材料里虽然提到过迁移挑战,但ta需要更系统性的落地指导。用户可能是企业的据架构师或技术决策者,从ta连续追问架构迁移细节来看,应该不是单纯的理论研究,而是带着实施压力来的。尤其关注“如何确保据一致性”这类生产环境痛点,说明团队可能踩过实时同步的坑。迁移挑战需要从技术栈断层这个根本问题展开。传统团队擅长SQL和调度工具,但实时架构需要的流处理编程(比如FlinkDataStreamAPI)完全是新领域,这里得强调技能转化的具体路径。据一致性部分要分三层说明:端到端精确一次、流批计算逻辑对齐、以及最容易被忽视的增量建模约束——这点在银行风控场景特别关键,去年某券商就因实时交易流主键冲突导致过生产事故。技术栈转换方面,Lambda架构的维护成本是个暗礁。最近客户问诊平台迁移时就因同时维护Spark批处理和Flink流处理两套代码,结果版本升级时计算逻辑出现偏差。得给出具体的时间节点建议,比如“6个月后逐步切换Kappa架构”。组织变革那块要避免说教。不妨用电商案例说明:某跨境电商在建立实时团队时,让传统DBA和实时工程师每周交叉代码评审,三个月后双方就自然形成了共同语言。另外财务部门的阻力很典型——他们总担心实时据影响报表审计,这个必须通过埋点追踪方案解决。</think> 以下是传统库迁移到实时架构的 **7大核心挑战及解决方案**,基于金融、电商等行业的实践经验总结: --- ### 一、据一致性挑战 **问题**:传统依赖批量覆盖更新(如`T+1`全量同步),而实时流处理需处理乱序据和部分更新 **解决方案**: 1. **采用增量日志技术**:通过`CDC`工具(如Debezium)捕获据库`binlog`,避免全量扫描[^1] 2. **流处理状态管理**:在Flink中使用`RocksDB`状态后端实现精确一次处理(`Exactly-Once Semantics`) ```sql -- 创建Flink CDC源表(MySQL → Kafka) CREATE TABLE orders_cdc ( id BIGINT PRIMARY KEY, amount DECIMAL(10,2) ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'mysql-host', 'database-name' = 'prod_db', 'table-name' = 'orders' ); ``` 3. **版本化存储**:使用`Apache Iceberg`支持`ACID`事务,实现`UPSERT`操作 --- ### 二、技术栈断层 **问题**:传统团队熟悉SQL但缺乏流处理开发经验(如Flink API编程) **解决方案**: 1. **渐进式技术迁移**: | 阶段 | 技术路径 | |---|---| | 初期 | 基于`Kafka SQL`或`Flink SQL`实现简单ETL | | 中期 | 采用`Flink DataStream API`开发复杂流处理 | | 长期 | 构建`Streaming Lakehouse`(Delta Lake + Flink) | 2. **SQL化开发**:利用`Flink SQL`实现流批统一处理 ```sql -- 实时订单分析(每5秒更新) SELECT item_type, SUM(amount) OVER w AS total_amt FROM orders_cdc WINDOW w AS (PARTITION BY item_type ORDER BY proc_time RANGE INTERVAL '5' SECONDS) ``` --- ### 三、计算逻辑对齐 **问题**:同一业务指标在批处理和流处理中结果不一致(如`COUNT DISTINCT`) **解决方案**: 1. **统一计算引擎**:采用`Apache Flink`同时处理批量历史据和实时流据 2. **差异化设计**: - **维度表**:使用`Redis`缓存维表实现流表Join - **指标计算**:对高基聚合采用`HyperLogLog`等近似算法 3. **验证机制**:建立实时与离线结果比对管道,允许误差`<0.5%` --- ### 四、增量建模困难 **问题**:传统星型模型依赖全量据,实时场景需支持动态表关联 **解决方案**: 1. **CDC驱动建模**: ```mermaid graph LR A[业务库] -->|CDC| B(Kafka) B --> C{Flink SQL} C --> D[维度表: HBase] C --> E[事实表: Iceberg] ``` 2. **动态关联策略**: - **维度表**:广播小表到流计算节点 - **事实表**:通过`事件时间(Event Time)`实现有序关联 --- ### 五、资源成本激增 **问题**:实时计算需常驻进程,资源消耗是批处理的`3-5`倍 **优化手段**: 1. **动态扩缩容**:基于`Kafka`堆积量自动调整Flink并行度 2. **冷热分离存储**: | 类型 | 存储介质 | 保留策略 | |---|---|---| | 热据(7天) | `Apache Doris`内存表 | 毫秒响应 | | 温据(30天) | `ClickHouse` | 秒级响应 | | 冷据(历史) | `HDFS` + 压缩 | 分钟级查询 | --- ### 六、运维复杂度提升 **问题**:实时作业需`7×24`监控,故障恢复要求秒级响应 **关键措施**: 1. **全链路监控**: ```python # Prometheus监控指标示例 flink_task_latency{task="OrderProcessor"} > 100ms # 告警阈值 kafka_consumer_lag{topic="user_behavior"} > 10,000 # 堆积告警 ``` 2. **快速恢复机制**: - 配置`Flink Savepoint`自动备份 - 使用`Kafka`消息保留策略`≥24小时` --- ### 七、组织协作变革 **问题**:原有ETL开发、DBA、分析师团队职责需重组 **转型路径**: 1. **跨职能团队**: ``` 实时团队 = { 流处理工程师 | 实时DBA | 据质量专员 } ``` 2. **职责调整**: - 传统DBA:转向`CDC`配置与`binlog`管理 - ETL开发:转型`Flink`流水线开发 - 分析师:学习`OLAP`加速查询工具(如Doris) --- ### 成本与收益评估模型 $$ \text{ROI} = \frac{ \text{实时化带来的业务增长} - \text{迁移成本} }{ \text{年维护成本} } \times 100\% $$ **经验值**:当业务对`>30`分钟的延迟敏感时,迁移才有正向收益(如风控、物联网场景) --- **相关问题** 1. 如何验证实时中的据一致性? 2. Flink CDC在迁移中的核心作用是什么? 3. 实时如何支持历史据重加工? 4. 中小型企业如何降低实时的落地成本? 5. 实时架构下如何优化多表关联查询性能? [^1]: 引自Debezium官方文档:变更据捕获技术实现原理 [^2]: 基于阿里云实时迁移白皮书(2023)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值