更新时间:2024-12-25 GMT+08:00
分享

Hudi表使用约束

Hudi表类型

  • Copy On Write

    写时复制表也简称COW表,使用parquet文件存储数据,内部的更新操作需要通过重写原始parquet文件完成。

    • 优点:读取时,只读取对应分区的一个数据文件即可,较为高效。
    • 缺点:数据写入的时候,需要复制一个先前的副本再在其基础上生成新的数据文件,这个过程比较耗时。且由于耗时,读请求读取到的数据相对就会滞后。
  • Merge On Read

    读时合并表也简称MOR表,使用列格式parquet和行格式Avro两种方式混合存储数据。其中parquet格式文件用于存储基础数据,Avro格式文件(也可叫做log文件)用于存储增量数据。

    • 优点:由于写入数据先写delta log,且delta log较小,所以写入成本较低。
    • 缺点:需要定期合并整理compact,否则碎片文件较多。读取性能较差,因为需要将delta log和老数据文件合并。
    表1 两种表类型的 trade-off

    Trade-off

    CopyOnWrite

    MergeOnRead

    Data Latency(数据时延)

    Query Latency(查询时延)

    Update cost (I/O)(更新时(I/O)开销)

    高(重写整个parquet)

    Parquet File Size(Parquet文件大小)

    小(更新时(I/O)开销大)

    大(更新时开销小)

    Write Amplification(写放大)

    低(取决于compaction策略)

Hudi表使用约束与限制

  • Hudi支持使用Spark SQL操作Hudi的DDL/DML的语法。但在使用DLI提供的元数据提交SparkSQL作业时,部分直接操作OBS路径的SQL语法暂不支持,详细说明请参考DLI Hudi SQL语法参考
  • 不支持在HetuEngine中写Hudi表,以及修改Hudi表结构,仅支持读Hudi表。
  • 创建Hudi表时,必须且需要正确配置 primaryKey 和 preCombineField,否则存在数据最终表现与预期不一致的风险。
  • 使用由DLI提供的元数据服务时,不支持创建DLI表,只支持创建OBS表,即必须通过LOCATION参数配置表路径。
  • 使用由LakeFormation提供的元数据服务时,创建内表和外表均支持。需要注意:在DROP内表时,数据也会被同步删除。
  • 在提交Spark SQL或Flink SQL作业时,无需手动配置Hudi的 hoodie.write.lock.provider 配置项,但在提交Spark jar作业时必须手动配置,请见 Hudi锁配置说明 一节。
  • Hudi和队列计算引擎的版本对应关系为:

    计算引擎

    版本

    Hudi版本

    Spark

    3.3.1

    0.11.0

    Flink

    1.15

    0.11.0

    Hetu

    2.1.0

    0.11.0

    如何判断队列支持的计算引擎版本:首先进入DLI的控制台界面,点击左侧菜单栏的”资源管理”-> ”队列管理”。在队列管理的界面筛选并选中需要查询的队列,随后点击窗口底部的窗格,展开隐藏的队列详情页面,在支持版本即可查看可用的计算引擎版本。对于SQL队列,无法切换版本,查看默认版本即可判断当前使用的计算引擎版本。

相关文档