数据湖-Hudi-源码学习-Kernel-TableFormat-FileLayouts 设计
$File\ Layouts$ 是指 Hudi 的相关文件在存储介质上的分布,Hudi 会管理文件的命名、大小和存放位置,并会在适当时机新建、合并或分裂数据文件。Hudi 在文件操作上有一个重要原则:
1Hudi always creates immutable files on disk
即: 文件一旦创建,永远不会再更新,任何添加、修改或删除操作只会在现有文件数据的基础上合并输入数据一起写入到下一个新文件中。
二、设计Hudi 的文件布局包括数据文件布局和元数据文件布局。Hudi 文件布局是能实现增量查询、数据更新等特性的基础,每个 Hudi 表有一个固定的目录(基本路径 HoodieWriteConfig.BASEPATHPROP),存放 .hoodie 以及数据文件,其中数据文件可以以分区方式进行划分,每个分区包含多个数据文件(基础文件和日志文件[MOR])。
2.1. 工作目录 .hoodie.hoodie 目录是 Hudi 作业的工作目录。
引用本站文章
...
数据湖-Hudi-源码学习-Kernel-TableFormat-FileLayouts-优化-Compaction
一、概述由于 CRUD 的零散性,每一次的操作都会生成一个文件,这些小文件越来越多后,会严重影响 HDFS 的性能,Hudi 设计了一套文件合并机制。
二、设计
数据湖-Hudi-源码学习-Kernel-TableFormat-FileLayouts-优化-File Sizing
https://blog.csdn.net/bluishglc/article/details/129922424
一、概述Hudi 严格控制着文件的大小,以确保它们始终处于合理的区间范围内,从而避免大量小文件的出现,Hudi 的这部分机制就称作 File Sizing
二、设计
数据湖-Iceberg-源码学习-Kernal-Table-数据操作-Upsert
一、概述Hudi 在处理 Upsert 请求时,会有一个 tagging 过程,主要是给每条数据打标,标明这条数据是 insert 还是 update。这个标签起到以下作用:
对于 insert 的数据,Hudi 会写入新的 base 文件
对于 update 的数据,Hudi 会写入新的 delta 文件,文件名使用原数据的 fileId
Hudi 为了快速地确定每条数据到底是 insert 还是 update,减少 tagging 的时间,还引入了索引机制。索引支持三种不同的类型,但每一种类型或多或少都会带来一些成本,或是影响写入性能,或是增加维护成本。
Iceberg 没有 tagging 过程,也无需外部中间件作为索引,但相应的,Iceberg 的 update 和 delete 并不确定想要更新或删除的记录是否存在,无论如何都会在 DeleteFile 里追加一条 delete 记录,至于这条记录是否真的存在,只有在读取时做合并后才知道。
本质上相当于把 tagging 的过程放在了读取阶段,尽管减少了写入时的成本,但会影响读取的效率。
二、实现2.1. upda ...
数据湖-Iceberg-源码学习-Kernel-Table Format-FileLayouts 设计
一、概述Iceberg 文件布局可以分为数据层(Data Layer) 和元数据层(Metedata Layer)。数据层是一系列实际存储数据记录的文件,而元数据层包括元数据描述文件、清单列表文件(Manifest List)、以及清单文件(Manifest File)。三类文件通过层级关系相互关联起来。
引用站外地址,不保证站点的可用性和安全性
Apache Iceberg 背后的设计
Joker
引用站外地址,不保证站点的可用性和安全性
浅谈 iceberg 的存储文件
Joker
二、架构设计2.1. CatalogIceberg Catalog API 用来保存和查找表的元数据,比如 Schema、 属性信息等。
2.2. Metadata ...
数据湖-Iceberg-源码学习-Kernel-Table Format-FileLayouts-优化-小文件
一、概述Iceberg 每次快照都产生了大量的文件。包括 Manifest 文件和数据文件 DataFile,以及快照文件和上述这些文件的校验文件。当存在删除更新操作,Manifest 文件和数据文件又拆分出来删除类型的对应文件 DeleteFile,当快照执行场率过高且每次操作数据量较小时,会产生大量的小文件,从而导致系统性能减弱,为解决这类问题,Iceberg 也提供了相应的文件合并、重写等操作来减轻这类问题。
二、设计
https://blog.csdn.net/naisongwen
http://www.360doc.com/content/22/0214/16/76878877_1017395542.shtml
2.1. 文件重写图中在两个事务(snap-1 和 snap-2 )中分别增加 1 条记录,生成 2 个 manifest 文件和 2 个 datafile 文件,希望这两条记录位于同一个文件,此时需要在 snap-3 中将数据文件 datafile-1 和 datafile-2 删除,为了能够保证之前的快照数据不被破坏,在 snap-3 中增加指向这两个文件的 ...
数据湖-Iceberg-源码学习-Kernel-Table Format-数据写入
一、概述如图所示,Iceberg 在数据写入的时候:
Iceberg 先把数据写入到 DataFile 文件中
当一组 DataFile 文件写完之后,会根据这个 DataFile 文件中 column 的一些统计信息(如: 每个 column 的 min/max 值),生成一个对应的 manifest 文件
然后 Iceberg 把一次写入后涉及到的 manifest 文件组成一个 manifest list, manifest list 文件中也会存入一些相 manifest 的统计信息(如: 分区信息等)
然后按照整个 manifest list 生成一个对应的 snapshot 文件
生成完 snapshot 文件之后,Iceberg 会把当前 snapshot 的 ID 及存储路径等信息写人到 metadata.json 中。
当一切准备完毕之后,会以原子操作的方式提交元数据文件 metadata.json
二、设计
https://zhuanlan.zhihu.com/p/488467438
https://mp.weixin.qq.com/s/n97nixd ...
数据湖-Iceberg-源码学习-Kernel-Table Format-数据读取-数据过滤
一、概述在 Iceberg 中自上而下买现了三层的数据过滤策路分别是: 分区裁剪、文件过滤和 RowGroup 过滤。
https://zhuanlan.zhihu.com/p/530355680
二、设计2.1. 分区剪裁Iceberg 支持分区裁剪优化,对于分区表来说,优化器可以自动从 where 条件中根据分区键直接提取出需要访问的分区,从而避免扫描所有的分区,降低了 IO 请求。Iceberg 实现分区剪枝并不依赖文件所在的目录,而是利用了 Iceberg 的文件布局。在 Iceberg 的每个 Snapshot 中都存储所有 manifest 清单文件的包含分区列信息,每个清单文件每个数据文件中存储分区列值信息。这些元数据信息可以帮助确定每个分区中包含哪些文件。这样实现的好处是:
无需调用文件系统的 list 操作,可以直接定位到属于分区的数据文件。
partition 的存储方式是透明的,用户在查询时无需指定分区,Iceberg 可以自己实现分区的转换,即使用户修改分区信息后,用户无需重写之前的数据。
2.2. 文件过滤Iceberg 提供了文件级别的统计信息, ...
数据湖-Iceberg-源码学习-API-Catalog 设计
一、概述Iceberg Catalog API 用来保存和查找表的元数据,比如 Schema、 属性信息等。
二、设计2.1. Metadata LayerIceberg 数据表每一次的修改后的状态都会在 Metadata Layer 层中生成一个 Snapshot (s0,s1) 文件,Snapshot 文件中包含一个 Manifest List, List 中存储了当前的 Snapshot 状态是由哪些 Manifest 文件组成。每个 Manifest 的文件会指向到真实数据的存储文件 Date File(一股是 parquet 格式)。
2.2. Catalog APICatalog API 良好的抽象来对接数据存储和元数据管理
如上图所示,Catalog 主要提供几方面的抽象。
数据 IO: File IO 都是可以定制,包括读写和删除;
元数据管理
https://zhuanlan.zhihu.com/p/389904827?utm_id=0
2.2.1. Catalog 接口Iceberg 为了支持多种 Catalog,定义了自己的 Catalog 规范,接口 ...
Spark-源码学习-SparkCore-存储服务-内存组件-内存管理器 UnifiedMemoryManager
一、概述UnifiedMemoryManager 是从 1.6 开始的统一内存管理模型,统一内存管理机制,与静态内存管理的区别在于存储内存和执行内存共享同一块空间,可以动态占用对方的空闲区域
二、实现2.1. 成员属性
maxHeapMemory: 最大堆内存。大小为系统可用内存与 spark.memory.fraction 属性值的乘积
onHeadpStorageRegionSize: 用于存储的堆内存大小。
numCores: CPU 内核数
2.2. 主要方法
三、内存申请3.1. 执行内存$UnifiedMemoryManager.accquireExecutionMemory()$ 方法申请执行内存~当任务尝试从 executor 中申请 numBytes 大小的内存该方法直接向 ExecutionMemoryPool 索要所需内存:
当 ExecutionMemory 内存充足,则不会触发向 Storage 申请内存: $maybeGrowExecutionPool()$
UnifiedMemoryManager 其中最重要的优化在于动态占用机制, ...