确定表索引
表索引介绍
索引类型 |
索引特点 |
支持引擎 |
优选场景 |
---|---|---|---|
SIMPLE |
|
Spark |
|
BUCKET |
|
Spark/Flink |
|
BLOOM |
|
Spark |
|
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桶数:
- 非分区表
- 预估Hudi表总数据条数A,不能是现有的存量数据条数,要考虑该Hudi表未来5年的增幅,比如5年内该Hudi表总数据量增长到A。
- 确认Hudi表单条数据大小B(kb),使用limit 100随机查询源表的100条业务数据,将这100条业务数据放到txt文件里,B = txt文件大小kb / 100。
- 确认Hudi表未压缩前数据量C(G), C = A*B/1024/1024。
- 预估Hudi表桶数D,D = MAX(取整(C/2*1.5), 4)
D = MAX(取整(C/2*1.5), 4),此公式中数字2的含义是2G数据分一个bucket桶,数字1.5的含义是无分区表多预留1.5倍的bucket桶数。
- 分区表
- 预估Hudi表单个分区内的总数据条数A,注意不是整表数据量,而是单个分区未来5年内的总数据量增长到A。比如按天分区,那就要考虑未来几年后在一些特殊的节假日将会产生多少数据量;比如按年分区,那就要考虑未来几年后的业务数据增长量。
- 确认Hudi表单条数据大小B(kb),使用limit 100随机查询源表的100条业务数据,将这100条业务数据放到txt文件里,B = txt文件大小kb / 100。
- 确认Hudi表未压缩前数据量C(G), C = A*B/1024/1024。
- 预估Hudi表桶数D,D = MAX(取整(C/2), 1)
- 预估桶数要使用未压缩的数据量来预估,不能以源表中的压缩文件大小为准,比如parquet文件。
- 桶的设置以偶数最佳,非分区表最小桶数请设置4个,分区表最小桶数请设置1个。