更新时间:2025-07-01 GMT+08:00
分享

确定表索引

表索引介绍

索引类型

索引特点

支持引擎

优选场景

SIMPLE

  • 分区级更新,同主键数据写到不同分区时不会触发更新,会出现数据重复。
  • 比较吃内存,采用join方式完成更新。

Spark

  • cow表,批场景。

BUCKET

  • 每一行数据都按照设置的桶数去哈希到对应的bucket桶,写入速度最快。
  • 无数据量级限制,大数据场景表现突出,分桶可以打散数据,有效控制文件数量。
  • 多引擎兼容,Flink和Spark同时操作同一个hudi表时必须使用该索引。

Spark/Flink

  • mor表,流场景,实时写入。
  • mor表,批场景。
  • cow表,无更新的append场景,实时写入。适合于对写入性能有要求和点查场景,但是append会产生非常多的小文件,需要搭配分区过滤和bucket桶过滤来使用。对MRS版本有要求,使用前先咨询。
  • cow表,每次都是insert overwrite写入。

BLOOM

  • 分区级更新,同主键数据写到不同分区时不会触发更新,会出现数据重复。
  • BLOOM索引在大数据量场景的性能表现与更新的数据量有关,更新占比越大,性能越差;大数据量场景产生的文件数量较多,不推荐使用。

Spark

  • cow表,批场景,更新占比20%以内。
  • mor表,批场景,更新占比20%以内。

GLOBAL_BLOOM

  • 表级更新,同主键数据写到不同分区也会更新。
  • 大数据量场景性能很差,一般不推荐使用

Spark

  • 数据量百万以内,全局去重场景。

GLOBAL_SIMPLE

  • 表级更新,同主键数据写到不同分区也会更新。
  • 大数据量场景性能很差,一般不推荐使用

Spark

  • 数据量百万以内,全局去重场景。

经典场景:

  • COW表一直使用insert overwrite方式写入,可以选择BUCKET索引。
  • COW使用insert into方式写入,要慎用BUCKET索引,因为BUCKET索引可能导致增量数据要去更新所有的BUCKET桶,后面会越写越慢。数据量在万级或百万级,COW选择SIMPLE和BUCKET都可以,差别不是很大。数据量在千万级以上,建议SIMPLE。
  • MOR表使用insert into方式写入,推荐BUCKET索引,它可以适用于多引擎混写混读,也可以适用于大数据量场景,是一个非常通用的方案,缺点就是需要定期做compaction。
  • MOR表没必要一直使用insert overwrite写入,直接用COW表 + insert overwrite + BUCKET索引。

确认BUCKET索引桶数(BUCKET索引表必须参考此内容预估桶数)

Hudi表的bucket桶数需要在建表时确定,后期不能变更,桶数设置不合理将会导致严重的性能问题,必须按照以下步骤去预估bucket桶数:

  • 非分区表
    1. 预估Hudi表总数据条数A,不能是现有的存量数据条数,要考虑该Hudi表未来5年的增幅,比如5年内该Hudi表总数据量增长到A。
    2. 确认Hudi表单条数据大小B(kb),使用limit 100随机查询源表的100条业务数据,将这100条业务数据放到txt文件里,B = txt文件大小kb / 100。
    3. 确认Hudi表未压缩前数据量C(G), C = A*B/1024/1024。
    4. 预估Hudi表桶数D,D = MAX(取整(C/2*1.5), 4)

    D = MAX(取整(C/2*1.5), 4),此公式中数字2的含义是2G数据分一个bucket桶,数字1.5的含义是无分区表多预留1.5倍的bucket桶数。

  • 分区表
    1. 预估Hudi表单个分区内的总数据条数A,注意不是整表数据量,而是单个分区未来5年内的总数据量增长到A。比如按天分区,那就要考虑未来几年后在一些特殊的节假日将会产生多少数据量;比如按年分区,那就要考虑未来几年后的业务数据增长量。
    2. 确认Hudi表单条数据大小B(kb),使用limit 100随机查询源表的100条业务数据,将这100条业务数据放到txt文件里,B = txt文件大小kb / 100。
    3. 确认Hudi表未压缩前数据量C(G), C = A*B/1024/1024。
    4. 预估Hudi表桶数D,D = MAX(取整(C/2), 1)
    1. 预估桶数要使用未压缩的数据量来预估,不能以源表中的压缩文件大小为准,比如parquet文件。
    2. 桶的设置以偶数最佳,非分区表最小桶数请设置4个,分区表最小桶数请设置1个。

相关文档