企业在数据驱动的道路上,始终面临一对核心矛盾:既需要低成本、可扩展的存储方案来承载海量结构化、半结构化乃至非结构化数据(这正是数据湖的强项),又渴望实时、低延迟的分析能力来支撑业务决策(这是分析型数据库的核心优势)。
然而现实是,单独的解决方案往往难以两全:以 Apache Paimon 为代表的数据湖技术,虽凭借开放格式、弹性扩展和低成本存储成为企业数据中台的基石,但在低延迟响应上存在天然短板;而以 Apache Doris 为代表的分析型数据库,虽能提供高效的查询性能,却缺乏数据湖的存储灵活性与开放性。
本文的核心观点是:“架起数据库与数据湖的桥梁” 并非趋势,而是破局的关键。小米通过将 Apache Doris(数据库)与 Apache Paimon(数据湖)深度融合,不仅解决了数据湖分析的性能瓶颈,更实现了 “1+1>2” 的协同效应。
“桥接数据库与数据湖”的核心价值,在于构建“存储灵活、计算高效、格式协同”的一体化架构——不仅是存储与计算能力的分工互补,更包含数据格式层面的深度协同,让两者的技术特性形成叠加效应。
1. 数据湖仓的分工定位
从基础能力来看,两者的分工已形成天然互补:
2. 数据格式的特性互补
更深层的协同点,在于数据格式的特性互补:
3. 桥接架构的双向赋能
桥接架构下,数据湖仓可实现双向赋能:
这种模式既避免了单一数据湖格式在查询性能上的瓶颈,又解决了单一数据库格式在存储成本与扩展性上的局限。唯有通过“桥接”,才能让数据湖的通用存储优势与数据库的高效格式特性形成合力,实现“存储成本可控、查询性能最优”的理想状态。
Apache Paimon 是一款优秀的开放数据湖格式,其流批一体的设计很好的满足了湖上数据的实时处理需求。
Doris 在 2.1 版本开始支持 Paimon Catalog,可以直接访问 Paimon 数据并加速 Paimon 数据分析。在 Paimon TPC-DS 1TB 测试集上,Doris 的总体查询性能是 Trino 的 5 倍。
从 2.1 版本到 3.0、3.1 版本,Doris 在持续针对 Paimon 格式进行功能更新和性能增强,包括但不限于以下功能:
在本文中,我们将重点介绍小米如何基于 Doris + Paimon 构建统一湖仓平台,以及在项目开发过程中的功能贡献和优化思路。
作为一家业务覆盖汽车、IoT、手机、互联网服务等多个领域的大型企业,小米集团对 OLAP 系统和湖仓平台提出了如下关键需求:
尽管已有较成熟的数据平台体系,但小米的 OLAP 湖仓架构长期存在如下“繁杂、割裂”的结构问题:
这些问题不仅增加了平台负担,也制约了 OLAP 架构在大规模实时应用场景下的稳定性和扩展性。
为应对上述挑战,小米构建了基于 Apache Doris + Apache Paimon 的统一湖仓一体化架构,作为未来 OLAP 平台的核心形态。
通过这一架构转型,极大地简化了系统架构:
小米在引入 Apache Paimon 构建湖仓平台后,虽解决了海量数据的存储问题,却在实际业务中遭遇了三大关键瓶颈,直接影响了数据价值的释放:
这些问题并非单纯的技术瑕疵 —— 它们直接拖慢了业务决策速度,同时因资源浪费和低效运行增加了企业成本。
针对上述瓶颈,小米通过深度整合 Apache Doris 与 Apache Paimon 的特性,打造了三大 “桥接” 方案,实现了从 “问题” 到 “解决方案” 的精准突破。
Doris 本身拥有强大的数据聚合计算能力,同时支持 Aggregate Key 聚合表模型,该模型在应用场景上和 Paimon 聚合表非常类似,因此可以作为 Paimon 聚合表很好的补充。
针对原先 Doris 读取 Paimon 聚合表性能不足的问题,小米采用了将文件合并与排序逻辑 “上移” 至 Doris 的查询引擎的方案,利用 Doris 的分布式并行计算与向量化执行能力,替代 Paimon SDK 的单线程处理模式。具体而言:
经过此方案改造,聚合表的查询时长从 40 秒缩短至 8 秒,性能提升近 5 倍。
Doris 支持 Paimon、Iceberg 等数据湖表格式的异步物化视图构建,并且支持分区级别的增量物化视图刷新与查询透明改写。物化视图作为数据库与数据湖的直接桥梁,对查询加速起到了至关重要的作用。
为了进一步提高物化视图的时效性,并降低物化视图的更新开销。小米进一步研发了基于快照级别的物化视图增量刷新能力,并且贡献到了 Apache Doris 社区。
首先,小米开发了 Paimon 表的快照级别的增量读取能力,如:
SELECT * FROM paimon_table@incr('startSnapshotId'='0', 'endSnapshotId'='5')
该功能可以仅读取指定 snapshot 区间的增量数据。
基于该功能,小米进一步开发了基于快照级别的增量物化视图功能:
CREATE TABLE paimon_aggregate_table (
dt bigint,
k1 bigint
k2 string,
v1 int,
v2 double
)
USING paimon
PARTITIONED BY (dt)
TBLPROPERTIES (
'bucket' = '2',
'bucket-key' = 'k1,k2',
'fields.v1.aggregate-function' = 'sum',
'fields.v2.aggregate-function' = 'max',
'merge-engine' = 'aggregation',
'primary-key' = 'dt,k1,k2'
);
CREATE MATERIALIZED VIEW paimon_aggregate_table_mv
BUILD DEFERRED
REFRESH INCREMENTAL
PARTITION BY (dt)
DISTRIBUTED BY RANDOM BUCKETS 2
AS
SELECT dt, k1, SUM(a1) AS a1
FROM paimon_aggregate_table
GROUP BY dt, k1;
Doris 的异步物化视图框架会在后台定时执行如下语句:
INSERT INTO paimon_aggregate_table_mv
SELECT dt, k1, SUM(a1) AS a1
paimon_aggregate_table@INCR('startSnapshotId'='1', 'endSnapshotId'='2')
GROUP BY dt, k1;
利用快照读取功能和 Doris 聚合功能,准实时的更新物化视图,避免全量计算。
通过此方案,更新成本显著降低,数据时效性大幅提升,且得益于 Doris 优化的 SQL 透明改写能力,用户无需修改 SQL 即可自动享受物化视图的加速效果。
针对 HDFS 读取延时不稳定的问题,小米采用了如下两方面措施:
1. HDFS 快速超时与重试
dfs.client.socket-timeout
控制,默认是 60 秒。这导致首次读取的超时时间过长,在 HDFS 抖动或负载较高的情况下,会导致查询延迟显著增加。我们通过将该阈值降低到 100 毫秒,让读取情况进行快速的超时重试,显著降低了查询长尾,P99 性能提升 1 倍,总体性能提升 10%。2. Doris 数据缓存
小米在 Apache Doris 和 Paimon 上的深度融合实践,是典型的数据库与数据湖的互补增效的体现。在这些实践下,小米在湖仓数据分析场景下获得了可观的业务收益:
目前,这些能力已经全部回馈到了 Apache Doris 社区。
在未来,小米将继续探索和拓展 Apache Doris 在数据湖仓上的能力和场景,包括:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。