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