数据湖的选型
此文章只是作为文稿记录,且截止到2022年11月份
Hudi(0.12.0)支持spark 3.3.x 3.1.x
是 Hadoop Upserts Deletes and Incrementals 的简写
Hudi在华为的实践
- clustering
- 支持常见的order以及z-order(里面以后优化https://github.com/delta-io/delta/pull/1149)、Hibert
- FileSkipping依赖于 min-max统计信息,BloomFilter,BitMap,二级索引
- DataSkipping 可以通过结合数据布局以及FileSKipping做更好的优化
- MDT(MetaDataTable)
- 位于Hudi表的.hoodie目录
- Column_stats/BloomFilter
- 高性能的fileList
对超大规模的数据集时,FileList是不可避免的操作,在HDFS上进行该操作还可以接受,一旦涉及到对象存储,大规模的FileList效率及其低下,Hudi引入MDT将文件
信息直接保存下来,避免了大规模的FileList - 有自己独立的元数据管理服务?如果有,怎么实现的?
- 支持MOR COW
- merge on read/copy on write
- 快速 upsert(支持SQL)https://hudi.apache.org/docs/quick-start-guide#mergeinto
Hudi/Iceberg/deltalake
- 表有主键的概念
用于定位数据的位置以便于高效的读写操作,
具体index分 Bloom index,simple index,Hbase index, Hash index - 支持多种存储HDFS,OSS,S3
和OSS的集成 https://hudi.apache.org/docs/oss_hoodie/
和MINio的集成 https://mp.weixin.qq.com/s/jBciMVsdWmRHRjEyyckQlQ - 支持update upsert(merge)参考 HoodieAnalysis的 updataTable(spark把这个逻辑计划留了出来) 支持CDC CDC怎么实现的?(记录级别还是表级别)
- datasource 是基于spark DataSource V1
- 支持 flink sql upsert
详见 HoodieTableSink的getSinkRuntimeProvider - 自己实现了小文件的合并
Iceberg(0.14.1)支持spark 3.3.x 支持 3.1.x
-
catalog
Iceberg有catalog的概念,是对表进行管理(create,drop等)的一个组件
目前有HiveCatalog和HadoopCatalog:- HiveCatalog目前的metadata文件路径存储在MetaStore路径下
不依赖于文件系统rename的原子性 - HadoopCatalog目前的metadata文件路径存储在同一个目录下
依赖于文件系统的rename的原子性 - JDBCCatalog
通过数据库的lock来提供原子性的保证
- HiveCatalog目前的metadata文件路径存储在MetaStore路径下
-
选择性问题
数据湖Iceberg- 社区是出于什么考虑实现两种不兼容的Catalog?
- 因为两者不兼容,必须选择其一作为系统唯一的Catalog,那是选择HiveCatalog还是HadoopCatalog,为什么?
- 两种catalog的怎么做迁移?
- 支持哪些存储?
支持hadoopcatalog 应该就是支持oss,因为oss是套用了hadoop那一套框架? https://help.aliyun.com/document_detail/164694.html
-
特性
- 支持快照的读写分离回溯,以及不绑定任何计算引擎。
- 空间查询曲线 Tencent
hibert Dragon Gosper z-order 等数据布局方式 - Bit-sliced Encoded Bitmap 用来处理range 查询这种情况[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EVTzqpVY-1681778490020)(null)]
-
已知问题:
- 目前还不支持CDC https://github.com/apache/iceberg/issues/3941
-
datasource 是基于spark DataSource V2的
-
支持update,支持upsert(merge),具体看类IcebergSparkSqlExtensionsParser.replaceRowLevelCommands
- 好像是可以,待验证 https://iceberg.apache.org/docs/latest/getting-started/#writing
-
支持 flink sql upsert
- 详见 flinkSink 的 chainIcebergOperators 方法
- DeleteFile有两种方式
- Position Delete
- 文件里记录的是哪个文件的第几条记录需要被删除
- spark的MOR只支持Position Delete
- Equality Delete
- 文件里记录的是过滤条件,可能读了很多文件,但是不一定被删除,即apply的速度比较慢
- flink的 CDC 场景记录的就是这种方式
- Position Delete
- 两种实现方式
- copy on write 类似spark的overwrite
- table scan 根据筛选条件选出所有需要更新的文件,在write阶段生成的的文件,旧的文件会被标记为删除
- merge on read 写的时候生成Delete文件,读的时候将Delete文件应用到DataFile中
- 读取的时候,读取Position DeleteFile应用到旧的数据文件后,加上新生成的数据文件,最后得到更新之后的结果
- copy on write 类似spark的overwrite
-
分区是隐藏的,在查询时不需要添加关于分区的筛选条件,建表的时候指定分区的来源(由哪个字段计算而来)
-
需要额外的服务治理小文件,额外的服务清理过期的snapshot
-
支持多种存储,如 S3,oss,HDFS 等
delta lake(2.1.0) 支持 3.3.x ,delta 1.0.1 支持 3.1.x
- Change Data Feed
- z-order
- 幂等写入
- 列作为元数据变更操作来删除
- 动态分区覆盖
- multi-part checkpoints 的实验性支持
- 编写大型 scala 性能基准测试的框架
- COW/ROM
- 在写的时候也会进行文件合并 参考https://blog.csdn.net/monkeyboy_tech/article/details/112234164
- 在读的时候也会进行合并 参考https://blog.csdn.net/monkeyboy_tech/article/details/112286381
- 支持CDC
- CDC怎么实现的?
通过持久化CDC(AddCDCFile)和非持久化CDC(update的记录)
基于action为AddCDCFile的文件做的
-
datasource 是基于spark DataSource V2的
https://docs.databricks.com/delta/delta-change-data-feed.html -
支持update 支持upsert(merge) 怎么实现的?(支持SQL) 查看DeltaAnalys规则
- api级别 https://docs.delta.io/latest/delta-update.html#upsert-into-a-table-using-merge 先删除后写入
- 对flink的支持不太友好 (still in progress)
- 单独开的项目 https://github.com/delta-io/connectors
三者对比
相关文章
- hudi
- https://mp.weixin.qq.com/s/hH7QumzG-0HecAVjqxEQHg
- https://mp.weixin.qq.com/s/MRgZtXnYlg-AyJnHA59LXw
- https://mp.weixin.qq.com/s/7aUj0IWE9ArFSg4gubVmwg
- https://mp.weixin.qq.com/s/YGM2JbzxQiLxpASVtngyoQ
- https://mp.weixin.qq.com/s/jBciMVsdWmRHRjEyyckQlQ
- https://mp.weixin.qq.com/s/wUSYE_BVp_ezEqx7HNDWmg
- iceberg
- https://mp.weixin.qq.com/s/QBIozrtOF5rVnQjneBFS0g
- https://mp.weixin.qq.com/s/GApSqeq797fIlkovjfyLOQ
- https://mp.weixin.qq.com/s/tvj3zL3AR8c-uBY2-xVl6A
- https://appukvkryx45804.pc.xiaoe-tech.com/detail/i_6325ba3ae4b050af23b8215f/1?from=p_618dcca0e4b0c005c9902656&fromH5=true&type=6
- https://appukvkryx45804.pc.xiaoe-tech.com/detail/i_63282e8de4b0c94264971e70/1?from=p_618dcca0e4b0c005c9902656&fromH5=true&type=6
- delta lake
- https://mp.weixin.qq.com/s/seLje8yo9oI4Ie9d1qJEuw
- https://mp.weixin.qq.com/s/R6YyR-19Vn0XTprIF8injw
- https://mp.weixin.qq.com/s/AYClOiI4mbsNPN8TfgF5eQ
- https://appukvkryx45804.pc.xiaoe-tech.com/detail/i_63437fc9e4b0eca59c3b9327/1?fromH5=true
-
lakehouse
https://mp.weixin.qq.com/s/R6YyR-19Vn0XTprIF8injw
https://appukvkryx45804.h5.xiaoeknow.com/v2/course/alive/l_632180f4e4b00a4f3740e4d8?type=2&app_id=appukVkRYx45804&available=true&share_user_id=u_607a11801629e_g60oUULXet&share_type=5&scene=%E5%88%86%E4%BA%AB&share_scene=1&entry=2&entry_type=2001&state=772b18c31531e20f27880ac1e0d299ec_GE5d1O -
直播
https://appukvkryx45804.h5.xiaoeknow.com/v2/course/alive/l_632180f4e4b00a4f3740e4d8?app_id=appukVkRYx45804&available=true&entry=2&entry_type=2001&scene=%E5%88%86%E4%BA%AB&share_scene=1&share_type=5&share_user_id=u_607a11801629e_g60oUULXet&type=2 -
ZOrder
https://docs.google.com/document/d/1TYFxAUvhtYqQ6IHAZXjliVuitA5D1u793PMnzsH_3vs/edit# -
需要验证的问题
- delta cdc的实现(是按照文件级别来做的变更?)
https://docs.delta.io/latest/delta-change-data-feed.html
- delta cdc的实现(是按照文件级别来做的变更?)
-
benchmark
https://github.com/delta-io/delta/tree/master/benchmarks
火山引擎分享
Apache Hudi
存在数据孤岛,数据可靠性非强保障, =》需要统一元数据服务
实时入湖成本高,用户理解成本高 =》表操作管理服务
华为终端分享
apache iceberg
做了很多改造