数据工程师眼中的 Delta lake(Delta by example)

本文涉及的产品
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: SPARK+AI SUMMIT 2020中文精华版线上峰会带领大家一起回顾2020年的SPARK又产生了怎样的最佳实践,技术上取得了哪些突破,以及周边的生态发展。本文中Databricks开源组技术主管范文臣从数据工程师的角度出发向大家介绍Delta Lake。以下是视频内容精华整理。

一、Delta Lake的诞生

相信作为一个数据工程师,心中都有这么一个理想的工具:

  • 可以持续不断地对各种各样的数据源进行增量处理;
  • 批流合一;
  • 处理速率高效,智能化生成报表;
  • ······

image.png

想要实现上面的工具,一个最简单的办法就是先用一个Spark Streaming Job把各种各样的数据源写到一个表中,如下图,然后再根据业务需求选择是用流作业还是批作业去进行相应的查询工作。但是,这种方式会存在一些问题,比如因为是流式写入,会产生大量的小文件,对后续的性能产生很大的影响。

image.png

面对上面遇到的小文件问题,一个改进的方法如下图所示,是在上述方法中创建的表之后加一个批作业定时的将小文件合并起来,但是这个改进方法仍然有明显的缺点,那就是存在着小时级别的延迟,这种级别的延迟对于很多业务来讲是无法满足要求的。

image.png

为了解决上述延迟问题,Lambda架构畅行一时。其架构思路如下图所示,简单说就是分别用流和批的方式对数据源处理两次,然后将批和流的视角合起来提供给后续业务。Lambda架构虽然解决了上述的问题,但是也存在自身的缺点:

  • 因为业务逻辑在要用批和流的方式处理两次,而批和流的处理方式不一致,可能会导致某些问题;
  • 如果处理逻辑中加入了数据校验的工作,就需要在批和流上分别校验两次,一旦需要回滚等操作,数据修正也需要进行两次,费时费力;
  • 如果涉及到Merge、Update等操作,也需要进行两次修改,使得整个事务变得复杂;
  • ······

image.png

上面的几种方案都有自己的缺点,Lambda架构虽然看似有效但是架构过于复杂。那么,有没有一种方案可以将Lambda架构进行简化呢?其实,我们的目标很简单,就是让流作业处理我们的源数据,并且后续作业可以批流统一的处理,具体来说有:

  • 保证数据的一致性;
  • 保证每次是增量的读取;
  • 能够做回滚;
  • 能够访问历史记录;
  • 能够在不影响下游作业的同时合并小文件。

结合以上几点目标,有了目前的解决方案:Delta Lake + Structured Streaming = The Delta Architecture。这套方案的优点很明显,首先是批流合一的,其次Delta Lake可以很方便的做时间旅行类似的操作,且Delta Lake是单纯的储存层,与计算层分离,符合当前云数据计算的大方向,方便用户灵活的进行扩容。

二、Delta Lake的工作原理

Delta Lake的核心是其事务日志,它的表跟普通的表没有大的区别,但是在表下会建立一个隐藏文件,其中的JSON存储了一些关于事务的记录,如下图所示:

image.png

因此,在Delta Lake中,读取一张表也会重放这张表的历史记录,比如表的重命名、修改Schema等等操作。

更细节地来说,在Delta Lake中的每个JSON文件都是一次commit,这个commit是原子性的,保存了事务相关的详细记录。另外,Delta Lake还可以保证多个用户同时commit而不会产生冲突,它用的是一种基于乐观锁处理的方式,其逻辑如下图所示。这种解决冲突的方案适用于写比较少,读取比较多的场景,大家在使用的时候要注意场景是否适用。

image.png

假设我们要处理一个非常大的表,有百万级别的文件,那么如何高效的处理元数据呢?Delta Lake的处理方案如下图所示,用Spark来读取事务日志,然后Delta Lake隔一段时间对commit做一次合并,之后可以从Checkpoint开始应用后续的commit。

image.png

总结起来,Delta Lake解决数据一致性、增量读取、历史回溯等问题的方案即为下图所示:

image.png

三、Demo
从以下链接大家可以看到详细的Demo展示,还有详细的社区版本(免费)Databricks的设置方法:https://github.com/delta-io/delta/tree/master/examples/tutorials/saiseu19

Demo中提供了Python API和Scala API的实现文件,大家可以根据自己的实际情况进行尝试。上面链接的Demo中展示的主要features有:

  • Schema Enforcement:在做Pipeline的时候我们一定要保证数据质量,因此Schema Enforcement可以帮助我们做到这点。
  • Schema Evolution:随着公司业务的发展,一开始的表结构可能不适用于当前的业务,Schema Evolution可以帮助我们进行表结构的演化。
  • Delete from Delta Lake table:Delete操作可以控制表的无限制增长,并且通过事务日志来进行操作,实际上数据没有被删掉,只是在Log中进行了标记。
  • Audit Delta Lake Table History:通过此功能可以看到对表的详细历史操作。
  • Travel back in time:有了表的历史数据,我们便可以访问表在各个历史节点的数据。
  • Vacuum old versions of Delta Lake tables:Delta Lake通过标记的方式来实现删除,随着时间的增长会占用大量储存空间,Vacuum操作将删除在一定时间内从表中删除的数据文件,实现物理删除,默认会保留七天内的数据。
  • Upsert into Delta Lake table using Merge:在一个命令中同时做update和insert操作。

上述Features的具体代码可以在Github中查看。

四、Q&A

Q1:Delta Lake可以线上使用吗?支持实时增删查改吗?
A1:Delta 最新发布了0.7.0,支持Spark 3.0。Databricks已经有很多客户在使用Delta Lake,其他公司也有在用,比如eBay。实时增删查改如demo演示的那样都是支持的。

Q2:是否可以纯SQL实现?
A2:Delta Lake是一个数据储存层,如果是与Hive等引擎做整合,只支持基本的SELECT/INSERT,没有支持DELETE等SQL操作,只能用Delta Lake自己的Scala或Python API。如果使用的是Spark 3.0的话,像MERGE、DELTE等都支持SQL AQI,可以直接用SQL开发。但是某些管理操作比如VACCUM没有对应的SQL API,还是要用Delta Lake自己的Scala或Python API。


关键词:Databricks、Spark、Delta Lake、Schema Enforcement

获取更多 Spark+AI SUMMIT 精彩演讲视频回放,立刻点击前往:
>>SPARK + AI SUMMIT 2020 中文精华版线上峰会 7月4日第一场<<
>>SPARK + AI SUMMIT 2020 中文精华版线上峰会 7月5日第二场<<

相关实践学习
基于EMR Serverless StarRocks一键玩转世界杯
基于StarRocks构建极速统一OLAP平台
快速掌握阿里云 E-MapReduce
E-MapReduce 是构建于阿里云 ECS 弹性虚拟机之上,利用开源大数据生态系统,包括 Hadoop、Spark、HBase,为用户提供集群、作业、数据等管理的一站式大数据处理分析服务。 本课程主要介绍阿里云 E-MapReduce 的使用方法。
相关文章
|
4月前
|
存储 数据挖掘 API
揭秘数据的多维宇宙:Delta Lake是如何成为版本管理的超级英雄的?
【8月更文挑战第27天】Delta Lake是一种开源存储层,专为大规模数据处理设计,提供高效表版本管理,便于处理不同版本的大规模数据。它利用事务日志追踪表更改,确保数据一致性和完整性;采用增量快照存储表的多个版本,支持高效读取和查询;并提供内置函数和API方便管理和查询版本。此外,Delta Lake还支持时间旅行和数据版本控制等高级功能,是处理大规模数据、跟踪数据变化和进行历史数据分析的强大工具。
45 0
|
4月前
|
存储 数据采集 JSON
穿越时空的数据之旅:Delta Lake 如何颠覆你对表版本管理的一切认知!
【8月更文挑战第27天】Delta Lake是一款开源存储层方案,为Apache Spark提供事务性数据湖功能。其核心特性包括ACID事务保证、统一元数据管理和优化的数据存储格式,支持数据表版本管理,能记录每次表更改并允许回溯至任意历史状态。受Git启发,Delta Lake通过版本链追踪数据变化,支持轻松恢复至过往状态。每当表发生变化时会生成新版本及提交记录,存储于`_delta_log`目录下的JSON文件中,便于数据工程师处理数据一致性问题,维护数据质量和可追溯性。
45 0
|
4月前
|
JSON 分布式计算 监控
《数据版本迷宫揭秘》——Delta Lake如何玩转时间旅行,让你的数据不再迷失!
【8月更文挑战第27天】Delta Lake是一款为Apache Spark设计的高性能数据存储系统,提供ACID事务、可扩展的元数据管理和数据版本控制等功能。利用不可变的JSON格式事务日志,Delta Lake能追踪所有表变更,确保数据一致性和可追溯性。每项写操作都会生成新的事务日志文件,支持轻松回溯至任意版本。此外,Delta Lake还具备数据回溯、确保数据一致性及审计监控等优点,为大数据环境下的数据治理提供强大支持。
53 0
|
4月前
|
存储 分布式计算 大数据
《数据湖的时空穿越:Delta Lake如何用版本控制解锁历史迷雾》
【8月更文挑战第27天】Delta Lake作为一个开源的存储层为Apache Spark及大数据工作流带来了事务性支持与数据版本控制功能。通过将数据表视作一系列不可变的事务日志记录,Delta Lake实现了数据一致性的保障。它支持ACID事务并允许用户追踪和管理数据表的不同版本。利用提供的示例代码可以看到如何对Delta Lake表进行操作、查询特定版本甚至回滚至早期版本。随着数据湖架构的发展,Delta Lake正逐渐成为管理大规模数据集的关键工具。
66 0
|
存储 SQL 机器学习/深度学习
Delta Lake 数据湖基础介绍(商业版)| 学习笔记
快速学习Delta Lake 数据湖基础介绍(商业版)
311 0
Delta Lake 数据湖基础介绍(商业版)| 学习笔记
|
存储 机器学习/深度学习 SQL
初探数据湖(Data Lake),到底有什么用?让我们来一窥究竟...
初探数据湖(Data Lake),到底有什么用?让我们来一窥究竟...
1387 0
初探数据湖(Data Lake),到底有什么用?让我们来一窥究竟...
|
存储 SQL JSON
Delta Lake基础介绍(开源版)【Databricks 数据洞察公开课】
针对社区版本Delta Lake提供的几大核心特性进行讲解,并通过示例演示如何使用这些特性。
893 0
Delta Lake基础介绍(开源版)【Databricks 数据洞察公开课】
|
SQL 存储 分布式计算
Delta Lake的演进历史及现状【Databricks 数据洞察公开课】
从大数据平台架构的演进、Delta Lake关键特性、版本迭代、重要功能等多方面,介绍Delta Lake的演进和优势。
899 0
Delta Lake的演进历史及现状【Databricks 数据洞察公开课】
|
存储 SQL 缓存
Delta Lake基础介绍(商业版)【Databricks 数据洞察公开课】
介绍 Lakehouse 搜索引擎的设计思想,探讨其如何使用缓存,辅助数据结构,存储格式,动态文件剪枝,以及 vectorized execution 达到优越的处理性能。
387 0
Delta Lake基础介绍(商业版)【Databricks 数据洞察公开课】
|
存储 机器学习/深度学习 JSON
【详谈 Delta Lake 】系列技术专题 之 Streaming(流式计算)
本文翻译自大数据技术公司 Databricks 针对数据湖 Delta Lake 的系列技术文章。众所周知,Databricks 主导着开源大数据社区 Apache Spark、Delta Lake 以及 ML Flow 等众多热门技术,而 Delta Lake 作为数据湖核心存储引擎方案给企业带来诸多的优势。本系列技术文章,将详细展开介绍 Delta Lake。
【详谈 Delta Lake 】系列技术专题 之 Streaming(流式计算)