湖仓一体核心技术解析,一般看不到的详细干货

SelectDB 2024-08-16 20:02:12

湖仓一体之前,数据分析经历了数据库、数据仓库和数据湖分析三个时代。

湖仓一体

首先是数据库,它是一个最基础的概念,主要负责联机事务处理,也提供基本的数据分析能力。

随着数据量的增长,出现了数据仓库,它存储的是经过清洗、加工以及建模后的高价值的数据,供业务人员进行数据分析。

数据湖的出现,主要是为了去满足企业对原始数据的存储、管理和再加工的需求。这里的需求主要包括两部分,首先要有一个低成本的存储,用于存储结构化、半结构化,甚至非结构化的数据;另外,就是希望有一套包括数据处理、数据管理以及数据治理在内的一体化解决方案。

数据仓库解决了数据快速分析的需求,数据湖解决了数据的存储和管理的需求,而湖仓一体要解决的就是如何让数据能够在数据湖和数据仓库之间进行无缝的集成和自由的流转,从而帮助用户直接利用数据仓库的能力来解决数据湖中的数据分析问题,同时又能充分利用数据湖的数据管理能力来提升数据的价值。

核心技术解析

Doris设计的湖仓一体是如何实现加速数据湖的分析能力的,以下五个核心技术是关键:

可扩展的连接框架

在数据的对接中包括元数据的对接和数据的读取。

元数据对接:元数据对接在FE完成,通过FE的MetaData管理器来实现基于HiveMetastore、JDBC和文件的元数据对接和管理工作。

数据读取:通过NativeReader可以高效的读取存放在HDFS、对象存储上的Parquet、ORC、Text格式数据。也可以通过JniConnector对接Java大数据生态。

高效缓存策略

Doris通过元数据缓存、数据缓存和查询结果缓存来提升查询性能。

元数据缓存

Doris提供了手动同步元数据、定期自动同步元数据、元数据订阅(只支持HiveMetastore)三种方式来同步数据湖的元数据信息到Doris,并将元数据存储在Doris的FE的内存中。当用户发起查询后Doris直接从内存中获取元数据并快速生成查询规划。保障了元数据的实时和高效。在元数据同步上Doris通过并发的元数据事件合并实现高效的元数据同步,其每秒可以处理100个以上的元数据事件。

高效的数据缓存

1.文件缓存:Doris通过将数据湖中的热点数据存储在本地磁盘上,减少数据扫描过程中网络数据的传输,提高数据访问的性能。

2.缓存分布策略:在数据缓存中Doris通过一致性哈希将数据分布在各个BE节点上,尽量避免节点扩缩容带来的缓存失效问题。

3.缓存淘汰(更新)策略:同时当Doris发现数据文件对应的元数据更新后,会及时淘汰缓存以保障数据的一致性。

查询结果缓存和分区缓存

查询结果缓存:Doris根据SQL语句将之前查询的结果缓存起来,当下次相同的查询再次发起时可以直接从缓存中获取数据返回到客户端,极大的提高了查询的效率和并发。

分区缓存:Doris还支持将部分分区数据缓存在BE端提升查询效率。比如查询最近7天的数据,可以将前6天的计算后的缓存结果,和当天的事实计算结果进行合并,得到最终查询结果,最大限度减少实时计算的数据量,提升查询效率。

高效的NativeReader

自研NativeReader避免数据转换:Doris在数据分析时有其自身的列存方式,同时Parquet、ORC也有自身的列存格式。如果直接使用开源的Parquet或者ORCReader的话就会存在一个Doris列存和Parquet/ORC列存的转换过程。这样的话就会多一次格式转换的开销,为了解决这个问题我们自研了一套Parquet/ORCNativeReader,直接读取Parquet、ORC文件来提高查询效率。

延迟物化:同时我们实现的NativeReader还能很好的利用智能索引和过滤器提高数据读取效率。比如说在某些场景下我可能只针对ID列去做一个过滤。我们的优化做法是首先第一步我会把ID列单独读出来。然后在这一列上做完过滤以后,我会把这个过滤后的剩余下来的这个行号记录下来。拿这个行号再去读剩下两列,这样来进一步的减少数据扫描,加速文件的分析性能。

-向量化读取数据:同时在文件数据的读取过程中我们引入向量化的方式读取数据,极大加速了数据读取效率。

MergeIO

在网络中难免会出现大量小文件的网络IO请求取影响IO性能,在这种情况下我们采用IO合并去优化这种情况。

比如我们设置一个策略将小于3MB的IO请求合并(MergeIO)在一次请求中处理。那么之前可能是有8次的小的IO请求,我们可以把8次合并成5次IO请求去去读取数据。这样减少了网络IO请求的速度,提高了网络访问数据的效率。

MergeIO的确定是它可能会读取一些不必要的数据,因为它把中间可能不必要读取的数据合并起来一块读过来了。但是从整体的吞吐上来讲其性能有很大的提高,在碎文件(比如:1KB-1MB)较多的场景优化效果很明显。同时我们通过控制MergeIO的大小来达到整体的平衡。

统计信息提高查询规划效果

Doris通过收集统计信息有助于优化器了解数据分布特性,在进行CBO(基于成本优化)时优化器会利用这些统计信息来计算谓词的选择性,并估算每个执行计划的成本。从而选择更优的计划以大幅提升查询效率。在数据湖场景我们可以通过收集外表的统计信息来提升查询规划器的效果。

统计信息的收集方式包括手动收集和自动收集。

同时为了保证收集统计信息不会对BE产生压力,我们支持了采样收集统计信息。

在一些场景下用户历史数据可能很少查找,但是热数据会被经常访问,因此我们也提供了基于分区的统计信息收集在保障热数据高效的查询效率和统计信息收集对BE产生负载的中间取得平衡。

#湖仓一体#

0 阅读:3

SelectDB

简介:基于 Apache Doris 构建面向实时分析的现代化数据仓库