Databricks 企业版 SparkDelta Lake 引擎助力 Lakehouse 高效访问

简介:本文介绍了Databricks企业版Delta Lake的性能优势,借助这些特性能够大幅提升Spark SQL的查询性能,加快Delta表的查询速度。

作者:

李锦桂(锦犀) 阿里云开源大数据平台开发工程师

王晓龙(筱龙) 阿里云开源大数据平台技术专家

背景介绍

Databricks是全球领先的Data+AI企业,是Apache Spark的创始公司,也是Spark的最大代码贡献者,核心围绕Spark、Delta Lake、MLFlow等开源生态打造企业级Lakehouse产品。2020年,Databricks 和阿里云联手打造了基于Apache Spark的云上全托管大数据分析&AI平台——Databricks数据洞察(DDI,Databricks DataInsight),为用户提供数据分析、数据工程、数据科学和人工智能等方面的服务,构建一体化的Lakehouse架构。

Delta Lake是Databricks从2016年开始在内部研发的一款支持事务的数据湖产品,于2019年正式开源。除了社区主导的开源版Delta Lake OSS,Databricks商业产品里也提供了企业版Spark&Detla Lake引擎,本文将介绍企业版提供的产品特性如何优化性能,助力高效访问Lakehouse。

针对小文件问题的优化解法

在Delta Lake中频繁执行merge, update, insert操作,或者在流处理场景下不断往Delta表中插入数据,会导致Delta表中产生大量的小文件。小文件数量的增加一方面会使得Spark每次串行读取的数据量变少,降低读取效率,另一方面,使得Delta表的元数据增加,元数据获取变慢,从另一个维度降低表的读取效率。

为了解决小文件问题,Databricks提供了三个优化特性,从避免小文件的产生和自动/手动合并小文件两个维度来解决Delta Lake的小文件问题。

特性1:优化Delta表的写入,避免小文件产生

在开源版Spark中,每个executor向partition中写入数据时,都会创建一个表文件进行写入,最终会导致一个partition中产生很多的小文件。Databricks对Delta表的写入过程进行了优化,对每个partition,使用一个专门的executor合并其他executor对该partition的写入,从而避免了小文件的产生。

该特性由表属性delta.autoOptimize.optimizeWrite来控制:

  • 可以在创建表时指定
CREATE TABLE student (id INT, name STRING)
TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true);
  • 也可以修改表属性
ALTER TABLE table_name
SET TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true);

该特性有两个优点:

  1. 通过减少被写入的表文件数量,提高写数据的吞吐量;
  2. 避免小文件的产生,提升查询性能。

其缺点也是显而易见的,由于使用了一个executor来合并表文件的写入,从而降低了表文件写入的并行度,此外,多引入的一层executor需要对写入的数据进行shuffle,带来额外的开销。因此,在使用该特性时,需要对场景进行评估:

  • 该特性适用的场景:频繁使用MERGE,UPDATE,DELETE,INSERT INTO,CREATE TABLE AS SELECT等SQL语句的场景;
  • 该特性不适用的场景:写入TB级以上数据。

特性2:自动合并小文件

在流处理场景中,比如流式数据入湖场景下,需要持续的将到达的数据插入到Delta表中,每次插入都会创建一个新的表文件用于存储新到达的数据,假设每10s触发一次,那么这样的流处理作业一天产生的表文件数量将达到8640个,且由于流处理作业通常是long-running的,运行该流处理作业100天将产生上百万个表文件。这样的Delta表,仅元数据的维护就是一个很大的挑战,查询性能更是急剧恶化。

为了解决上述问题,Databricks提供了小文件自动合并功能,在每次向Delta表中写入数据之后,会检查Delta表中的表文件数量,如果Delta表中的小文件(size < 128MB的视为小文件)数量达到阈值,则会执行一次小文件合并,将Delta表中的小文件合并为一个新的大文件。

该特性由表属性delta.autoOptimize.autoCompact控制,和特性delta.autoOptimize.optimizeWrite相同,可以在创建表时指定,也可以对已创建的表进行修改。自动合并的阈值由spark.databricks.delta.autoCompact.minNumFiles控制,默认为50,即小文件数量达到50会执行表文件合并;合并后产生的文件最大为128MB,如果需要调整合并后的目标文件大小,可以通过调整配置spark.databricks.delta.autoCompact.maxFileSize实现。

特性3:手动合并小文件

自动小文件合并会在对Delta表进行写入,且写入后表中小文件达到阈值时被触发。除了自动合并之外,Databricks还提供了Optimize命令使用户可以手动合并小文件,优化表结构,使得表文件的结构更加紧凑。在实现上Optimize使用bin-packing算法,该算法不但会合并表中的小文件,且合并后生成的表文件也更均衡(表文件大小相近)。例如,我们要对Delta表student的表文件进行优化,仅需执行如下命令即可实现:

OPTIMIZE student;

Optimize命令不但支持全表小文件的合并,还支持特定的分区的表文件的合并,例如,我们可以仅对date大于2017-01-01的分区中的小文件进行合并:

OPTIMIZE student WHERE date >= '2017-01-01'

从Databricks数据洞察产品上的试验数据看,Optimize能使查询性能达到8x以上的提升。

媲美企业级数据库的查询优化技术

Databricks在数据查询方面也做了诸多优化,包括:

特性1:Data Skipping

在数据查询系统中,有两种经典的查询优化 技术:一种是以更快的速度处理数据,另一种是通过跳过不相关的数据,减少需要扫描的数据量。Data Skipping属于后一种优化技术,通过表文件的统计信息跳过不相关的表文件,从而提升查询性能。

在向Delta表中新增表文件时,Delta Lake会在Delta表的元数据中存储该表文件中的数据前32列的统计信息,包括数据列的最大最小值,以及为null的行的数量,在查询时,Databricks会利用这些统计信息提升查询性能。例如:对于一张Delta表的x列,假设该表的一个表文件x列的最小值为5,最大值为10,如果查询条件为 where x < 3,则根据表文件的统计信息,我们可以得出结论:该表文件中一定不包含我们需要的数据,因此我们可以直接跳过该表文件,减少扫描的数据量,进而提升查询性能。

Data Skipping的实现原理和布隆过滤器类似,通过查询条件判断表文件中是否可能存在需要查询的数据,从而减少需要扫描的数据量。如果表文件不可能存在查询的数据,则可以直接跳过,如果表文件可能存在被查询的数据,则需要扫描表文件。

为了能尽可能多的跳过和查询无关的表文件,我们需要缩小表文件的min-max的差距,使得相近的数据尽可能在文件中聚集。举一个简单的例子,假设一张表包含10个表文件,对于表中的x列,它的取值为[1, 10],如果每个表文件的x列的分布均为[1, 10],则对于查询条件:where x < 3,无法跳过任何一个表文件,因此,也无法实现性能提升,而如果每个表文件的min-max均为0,即在表文件1的x列分布为[1, 1],表文件2的x列分布为[2, 2]...,则对于查询条件:where x < 3,可以跳过80%的表文件。受该思想的启发,Databricks支持使用Z-Ordering来对数据进行聚集,缩小表文件的min-max差距,提升查询性能。下面我们介绍Z-Ordering优化的原理和使用。

特性2:Z-Ordering优化

如上一节所解释的,为了能尽可能多的跳过无关的表文件,表文件中作为查询条件的列应该尽可能紧凑(即min-max的差距尽可能小)。Z-Ordering就可以实现该功能,它可以在多个维度上将关联的信息存储到同一组文件中,因此确切来说,Z-Ordering实际是一种数据布局优化算法,但结合Data Skipping,它可以显著提升查询性能。

Z-Ordering的使用非常简单,对于表events,如果经常使用列eventTypegenerateTime作为查询条件,那么执行命令:

OPTIMIZE events ZORDER BY (eventType, generateTime)

Delta表会使用列eventTypegenerateTime调整数据布局,使得表文件中eventTypegenerateTime尽可能紧凑。

根据我们在Databricks DataInsight上的试验,使用Z-Ordering优化能达到40倍的性能提升,具体的试验案例参考文末Databricks数据洞察的官方文档。

特性3:布隆过滤器索引

布隆过滤器也是一项非常有用的Data-skipping技术。该技术可以快速判断表文件中是否包含要查询的数据,如果不包含就及时跳过该文件,从而减少扫描的数据量,提升查询性能。

如果在表的某列上创建了布隆过滤器索引,并且使用where col = "something"作为查询条件,那么在扫描表中文件时,我们可以使用布隆过滤器索引得出两种结论:文件中肯定不包含col = "something"的行,或者文件有可能包含col = "something"的行。

  • 当得出文件中肯定不包含col = "something"的行的结论时,就可以跳过该文件,从而减少扫描的数据量,提升查询性能。
  • 当得出文件中可能包含col = "something"的行的结论时,引擎才会去处理该文件。注意,这里仅仅是判断该文件中可能包含目标数据。布隆过滤器定义了一个指标,用于描述出现判断失误的概率,即判断文件中包含需要查询的数据,而实际上该文件并不包含目标数据的概率,并称之为FPP(False Positive Probability: 假阳性概率)。

Databricks支持文件级Bloom过滤器,如果在表的某些列创建了布隆过滤器索引,那么该表的每个表文件都会关联一个 Bloom 筛选器索引文件,索引文件存储在表文件同级目录下的 _delta_index 子目录中。在读取表文文件之前,Databricks会检查索引文件,根据上面的步骤判断表文件中是否包含需要查询的数据,如果不包含则直接跳过,否则再进行处理。

布隆过滤器索引的创建和传统数据库索引的创建类似,但需要指定假阳性概率和该列可能出现的值的数量:

CREATE BLOOMFILTER INDEX ON TABLE table_name
FOR COLUMNS(col_name OPTIONS (fpp=0.1, numItems=50000000))

根据我们在Databricks DataInsight上的试验,使用布隆过滤器索引能达到3倍以上的性能提升,试验案例参考文末Databricks数据洞察的官方文档。

特性4:动态文件剪枝

动态文件剪枝(Dynamic File Pruning, DFP)和动态分区剪枝(Dynamic Partition Pruning)相似,都是在维表和事实表的Join执行阶段进行剪枝,减少扫描的数据量,提升查询效率。
下面我们以一个简单的查询为例来介绍DFP的原理:

SELECT sum(ss_quantity) FROM store_sales 
JOIN item ON ss_item_sk = i_item_sk
WHERE i_item_id = 'AAAAAAAAICAAAAAA'

在该查询中,item为维表(数据量很少),store_sales为事实表(数据量非常大),where查询条件作用于维表上。如果不开启DFP,那么该查询的逻辑执行计划如下:

从上图可以看出,先对store_sales进行全表扫描,然后再和过滤后的item表的行进行join,虽然结果仅有4万多条数据,但却扫描了表store_sales中的80多亿条数据。针对该查询,很直观的优化是:先查询出表item中i_item_id = 'AAAAAAAAICAAAAAA'数据行,然后将这些数据行的i_item_sk值作为表store_sales的ss_item_sk的查询条件在表store_sales的SCAN阶段进行过滤,结合我们在上面介绍的Data Skipping技术,可以大幅减少表文件的扫描。这一思路正是DFP的根本原理,启动DFP后的逻辑执行计划如下图所示:

可以看到,在启用DFP之后,过滤条件被下推到SCAN操作中,仅扫描了600多万条store_sales中的数据,从结果上看,启动DFP后,该条查询实现了10倍的性能提升,此外,Databricks还针对该特性对TPC-DS测试,测试发现启用DFP后,TPC-DS的第15条查询达到了8倍的性能提升,有36条查询实现了2倍及以上的性能提升。

总结

前文概括介绍了Databricks企业版Delta Lake的性能优势,借助这些特性能够大幅提升Spark SQL的查询性能,加快Delta表的查询速度。原文链接本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度解析数据湖存储方案Lakehouse架构

简介&#xff1a;从数据仓库、数据湖的优劣势&#xff0c;湖仓一体架构的应用和优势等多方面深度解析Lakehouse架构。 作者&#xff1a;张泊 Databricks 软件工程师 Lakehouse由lake和house两个词组合而成&#xff0c;其中lake代表Delta Lake&#xff08;数据湖&#xff09;&…

1688 复杂业务场景下的 Serverless 提效实践

简介&#xff1a;我们主要负责 PC 端 1688.com 以及手机端阿里巴巴 APP&#xff0c;是目前国内最大的 B 类电商交易平台&#xff0c;主要面向 B2B 电商业务的场景&#xff0c;为中小企业提供零售、批发、分销以及加工定制等电商交易渠道。 前言 首先为大家简单介绍一下我们的…

阿里 蚂蚁自研 IDE 研发框架 OpenSumi 正式开源

简介&#xff1a;经历近 3 年时间&#xff0c;在阿里集团及蚂蚁集团共建小组的努力下&#xff0c;OpenSumi 作为国内首个强定制性、高性能&#xff0c;兼容 VS Code 插件体系的 IDE 研发框架&#xff0c;今天正式对外开源。 作者 | OpenSumi 来源 | 阿里技术公众号 经历近 3 …

剖析 kubernetes 集群内部 DNS 解析原理

作者 | 江小南来源 | 江小南和他的小伙伴们引言说到DNS域名解析&#xff0c;大家想到最多的可能就是/etc/hosts文件&#xff0c;并没有什么错&#xff0c;但是/etc/hosts只能做到本机域名解析&#xff0c;如果跨机器的解析就有点捉襟见肘了。在服务器中还有一个配置值得大家注意…

首次公开,阿里云开源PolarDB总体架构和企业级特性

简介&#xff1a;在3月2日的阿里云开源 PolarDB 企业级架构发布会上&#xff0c;阿里云 PolarDB 内核技术专家北侠带来了主题为《PolarDB 总体架构设计和企业级特性》的精彩演讲。 在3月2日的阿里云开源 PolarDB 企业级架构发布会上&#xff0c;阿里云 PolarDB 内核技术专家 北…

阿里云数据库开源发布:PolarDB HTAP的功能特性和关键技术

简介&#xff1a;在3月2日的阿里云开源 PolarDB 企业级架构发布会上&#xff0c;阿里云 PolarDB 内核技术专家严华带来了主题为《PolarDB HTAP详解》的精彩演讲。在PolarDB存储计算分离架构的基础上&#xff0c;我们研发了基于共享存储的MPP分布式执行引擎&#xff0c;解决了单…

倒计时 2 天!2022 中国算力大会:移动云邀您共见算力网络,创新发展

7 月 29 日 - 31 日由工业和信息化部、山东省人民政府主办的首届中国算力大会将在泉城济南盛大举行&#xff01;中国移动受邀承办“算力网络&#xff0c;创新发展” 论坛并设立展区分享行业前瞻洞察&#xff0c;构建开放共赢生态7 月 29 日下午&#xff0c;邀您共话算力精彩&am…

什么是好的错误消息? 讨论一下Java系统中的错误码设计

简介&#xff1a;一个好的Error Message主要包含三个部分&#xff1a;Context: 什么导致了错误&#xff1f;发生错误的时候代码想做什么&#xff1f;The error itself: 到底是什么导致了失败&#xff1f;具体的原因和当时的数据是什么&#xff1f;Mitigation: 有什么解决方案来…

阿里巴巴在开源压测工具 JMeter 上的实践和优化

简介&#xff1a;Apache JMeter 是 Apach 旗下的开源压测工具&#xff0c;创建于 1999 年初&#xff0c;迄今已有超过 20 年历史。JMeter 功能丰富&#xff0c;社区&#xff08;用户群体&#xff09;庞大&#xff0c;是主流开源压测工具之一。 作者&#xff1a;灵苒、涧泉 Ap…

普洛斯荣获两项“数据中心绿色等级评估”5A级认证

7月29日&#xff0c;由工业和信息化部及山东省人民政府主办的首届中国算力大会在济南成功举办&#xff0c;会上同时公布了本年度“数据中心绿色等级评估”评审结果。普洛斯常熟东南数据中心B栋及普洛斯怀来数据中心3号楼均荣获“数据中心绿色等级评估”&#xff08;规划类/基础…

深度解读企业云上办公利器「无影云电脑」

简介&#xff1a;信息化进程高速发展的今天&#xff0c;用户桌面办公的需求正不断发生变化&#xff1a;远程办公&#xff0c;BYOD的需求不断增长&#xff1b;快速交付&#xff0c;高效运维的需求接连上升&#xff1b;数据及网络安全的关注度持续提高&#xff1b;整体办公成本在…

云风:不加班、不炫技,把复杂的问题简单化

小学时跟随母亲去成人大学学习编程&#xff0c;初中开始参加信息学奥赛&#xff0c;高中写出人生中第一个成熟软件——Cview&#xff0c;大学发布开源软件风魂系列&#xff0c;后用于网易开发的《大话西游》《梦幻西游》等热门游戏&#xff0c;离开网易创立简悦科技……随着云风…

Timing:在线自习室快速搭建

通过超低延迟的音视频通信技术、视频连麦、弱网传输算法&#xff0c;快速搭建自习场景&#xff0c;提升自习效率。 客户简介 氪细胞主打产品Timing&#xff0c;是国内最早推出&#xff0c;也是规模最大的在线自习室&#xff0c;是新一代的教育与社交融合平台&#xff0c;主打高…

Nacos2.0的K8s服务发现生态应用及规划

简介&#xff1a;Nacos 是阿里巴巴于 2018 年开源的注册中心及配置中心产品&#xff0c;帮助用户的分布式微服务应用进行服务发现和配置管理功能。随着 Nacos2.0 版本的发布&#xff0c;在性能和扩展性上取得较大突破后&#xff0c;社区开始考虑如何提供更加云原生方向的功能和…

webview 和 React Native 中吸顶效果实现

作者 | &#x1f47d;来源 | Sharing一、前言 在跨端开发中&#xff0c;离不开一些吸顶的交互场景&#xff0c;可以参考淘宝或是京东类电商 app 中一些 tab &#xff0c;在整个容器滑动的过程中&#xff0c;吸顶效果非常的连贯和丝滑的&#xff0c;当然这些 tab 可能是用 nativ…

AHPA:开启 Kubernetes 弹性预测之门

简介&#xff1a;阿里巴巴云原生团队和阿里达摩院决策智能时序团队合作开发 AHPA 弹性预测产品&#xff0c;该产品主要出发点是基于检测到的周期做“定时规划”&#xff0c;通过规划实现提前扩容的目的&#xff0c;在保证业务稳定的情况下&#xff0c;让你真正实现按需使用。 …

Kubernetes 在科技革命中的演变

作者 | Anthony Spiteri仅在一两年前&#xff0c;对于那些希望通过向现代数据平台转型走在前沿的企业来讲&#xff0c;容器化可是热门词汇。Kubernetes&#xff0c;也被称为 K8s&#xff0c;当时还不成熟&#xff0c;仅处于起步阶段&#xff0c;对更广泛的IT界来说仍然有些陌生…

在阿里巴巴,我们如何先于用户发现和定位 Kubernetes 集群问题?

简介&#xff1a;本文整理自阿里云高级研发工程师彭南光(光南) 在 KubeCon China 2021 大会的演讲实录&#xff0c;分享了阿里巴巴是如何通过自研通用链路探测定向巡检工具 KubeProbe 应对大规模集群的稳定性挑战的。关于阿里云云原生团队在本次 KubeCon 上分享的全部内容沉淀于…

“虎力全开”采购季,存储产品已就位

简介&#xff1a;两百多年前&#xff0c;有个叫吴锡麒的少年&#xff0c;在“江南三月听莺天&#xff0c;买酒莫论钱”。如今又逢暮春三月&#xff0c;一年一度的开年大促——阿里云上云采购季也拉开了序幕。 两百多年前&#xff0c;有个叫吴锡麒的少年&#xff0c;在“江南三月…

武汉高性能计算大会2022举办,高性能计算生态发展再添新动力

武汉高性能计算大会2022会上&#xff0c;华为重磅发布了鲲鹏高性能计算解决方案&#xff0c;为了进一步推进高性能产业的生态繁荣&#xff0c;武汉高性能计算产业联盟成立启动&#xff0c;长江欧拉生态创新中心签约并揭牌&#xff0c;首批鲲鹏科研创新使能计划成员也正式亮相。…