Delta Lake基础介绍(商业版)
简介:介绍 Lakehouse 搜索引擎的设计思想,探讨其如何使用缓存,辅助数据结构,存储格式,动态文件剪枝,以及 vectorized execution 达到优越的处理性能。
作者:李洁杏,Databrick资深软件工程师
一、Lakehouse搜索引擎设计背景
1. 数据仓库和Lakehouse
数据管理系统从早期的数据仓库(Data Warehouse),已经发展到今天的Lakehouse。Lakehouse可以同时存储结构化、半结构化和非结构化数据,并且支持流分析、BI、数据科学和机器分析的场景。
2. Lakehouse在查询性能上的挑战
数据仓库架构可以完全控制数据的存储和查询,因此可以同时设计查询系统,以及适应查询系统的数据存储结构,以达到优越的查询性能;
而在Lakehouse架构下,数据是用开放存储结构存储的,如Parquet格式,以便更多系统可以便捷的访问数据,但是开放的存储格式并不一定适合查询操作,查询系统也没有足够的统计数据来实现高效查询。
那么,Lakehouse如何以开放的存储格式达到高效的查询性能?
3. 解决方案
为解决以上的问题,Databricks Lakehouse设计了新的搜索引擎,其SQL性能在Data Lake存储系统和文件格式方面都有出色的表现。
其SQL性能优化是通过以下技术实现的:
a. 高速缓存:将热数据放入高速缓存中;
b. 建立辅助数据结构:如收集统计数据、建立索引;
c. 数据布局优化:以实现最小化I/O;
d. 动态文件剪枝:以实现最小化I/O。
二、Lakehouse中的SQL性能优化技术
1. 高速缓存
大部分的工作负载,一般都会集中访问某些“热”数据上,Data Warehouse经常使用SSD和内存作为缓存来加速热数据的查询。
Lakehouse可以使用与数据仓库相同的优化数据结构对其进行缓存,提高查询性能。
如图所示,在Databricks中用SSD作为缓存,可以将数据读取速度提高3倍以上;采用Delta引擎作为缓存,则可以将数据读取速度提高7倍以上。
2. 建立辅助数据结构
即使数据是用Parquet格式存储的,也可以建立很多额外的数据结构来加快查询,同时对这些额外的数据进行事务性的维护。
示例一:Parquet文件中的Data Skipping
在Parquet文件中,维护表中每个数据文件的最小/最大值统计信息,有助于在查询发生时可以跳过一些无关的数据。
如下图,如果查询条件是year=2020和uid=24000,利用最小/最大统计信息,可知这个查询的信息只会存在于file3,因此可以跳过file1和file2的读取。
示例二:在Parquet文件上建立索引
如下图,如果查询条件是type=“DELETE_ACCOUT”,可以利用在type上建立的索引直接跳到对应的数据上,从而避免读取无关数据。
示例三:Parquet文件上建立Bloom Filter
可以为每一个文件建立Bloom Filter,Bloom Filter可以快速判断表文件中是否包含需要查询的数据,如果不包含则快速跳过该文件,从而减少扫描数据量,提升查询性能。
Bloom Filter原理:
Bloom Filter对每个文件中的数据记录使用1个或多个哈希表计算其哈希值,其起始值都为0,当有哈希值映射在对应的位置时则为1,这样在查询的时候,可以跳过值为0的位置;也有可能的情况是,对应的位全部都为1,这时候数据也有可能不在这个文件中(假阳性),可以通过控制使用哈希函数的个数以及Bloom Filter的大小,来控制假阳性率。
3. 数据布局
a. 小文件问题
在Delta Lake中频繁执行MERGE,UPDATE,INSERT操作,可能会产生大量的小文件。大量的小文件,一方面会降低系统读取性能,同时也会提高元数据操作的开销。
Lakehouse中使用了不同的技术来减少小文件的产生:
- 优化Delta表写入
如下图所示,在开源版Spark中,每个executor向partition中写入数据时,都会创建一个表文件进行写入,最终会导致一个partition中产生很多的小文件。
Databricks对Delta表的写入过程进行了优化,对每个partition使用一个专门的executor来合并其它executor对该partition的写入,从而避免了小文件的产生。
- 自动合并小文件
在每次向Delta表中写入数据之后,会检查Delta表中的表文件数量,如果Delta表中的小文件(size < 128MB则视为小文件)数量达到阈值,则会执行一次小文件合并,将Delta表中的小文件合并为一个新的大文件。
- 手动合并小文件
除了自动合并,Databricks还提供Opitmize命令,使用户可以手动合并小文件,优化表结构,使得表文件的结构更加紧凑。
b. 查询时间问题
查询运行时间主要取决于访问的数据量,即使使用Parquet格式,也可以通过优化表内的数据布局以减少运行时间。
- 表文件数据排序
将表文件存储数据排序,在每个表文件中存储一定量的数据,如下图中file1存储uid=0...1000,file2存储uid=1001...2000,这样在查询时就可以根据需要跳过无关的表文件,减少文件扫描数量。
- Z-Ordering优化
在实际查询中,有些查询需要看colomn1在某个范围内的数据,有些查询需要看colomn2在某个范围内的数据,或者更多,这时候仅仅对colomn1进行排序显然是不够的。
Z-Ordering可以在多个维度上(如下图的col 1-4)将关联的信息存储到同一组文件中,来减少不必要的文件读取。
4. 动态文件剪枝(Dynamic File Pruning,DFP)
动态文件剪枝简称DFP,我们以下面一个简单的查询为例:
SELECT sum(ss_quantity)
FROM store_sales
JOIN item ON ss_item_sk = i_item_sk
WHERE i_item_id =‘AAAAAAAAICAAAAAA'
查询说明:将store_sales与item两个表连起来,条件是当item_sk值相等且item_id等于一个固定值。
未启用DFP
如果不开启DFP,从上图可以看出,查询会先对store_sales进行全表扫描,然后再和过滤后的item表的行进行join,虽然结果仅有4.6万多条数据,但却扫描了表store_sales中的86多亿条数据。
启用DFP
在启用DFP之后,会先扫描item表,查询出表item中i_item_id = ‘AAAAAAAAICAAAAAA'数据行,然后将这些数据行的i_item_sk值作为表store_sales的ss_item_sk的查询条件,在表store_sales的SCAN阶段进行过滤,跳过大量无关数据。这样仅扫描了660多万条store_sales中的数据,比未启用DFP时减少了近99%。
从结果上看,启动DFP后,该条查询实现了10倍的性能提升。
针对该特性在TPC-DS上进行测试(见下图),测试发现启用DFP后,TPC-DS的查询速度达到4.5倍到8倍的提升。
5. 优化组合
综合使用以上优化技术协同工作,让Lakehouse中的数据读取都在高速缓存中进行,并且通过数据布局优化,建立辅助数据结构减少对非缓存数据读取的I/O,实现了Lakehouse引擎可以提供与数据仓库类似的查询性能。
如下图所示,Delta Engine的查询性能与DW1类似,并且超过了DW2和DW3。
三、Delta Clones
Delta Clones是Lakehouse的一项非常重要的技术,可以对大型数据集进行高效拷贝,支持测试、分享和机器学习的不同需求。
1. 什么是克隆?
克隆也叫拷贝,是原始数据在给定时间点的副本;
它具有与源表相同的元数据:相同表结构,约束,列描述,统计信息和分区;
两种克隆方式:shallow(浅克隆),deep(深克隆)。
2. 深克隆
深克隆会完整复制源表的元数据和数据文件,并生成一个全新的独立的表。
a. 深克隆语句
在SQL中运行CREATE TABLE语句;在Python和Scala语句中运行DeltaTable语句。
# SQL
CREATE TABLE delta.`path/to/copy` CLONE customers
# Python and Scala
DeltaTable
.forName("park", "customers")
.clone("path/to/copy")
b. 深克隆的特性
- 与源表相比,克隆表有独立的历史记录;
- 在克隆过程中、或之后发生的对源表的任何更改,都不会反映在克隆表中;
3. 浅克隆
浅克隆仅复制需要克隆的表的元数据,表本身的数据文件不会被复制。
a. 浅克隆语句
与深克隆语句类似,只是在SQL中加入SHALLOW CLONE语句;在Python和Scala中加入isShallow=true。
# SQL
CREATE TABLE delta.`path/to/copy` SHALLOW CLONE customers
# Python and Scala
DeltaTable
.forName("spark", "customers")
.clone("path/to/copy", isShallow=true)
b. 浅克隆的特性
- 浅克隆不是自包含的,即自身不是数据源,如果源文件数据被删除,则浅克隆数据可能会不可用;
- 浅克隆不复制流事务或COPY INTO相关的元数据;
4. 克隆的适用场景
克隆的适用场景有很多,比如:数据存储、短期实验、数据分享和灾难恢复,其中除了短期实验使用浅克隆,其它场景都需要使用深克隆。
本文为阿里云原创内容,未经允许不得转载。
Delta Lake基础介绍(商业版)的更多相关文章
- Delta Lake基础操作和原理
目录 Delta Lake 特性 maven依赖 使用aws s3文件系统快速启动 基础表操作 merge操作 delta lake更改现有数据的具体过程 delta表schema 事务日志 delt ...
- iOS基础UI控件介绍-Swift版
iOS基础UI控件总结 iOS基础控件包括以下几类: 1.继承自NSObject:(暂列为控件) UIColor //颜色 UIImage //图像 2.继承自UIView: 只能相应手势UIGest ...
- 2018年商业版idea破解安装介绍
1. IntelliJ IDEA 2018商业版-安装 首先去官网http://www.jetbrains.com/idea/download/#section=windows下载Ultimate版( ...
- Delta Lake源码分析
目录 Delta Lake源码分析 Delta Lake元数据 snapshot生成 日志提交 冲突检测(并发控制) delete update merge Delta Lake源码分析 Delta ...
- 程序设计模式浅析(plain framework商业版设计模式)
程序设计其实对程序开发者来说十分重要,但是在工作中往往我们却忽略了这一块,因为我们所用的都是现有的模式.一个设计模式的好坏,往往能够体现出程序的专业性,还有整个项目的可持续性.这就是为什么有些公司,在 ...
- 流风ASP.NET框架商业版-工作流1.0简介
流风ASP.NET框架商业版-工作流1.0简介 工作流简介 在流风ASP.NET框架商业版1.0推出后,就有集成工作流的想法,但是由于工作繁忙和其他事情的耽搁,时隔半年之久工作流1.0的版本才姗姗来迟 ...
- 我的新书《计算机图形学基础(OpenGL版)》
我的新书<计算机图形学基础(OpenGL版)>今年6月份在清华大学出版社出版了!新书与原在机械工业出版社出的<计算机图形学>相比,主要有以下不同: 1.加重OpenGL的内容, ...
- Web服务基础介绍
Web服务基础介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.正常情况下的单次web服务访问流程 博主推荐阅读: https://www.cnblogs.com/yinzh ...
- XML基础介绍【一】
XML基础介绍[一] 1.XML简介(Extensible Markup Language)[可扩展标记语言] XML全称为Extensible Markup Language, 意思是可扩展的标记语 ...
- Docker商业版受限,胖容器是个选择
前情概要 8月13日,Docker 公司更新了网站服务协议,条款申明,禁止禁运国家和被列入「美国实体清单」的组织和个人使用带有该服务协议链接的 Docker 网站和所有相关网站.这一更新协议迅速引起了 ...
随机推荐
- eclipse错误之Unhandled event loop exception PermGen space
原来一直用eclipse3.5,最近尝试升级到3.7和4.2,但不管是3.7还是4.2项目编译过程中总提示"Unhandled event loop exception PermGen sp ...
- 【Django】HTML如何显示富文本内容
一.背景 我采用的前端样式是 LayUI,通过它的富文本编辑器保存内容到数据库后,遇到了一个回显到页面的问题 二.方案 在不考虑使用 Vue 的情况下,有一种简单的方式 <div id=&quo ...
- PAT 甲级1005【1005 Spell It Right】
用JAVA可以用BigInteger解决. import java.io.BufferedReader; import java.io.IOException; import java.io.Inpu ...
- YAML语法入门
Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. Ansible系列博文直达链接:Ansible入门系列 前言 在学习playboo ...
- 【VR虚拟现实】-医疗行业的具体应用
虚拟现实 (VR) 虽然经常与游戏联系在一起,但不可否认,未来科技少不了虚拟现实,其应用可以彻底改变许多行业.在医疗领域,无数人正在探索 VR 可以帮助患者和医疗从业者实现更好的治疗结果治疗方式,比如 ...
- 工作记录:TypeScript从入门到项目实战(基础篇)
前言 TypeScript是什么? 引用官方原话 TypeScript是JavaScript类型的超集,它可以编译成纯JavaScript.TypeScript可以在任何浏览器.任何计算机和任何操作系 ...
- [Java]小功能
[版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/130858061 出自[进步* ...
- CentOS 安装webmin
下载地址 http://download.webmin.com/download/yum/ 安装依赖 sudo yum -y install openssl perl perl-Net-SSLeay ...
- KingbaseES V8R6 等待事件之CLogControlLock
前言 Kingbase数据库的tuple行头部来标识这条记录的事务结束状态(未知.已提交.已回滚),在事务提交时如果并发更新100万行记录,需要对多个page的tuple进行更改,这种繁重的操作会对数 ...
- Scala变量和常量的声明
标示符的命名规则 1. 字母或下划线开头 2. 以操作符开头,且只包含操作符(+ - * / # !等) 3. 用反引号`....`包括的任意字符串,即使是 Scala 关键字(39 个)也可以• p ...