登录
主页
Apache Doris与Apache Kylin聚合结果高效存储原理
2026-04-02
  
986
深数据
Apache Doris 与 Apache Kylin 作为主流 OLAP 引擎,均针对多维数据聚合结果的高效存储做了深度优化,但二者基于自身架构定位(Doris 实时交互式、Kylin 预计算加速),采用了完全不同的存储逻辑。核心差异在于“实时聚合+轻量化存储”与“预计算 Cube+高并发适配存储”的路径区分,以下分别拆解其底层原理。
一、Apache Doris存储原理
Apache Doris 针对多维聚合结果的存储,核心围绕“聚合模型预聚合+列式存储优化+分层压缩+轻量化架构”展开,兼顾实时性与存储效率,无需依赖外部生态,实现聚合结果的高效读写与低冗余存储,其核心原理可分为4个关键层面。
(一)核心前提:聚合模型的预聚合机制(从源头减少数据量)
Doris 提供专门的聚合模型(Aggregate Key Model),这是其聚合结果高效存储的基础,核心逻辑是“写入即聚合”,从数据导入阶段就减少冗余数据,避免无效存储开销。具体而言,Doris 聚合模型会预先定义聚合键(维度字段)和度量字段(聚合指标,如求和、计数、平均值等),当数据导入时,会自动对相同聚合键的记录进行初步聚合,将同一维度组合的多条明细数据合并为一条聚合记录,仅保留聚合后的度量结果,而非存储全部明细数据。
例如,电商场景中“地区、商品品类、日期”作为聚合键,“销售额、订单数”作为度量,导入数据时,相同地区、品类、日期的多条销售记录会被即时聚合,仅存储一条聚合结果,从源头减少了存储数据量,同时为后续查询省去实时聚合的开销。此外,聚合模型支持多版本管理,每批次导入的数据会形成一个独立版本,后台通过 Compaction 机制定期合并多版本文件,进一步消除冗余,优化存储结构与查询效率。
(二)存储架构:列式存储+分区分桶,适配多维聚合查询
Doris 采用 MPP 架构,聚合结果存储依赖 FE(前端节点)与 BE(后端节点)的协同,核心存储载体为 BE 节点的列式存储引擎,结合分区分桶策略,实现聚合结果的高效组织与快速检索。
1.列式存储优化:聚合结果按列存储,而非传统的行存储——多维聚合的维度字段和度量字段分别归为不同列组,存储时按列进行编码、压缩和读取。这种方式的优势的在于,多维查询时只需扫描与查询维度、度量相关的列,无需扫描整个行数据,大幅减少 IO 开销;同时,列式存储更易实现同列数据的相似性压缩,尤其是聚合后的度量字段(如销售额、订单数),数据分布相对集中,压缩比更高,进一步降低存储成本。此外,Doris 对列数据进行了精细的编码优化,针对维度列(如地区、日期)采用字典编码、位图编码,针对度量列(如数值型聚合结果)采用 RLE 编码、Delta 编码,通过编码进一步减少数据存储空间,同时提升查询时的解码效率。
2.分区分桶策略:聚合结果会按用户定义的规则进行分区(如按日期分区)和分桶(如按聚合键哈希分桶),实现数据的分层分片存储。分区层面,可将不同时间范围、不同业务维度的聚合结果拆分到不同分区,查询时可通过分区过滤快速定位目标数据,避免全表扫描;分桶层面,将同一分区内的聚合结果按聚合键哈希分配到不同 BE 节点,实现数据的负载均衡,同时支持并行查询,提升多维聚合查询的响应速度。例如,按日期分区存储电商每日的聚合销售额,查询某一周的聚合数据时,仅需扫描对应7个分区,无需遍历全部数据,大幅提升查询效率。
(三)压缩策略:分层压缩+自适应优化,平衡存储与性能
Doris 针对聚合结果的不同数据类型(维度列、度量列),采用分层压缩策略,既保证高压缩比以节省存储,又避免过度压缩导致查询解码开销过大,实现存储效率与查询性能的平衡。
具体而言,Doris 将聚合结果的存储分为内存层、磁盘层,采用不同的压缩方案:内存层(用于缓存热点聚合结果)采用轻量级压缩算法(如 LZ4),兼顾压缩速度与解码效率,确保热点多维查询的快速响应;磁盘层(用于持久化存储所有聚合结果)采用高压缩比算法(如 ZSTD、Snappy),针对不同列类型自适应选择压缩算法——维度列(字符串、枚举型)侧重高压缩比,采用 ZSTD 算法,可将重复度高的维度数据压缩至原大小的10%-30%;度量列(数值型)侧重压缩与解码速度的平衡,采用 Snappy 或 LZ4 算法,确保聚合查询时的解码效率。
此外,Doris 支持压缩级别自适应调整,根据聚合结果的数据量、查询频率动态调整压缩级别:对于查询频繁的热点聚合数据,采用低级别压缩,优先保证查询性能;对于查询频率低的冷数据,采用高级别压缩,最大化节省存储空间。
(四)轻量化架构:无外部依赖,减少存储冗余
Doris 采用独立的 MPP 架构,无需依赖 Hadoop、HBase 等外部组件,聚合结果直接存储在 BE 节点的本地磁盘(或分布式存储),避免了跨组件数据传输与存储冗余。与 Kylin 依赖 Hadoop 生态的存储模式不同,Doris 的聚合结果存储无需额外维护 HDFS、HBase 等组件的存储开销,也无需进行数据在多组件间的复制与同步,从架构层面减少了存储冗余和运维成本。
同时,Doris 采用“计算与存储一体化”设计,BE 节点既负责聚合结果的存储,也负责查询时的聚合计算,避免了数据在存储节点与计算节点之间的频繁传输,进一步提升多维聚合查询的效率,同时减少了因数据传输带来的额外存储开销。
二、Apache Kylin存储原理
Apache Kylin 针对多维聚合结果的存储,核心围绕“预计算 Cube+Cube 优化+HBase 分布式存储”展开,核心目标是适配超高并发的固定维度查询,通过预计算将多维聚合结果提前存储,牺牲部分存储灵活性,换取极致的查询响应速度,其核心原理可分为4个关键层面。
(一)核心前提:预计算 Cube 与 Cuboid 裁剪(控制存储规模)
Kylin 的核心是“预计算 Cube”,即提前计算出所有可能的维度组合(Cuboid)的聚合结果,将多维聚合的计算压力转移到数据导入阶段,查询时仅需读取预计算好的聚合结果,无需实时计算。但多维维度组合会产生“维度爆炸”问题(N 个维度可产生 2^N 个 Cuboid),若不加以优化,会导致存储量急剧膨胀,因此 Kylin 通过 Cuboid 裁剪技术,从源头控制存储规模,实现聚合结果的高效存储。
具体而言,Kylin 提供多种 Cuboid 裁剪策略,过滤无效或非必要的维度组合:一是通过“维度层级裁剪”,根据业务场景定义维度的层级关系(如“省份→城市→区县”),仅保留有业务意义的维度组合,过滤无意义的跨层级组合;二是通过“聚合组裁剪”,将维度划分为多个聚合组,每个聚合组内的维度可自由组合,聚合组之间不进行跨组组合,大幅减少 Cuboid 数量;三是通过“必要维度/可选维度设置”,指定核心维度(必须包含在 Cuboid 中)和可选维度(可根据需求选择是否包含),进一步筛选有用的 Cuboid。
例如,若有“日期、地区、商品品类、渠道”4个维度,通过聚合组裁剪将“日期、地区”划分为一个聚合组,“商品品类、渠道”划分为另一个聚合组,可将 Cuboid 数量从 16 个(2^4)减少至 9 个(3+3+3),有效控制存储膨胀,同时不影响核心业务查询。
(二)存储载体:HBase 分布式存储,适配高并发查询
Kylin 的聚合结果(Cube)最终存储在 HBase 中,依托 HBase 的分布式架构、高并发读写能力、rowkey 索引优化,实现多维聚合结果的高效存储与快速检索,这是 Kylin 适配万级 QPS 高并发查询的核心支撑。
核心设计逻辑如下:一是将每个 Cuboid 的聚合结果映射为 HBase 的一行数据,Cuboid 的维度组合作为 HBase 的 rowkey(通过编码优化,确保维度组合的唯一性和有序性),聚合后的度量结果作为 HBase 的列簇数据;二是 HBase 的 rowkey 支持有序存储和前缀索引,多维查询时,可通过 rowkey 前缀匹配快速定位目标 Cuboid 的聚合结果,无需全表扫描,大幅提升查询效率;三是 HBase 采用分布式分片存储,将不同 Cuboid 的聚合结果分布到不同 RegionServer,实现负载均衡,支持高并发查询请求的并行处理。
此外,Kylin 对 HBase 的存储结构进行了优化,将相同维度类型的 Cuboid 分配到相同的 Region,减少跨 Region 的查询开销;同时,针对度量字段采用列簇压缩存储,结合 HBase 的压缩机制(如 Snappy、LZO),进一步降低存储成本。
(三)Cube 存储优化:编码与分区,提升存储与查询效率
除了 Cuboid 裁剪和 HBase 存储适配,Kylin 还通过维度编码、Cube 分区等优化手段,进一步提升聚合结果的存储效率和查询性能。
1.维度编码优化:Kylin 对 Cuboid 的维度字段进行统一编码,将字符串、日期等维度值转换为整数编码(如字典编码、整数映射),减少 rowkey 的长度,降低 HBase 的存储开销,同时提升 rowkey 的排序和检索效率。例如,将“北京、上海、广州”等地区维度值映射为 1、2、3 等整数,可将 rowkey 长度缩短 50% 以上,大幅提升存储效率和查询时的 rowkey 匹配速度。
2.Cube 分区策略:Kylin 支持按时间维度对 Cube 进行分区(如按天、按月分区),将不同时间范围的聚合结果存储在不同的 HBase 表或 Region 中,查询时可通过时间分区过滤快速定位目标数据,避免扫描全部 Cube 数据。同时,分区支持增量更新,当新增数据时,仅需重新计算对应分区的 Cuboid,无需重建整个 Cube,减少计算和存储开销。
(四)缓存与复用:多级缓存,提升热点查询效率
Kylin 针对高频访问的聚合结果,采用多级缓存策略,减少对 HBase 磁盘的访问,进一步提升查询响应速度,同时间接降低存储的 IO 压力。具体而言,Kylin 提供三级缓存:一是内存缓存(Query Cache),将最近查询过的聚合结果缓存到 Kylin 服务端的内存中,相同查询可直接从内存返回,响应时间达到毫秒级;二是 HBase 块缓存(Block Cache),将高频访问的 Cuboid 数据块缓存到 HBase RegionServer 的内存中,减少磁盘 IO 开销;三是本地磁盘缓存,将热点 Cube 的聚合结果缓存到 Kylin 客户端的本地磁盘,适合离线查询场景。
此外,Kylin 支持 Cube 复用,当多个业务查询的维度组合一致时,可复用同一个 Cuboid 的聚合结果,无需重复存储和计算,进一步减少存储冗余,提升资源利用率。
三、两者核心差异总结
Apache Doris 与 Apache Kylin 聚合结果的高效存储原理,本质是由其架构定位决定的,核心差异可概括为“实时灵活型存储”与“预计算高并发型存储”的区别,具体对比如下:
1.存储核心逻辑:Doris 是“写入即聚合+实时存储”,无需预计算所有维度组合,存储的是动态聚合后的结果,兼顾灵活性与存储效率;Kylin 是“预计算 Cube+持久化存储”,提前计算所有必要维度组合,存储的是固定 Cuboid 的聚合结果,牺牲灵活性换取高并发查询性能。
2.存储载体与架构:Doris 独立部署,聚合结果存储在本地磁盘/分布式存储,无外部依赖,架构轻量化;Kylin 依赖 Hadoop 生态,聚合结果存储在 HBase,依托分布式架构实现高并发支撑。
3.存储优化重点:Doris 侧重列式存储、分层压缩、分区分桶,优化目标是平衡存储成本、实时性与查询灵活性;Kylin 侧重 Cuboid 裁剪、维度编码、HBase 适配,优化目标是控制存储膨胀、提升高并发查询效率。
4.存储冗余与开销:Doris 存储冗余低,无维度爆炸问题,运维成本低;Kylin 存在一定存储冗余(Cuboid 组合),依赖 Hadoop 生态,运维成本较高。
点赞数:3
© 2021 - 现在 杭州极深数据有限公司 版权所有 (深数据® DEEPDATA® 极深®) 联系我们 
浙公网安备 33018302001059号  浙ICP备18026513号-1号