在当今数据驱动的世界中,数据处理和存储的效率与可靠性至关重要。Delta Lake作为一种开源存储层,为现有的数据存储基础设施提供了模式执行、版本控制和ACID(原子性、一致性、隔离性和持久性)事务功能。本文将深入探讨Delta Lake的工作原理、与Apache Spark的关系、数据插入或加载过程、组件及其ACID属性,以及Upsert、数据读取模式和批处理与流处理操作等概念。通过阅读本文,将全面了解Delta Lake,掌握如何有效使用这项技术,并能够应对常见的中级面试问题。
Delta Lake不仅解决了其他事务存储层所解决的挑战,而且其应用范围更广,覆盖了整个数据生态系统。它提供了数据安全性、可靠性和更好的性能,并为批处理和流处理工作负载提供了统一的框架。Delta Lake在Databricks上使用时,可以提供更广泛的生态系统支持,与最受欢迎的商业智能工具快速原生连接,通过Delta Engine提供更好的性能,并提供细粒度的访问控制以实现更好的安全性和治理。据统计,Delta Lake每天处理约3PB的数据,并已在生产环境中运行超过3年,数千用户在Databricks上使用Delta Lake。
ACID
属性是数据库事务正确性的四个关键属性,Delta Lake完全符合这些属性:
原子性(A):Delta Lake提供原子事务,意味着对Delta表中数据的所有修改要么全部提交,要么全部回滚。
一致性(C):Delta Lake提供数据一致性,意味着数据读取者总是能够读取到事务开始时的数据。
隔离性(I):借助时间旅行功能,Delta Lake支持隔离性,允许用户查看任何时刻的数据状态。
持久性(D):Delta Lake支持持久性,即使在系统故障的情况下,也能显示所有事务性更改。
Delta Lake是建立在Apache Spark
之上的工具,为Spark应用程序提供了管理存储和提升性能的途径。Delta Lake通过将数据存储在Parquet文件中来提升Spark读写数据的性能。它使用列式格式,并为确保数据一致性提供了管理事务和跟踪数据修改的方法。
Delta Lake是大规模数据处理的优选,因为它提供了高可扩展性和更好的性能。此外,即使在停电或硬件故障的情况下,由于Delta Lake的ACID设计,数据也能免于损坏。
可以使用Databricks的Auto Loader工具或SQL中的COPY INTO命令将数据导入Delta Lake,它会自动将新数据文件摄入Delta Lake,因为它们出现在数据湖中(即在S3或ADLS上)。此外,可以使用Apache SparkTM批量读取数据,执行必要的更改,并将结果存储在Delta Lake中。
Delta Lake由三个重要组件组成:Delta表、Delta日志和Delta缓存。
Delta表:它是Delta Lake的中心存储部分,包含Delta Lake的所有数据。
Delta日志:事务日志用于跟踪或监控对Delta表所做的所有修改。
Delta缓存:它是一个列式缓存,像普通缓存一样,存储Delta表中数据的当前版本。
Upsert是更新(Update)和插入(Insert)两个操作的组合。可以使用MERGE和INSERT INTO命令在Delta Lake中执行upsert操作:
MERGE:使用MERGE命令,可以根据给定条件更新或插入Delta表中的任何数据。使用WHERE子句对任何命令设置条件,如果条件为真,则执行UPDATE操作;如果条件为假,则执行INSERT操作。
INSERT INTO:使用INSERT INTO命令,可以将数据插入Delta表,但此命令只会插入新行到表中,不会对现有行进行更新操作。
从Delta Lake表读取数据时,有两种可用模式:
1. 全量扫描模式(Full Scan Mode):此模式用于读取Delta Lake表的全部内容。
2. 增量扫描模式(Incremental Scan Mode):此模式用于读取自上次读取Delta表以来插入或修改的数据。
可以在Delta Lake上运行批处理和流处理操作,避免了复杂、冗余的系统和操作挑战。在Delta Lake中,一个表既是批处理表,也是流处理源。就重要性而言,交互式查询、流数据处理和批处理历史回填都能直接与Spark Structured Streaming集成。
要执行加载操作,Delta Lake支持一个称为“upsert”的过程。它从另一个现有的文件系统加载数据到Delta表中。在此过程中,首先检查表中是否已存在具有相同主键的行。如果行存在,则用新数据更新;否则,将其插入表中。
本文涵盖了一些在数据科学和大数据开发者面试中可能会被问到的Delta Lake面试问题。通过参考这些Delta Lake面试问题,可以更好地理解概念并为即将到来的面试制定有效的答案。本文的关键要点是:
Delta Lake是一个ACID兼容的开源存储层,位于现有的数据存储基础设施之上。