数据仓库(英语:Data Warehouse,简称数仓、DW),是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境,分析结果为企业提供决策支持(Decision Support)。
数据仓库的特点是本身不生产数据,也不最终消费数据。
每个企业根据自己的业务需求可以分成不同的层次。但是最基础的分层思想,理论上分为三个层:操作型数据层(ODS)、数据仓库层(DW)和数据应用层(DA)。
数据湖(Data Lake)和数据库、数据仓库一样,都是数据存储的设计模式,现在企业的数据仓库都会通过分层的方式将数据存储在文件夹、文件中。数据湖是一个集中式数据存储库,用来存储大量的原始数据,使用平面架构来存储数据。
数据湖的主要思想是对企业中的所有数据进行统一存储,数据湖的就是原始数据保存区,从原始数据(源系统数据的精确副本)转换为用于报告、可视化、分析和机器学习等各种任务的目标数据。数据湖中的数据包括结构化数据(关系数据库数据),半结构化数据(CSV、XML、JSON等),非结构化数据(电子邮件,文档,PDF)和二进制数据(图像、音频、视频),从而形成一个容纳所有形式数据的集中式数据存储。
国内一般把整个HDFS叫做数据仓库(广义),即存放所有数据的地方,而国外一般叫数据湖(data lake)
数据湖并不能替代数据仓库,数据仓库在高效的报表和可视化分析中仍有优势。
Data Lakehouse(湖仓一体)是新出现的一种数据架构,它同时吸收了数据仓库和数据湖的优势,数据分析师和数据科学家可以在同一个数据存储中对数据进行操作,同时它也能为公司进行数据治理带来更多的便利性。
LakeHouse使用新的系统设计:直接在用于数据湖的低成本存储上实现与数据仓库中类似的数据结构和数据管理功能。
湖仓一体LakeHouse:是一种结合数据湖和数据仓库优势的新范式,从根本上简化企业数据基础架构,并且有望在机器学习已渗透到每个行业的时代加速创新。
目前市面上流行的三大开源数据湖方案分别为:Delta Lake、Apache Iceberg和Apache Hudi。
DeltaLake是一个致力于在数据湖之上构建湖仓一体架构的开源项目。DeltaLake支持ACID事务,可扩展的元数据存储,在现有的数据湖(S3、ADLS、GCS、HDFS)之上实现流批数据处理的统一。
由于出自Databricks,Spark的所有数据写入方式,包括基于dataframe的批式、流式,以及SQL的Insert、Insert Overwrite等都是支持的(开源的SQL写暂不支持,EMR做了支持)。
在数据写入方面,Delta 与 Spark 是强绑定的;在查询方面,开源 Delta 目前支持 Spark 与 Presto,但是,Spark 是不可或缺的,因为 delta log 的处理需要用到 Spark。
Iceberg是一个用于处理海量分析数据集的开放表格式,是专门为对象存储(如S3)而设计的,支持 Spark, Trino, PrestoDB, Flink and Hive等计算引擎,操作Iceberg如SQL table一样。官网:https://iceberg.apache.org/
由 Netflix 开发开源的,其于 2018年11月16日进入 Apache 孵化器,是 Netflix 公司数据仓库基础。
一种可伸缩的表存储格式,允许在一个文件里面修改或者过滤数据,多个文件也支持,内置了许多最佳实践。
在查询方面,Iceberg 支持 Spark、Presto,提供了建表的 API,用户可以使用该 API 指定表明、schema、partition 信息等,然后在 Hive catalog 中完成建表。
Apache Hudi(Hadoop Upserts Delete and Incremental)是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发,同时保持数据的开源文件格式。
Apache Hudi不仅非常适合于流工作负载,而且还允许创建高效的增量批处理管道。
Apache Hudi可以轻松地在任何云存储平台上使用。Hudi的高级性能优化,使分析工作负载更快的任何流行的查询引擎,包括Apache Spark、Flink、Presto、Trino、Hive等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6TXNGWno-1676288779897)(http://image.codekiller.top/img/Hudi/image-20230112180356519.png)]
强调其主要支持Upserts、Deletes和Incrementa数据处理,支持三种数据写入方式:UPSERT,INSERT 和 BULK_INSERT。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tvzLIBtJ-1676288779897)(http://image.codekiller.top/img/Hudi/image-20230112180429202.png)]
对比项 | DeltaLake | Apache Hudi | Apache Iceberg |
---|---|---|---|
update/delete | Yes | Yes | Yes |
文件合并 | Manually | Automatic | Manually |
历史数据清理 | Automatic | Automatic | Manually |
文件格式 | parquet | parquet and avro | Parquet,avro,orc |
计算引擎 | Hive/Spark/Presto | Hive/Spark/Presto/Flink | Hive/Spark/Presto/Flink |
存储引擎 | HDFS/S3/Azure | HDFS/S3/OBS/ALLUXIO/Azure | HDFS/S3 |
SQL DML | Yes | Yes | Yes |
ACID transaction | Yes | Yes | Yes |
TimeLine | Yes | Yes | Yes |
索引 | No | Yes | No |
可扩展的元数据存储 | Yes | Yes | Yes |
Schema约束和演化 | Yes | Yes | Yes |
TimeLine
意思时间线,用于支持时间旅行(Time travel)。即根据用户的提供的时间戳,可以访问到历史某一事件点的数据快照。只要数据快照没有被清理掉,就可以被访问到。
Schema约束和演化
相同点:
不同点: