数据湖的选型(delta iceberg hudi)以及比对

数据湖的选型

此文章只是作为文稿记录,且截止到2022年11月份

Hudi(0.12.0)支持spark 3.3.x 3.1.x

是 Hadoop Upserts Deletes and Incrementals 的简写
Hudi在华为的实践

  1. clustering
  • 支持常见的order以及z-order(里面以后优化https://github.com/delta-io/delta/pull/1149)、Hibert
  • FileSkipping依赖于 min-max统计信息,BloomFilter,BitMap,二级索引
  • DataSkipping 可以通过结合数据布局以及FileSKipping做更好的优化
  1. MDT(MetaDataTable)
  • 位于Hudi表的.hoodie目录
  • Column_stats/BloomFilter
  • 高性能的fileList
    对超大规模的数据集时,FileList是不可避免的操作,在HDFS上进行该操作还可以接受,一旦涉及到对象存储,大规模的FileList效率及其低下,Hudi引入MDT将文件
    信息直接保存下来,避免了大规模的FileList
  • 有自己独立的元数据管理服务?如果有,怎么实现的?
  1. 支持MOR COW
    • merge on read/copy on write
    • 快速 upsert(支持SQL)https://hudi.apache.org/docs/quick-start-guide#mergeinto
      Hudi/Iceberg/deltalake
  2. 表有主键的概念
    用于定位数据的位置以便于高效的读写操作,
    具体index分 Bloom index,simple index,Hbase index, Hash index
  3. 支持多种存储HDFS,OSS,S3
    和OSS的集成 https://hudi.apache.org/docs/oss_hoodie/
    和MINio的集成 https://mp.weixin.qq.com/s/jBciMVsdWmRHRjEyyckQlQ
  4. 支持update upsert(merge)参考 HoodieAnalysis的 updataTable(spark把这个逻辑计划留了出来) 支持CDC CDC怎么实现的?(记录级别还是表级别)
  5. datasource 是基于spark DataSource V1
  6. 支持 flink sql upsert
    详见 HoodieTableSink的getSinkRuntimeProvider
  7. 自己实现了小文件的合并

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. 选择性问题
    数据湖Iceberg

    • 社区是出于什么考虑实现两种不兼容的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
  1. 支持CDC
  • CDC怎么实现的?
    通过持久化CDC(AddCDCFile)和非持久化CDC(update的记录)
    基于action为AddCDCFile的文件做的
  1. datasource 是基于spark DataSource V2的
    https://docs.databricks.com/delta/delta-change-data-feed.html

  2. 支持update 支持upsert(merge) 怎么实现的?(支持SQL) 查看DeltaAnalys规则

  • api级别 https://docs.delta.io/latest/delta-update.html#upsert-into-a-table-using-merge 先删除后写入
  1. 对flink的支持不太友好 (still in progress)
  • 单独开的项目 https://github.com/delta-io/connectors

三者对比

Delta, Hudi, Iceberg对比

相关文章

  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
  1. 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
  1. 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
  1. 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

  2. 直播
    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

  3. ZOrder
    https://docs.google.com/document/d/1TYFxAUvhtYqQ6IHAZXjliVuitA5D1u793PMnzsH_3vs/edit#

  4. 需要验证的问题

    • delta cdc的实现(是按照文件级别来做的变更?)
      https://docs.delta.io/latest/delta-change-data-feed.html
  5. benchmark
    https://github.com/delta-io/delta/tree/master/benchmarks


火山引擎分享
Apache Hudi
存在数据孤岛,数据可靠性非强保障, =》需要统一元数据服务
实时入湖成本高,用户理解成本高 =》表操作管理服务

华为终端分享
apache iceberg
做了很多改造

你可能感兴趣的:(数据湖,大数据,闲谈,大数据,hadoop,spark)