尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

3 步让数据湖靠谱:Delta Lake 的 ACID 湖仓一体上手指南

3 步让数据湖靠谱:Delta Lake 的 ACID 湖仓一体上手指南 3 步让数据湖靠谱Delta Lake 的 ACID 湖仓一体上手指南【免费下载链接】deltaAn open-source storage framework that enables building a Lakehouse architecture with compute engines including Spark, PrestoDB, Flink, Trino, and Hive and APIs项目地址: https://gitcode.com/GitHub_Trending/del/delta深夜报表对不上数查下来是数据湖里两个写入任务互相踩了脚——这是数据湖没有事务边界时的常见场面。Delta Lake 补的就是这块短板它是一套构建湖仓一体架构的开源存储框架让数据湖具备 ACID 事务、时间旅行和 Schema 演化能力Spark、PrestoDB、Flink、Trino、Hive 这些引擎都能直接读写同一份数据。 裸跑的数据湖到底差在哪数据湖便宜、灵活但灵活是有代价的写入没有事务两个任务同时写一张表一个成功一个失败一半脏数据就留在库里了错了回不了头写坏了一个版本只能手工删文件期间别人的查询全受影响Schema 一改就卡壳上游加个字段整条管道都得停下来重建小文件越攒越多文件碎成渣查询性能跟着掉。Delta Lake 的设计恰好对着这四个问题用 ACID 事务保证写入一致用时间旅行随时回退用 Schema 演化容纳字段变化用优化写入合并碎片文件。数据仓库、实时流处理、统一数据湖管理、机器学习训练数据这些场景都能落在上面。 数据写进去怎么保证不丢事务日志在记账核心是一本事务日志你可以把它理解成记账本。每写入一次数据就追加一条账目加了哪些文件、删了哪些文件、Schema 长什么样。读取时不去翻目录而是按这本账本还原表当前的状态。账目要么整条可见、要么完全不可见ACID 特性由此而来事务是原子的并发读写互不踩踏系统保证可串行化提交之后不反悔。因为账本天然记录着每一次历史状态时间旅行也就顺带有了——任何历史版本都能再查一遍审计、回滚都靠它。⚡ 3 步跑通第一张湖仓表第 1 步准备环境。需要 Java 8 或更高版本、Spark 3.0 或更高版本拉下源码编译# 获取源码并编译产物即 Delta Lake 的构建输出 git clone https://gitcode.com/GitHub_Trending/del/delta cd delta build/sbt compile第 2 步建第一张 Delta 表。和写普通 parquet 表相比只差一个 formatimport org.apache.spark.sql.SparkSession val spark SparkSession.builder().appName(lakehouse-demo).getOrCreate() import spark.implicits._ val data Seq((1, Alice), (2, Bob), (3, Charlie)).toDF(id, name) // 把 format 换成 delta事务即刻生效表也同时被创建 data.write.format(delta).save(/path/to/delta-table)第 3 步查询和更新。读取接口和普通表没有区别更新只要一行import io.delta.tables._ import org.apache.spark.sql.functions._ val df spark.read.format(delta).load(/path/to/delta-table) // 查询 df.show() val table DeltaTable.forPath(spark, /path/to/delta-table) table.update(id 2, Map(name - lit(Robert))) // 按条件更新一行想往下看实现细节的话Spark 连接器核心代码是个不错的入口。 小文件怎么合打开优化写入对比下面这张图的两种写法传统模式下多个执行器各自往分区里塞小文件越写越碎开启优化写入后系统先把数据汇聚重排每个分区只落下一批少数大文件。文件少了读取更快元数据扫描的开销也更低不用你自己再排一套定期合并的任务。 Schema 变了不用改代码历史也随时能翻上游新增字段时管道不用停、不用重建Delta Lake 支持Schema 演化写入时自动把新字段并进表的模式里。再配合时间旅行任意历史版本都能读出来——上周的数据还在今天发现口径不对可以回到前一天核对。这两个特性合起来的意思是管道一直跑而你随时能退回昨天。 数据晚到了排序决定对错Delta Lake 原生支持流处理日志、传感器读数这类实时数据可以持续写进表里。这里有个关键点迟到数据怎么处理。下图中当事件时间排序关闭时延迟事件会被直接丢弃开启之后系统按事件时间把数据重新归位再处理迟到的记录也能落到正确的位置上。 一张表多个引擎都能读数据只存一份但读它的引擎可以有很多Apache Spark 读写PrestoDB、Hive 可以读Trino、Flink 各有连接器还有 Rust 等语言的 API 做底层访问。如果你好奇 Spark 查询内部的协作方式Delta Kernel Connector 就在中间传话Driver 向它要 Schema它转手向 Delta Kernel 取并把静态、动态过滤器一起下推来缩小扫描范围真正的文件扫描仍交给 Spark 自带的 Parquet 读取器完成。各特性的完整用法可以看项目文档目录里的快速上手指南想弄清记账本每一页长什么样PROTOCOL.md 里是事务日志的完整规格——这是你下一步该读的东西。【免费下载链接】deltaAn open-source storage framework that enables building a Lakehouse architecture with compute engines including Spark, PrestoDB, Flink, Trino, and Hive and APIs项目地址: https://gitcode.com/GitHub_Trending/del/delta创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表