增加Hudi调优
This commit is contained in:
parent
769218324a
commit
a66b21fe8f
@ -55,4 +55,64 @@
|
|||||||
|
|
||||||
### COW表
|
### COW表
|
||||||
|
|
||||||
|
- Flink的状态后端设置为RocksDB,默认为内存。
|
||||||
|
- 增大write.task.max.size和write.merge.max_memory(默认1024MB和100MB,调整为2014MB和1024MB)
|
||||||
|
- 在配置TM内存的时候,需要保证每个写任务都能分配到write.task.max.size对应的内存。需要保留一部分内存给TM的网络缓冲区和其他类型的任务(如bucketAssignFunctio)使用。
|
||||||
|
|
||||||
|
|
||||||
|
## Bulk Insert
|
||||||
|
|
||||||
|
- 用于快照数据导入。如果快照数据来自其他数据源,可以使用bulk_insert模式将快照数据快速导入到Hudi中。
|
||||||
|
- bulk_insert消除了序列化和数据合并。用户无需重复数据删除,因此需要保证数据的唯一性。
|
||||||
|
- bulk_insert在批处理执行模式下效率更高。批处理执行方式根据分区路径对输入记录进行排序,并将这些记录写入Hudi,避免了频繁切换文件句柄导致的写性能下降。有序写入一个分区中不会频繁写换对应的数据分区。
|
||||||
|
- bulk_insert的并行度由write.tasks指定。并行度会影响小文件的数量。
|
||||||
|
从理论上讲,bulk_insert的并行性是bucket的数量(特别是,当每个bucket写到最大文件大小时,它将转到新的文件句柄。最后,文件的数量>= write.bucket_assign.tasks)。
|
||||||
|
|
||||||
|
|
||||||
|
|参数名称 | 描述 | 默认值 | 备注 |
|
||||||
|
|----|----|----|----|
|
||||||
|
| write.operation | | upsert | |
|
||||||
|
| write.bulk_insert.shuffle_by_partition | 写入前是否根据分区字段进行shuffle。启用此选项将减少小文件的数量,但可能存在数据倾斜的风险 | true | |
|
||||||
|
| write.bulk_insert.sort_by_partition | 写入前是否根据分区字段对数据进行排序。启用此选项将在写任务写多个分区时减少小文件的数量 | true | |
|
||||||
|
| write.sort.memory | Sort时使用的最大内存 | 128 | |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Index Bootstrap
|
||||||
|
|
||||||
|
- 用于snapshot data+incremental data导入的需求。如果snapshot data已经通过bulk insert插入到Hudi中。通过Index Bootstrap功能,用户可以实时插入incremental data,保证数据不重复,构造离线数据indexState
|
||||||
|
- 可以在写入快照数据的同时增加资源以流模式写入,然后减少资源以写入增量数据(或打开速率限制函数)。
|
||||||
|
|
||||||
|
|参数名称 | 描述 | 默认值 | 备注 |
|
||||||
|
|----|----|----|----|
|
||||||
|
| index.bootstrap.enabled | 启index.bootstrap.enabled时,Hudi表中的剩余记录将一次性加载到Flink状态 | false | |
|
||||||
|
| index.partition.regex | 优化选择。设置正则表达式来过滤分区。默认情况下,所有分区都被加载到flink状态 | * | |
|
||||||
|
|
||||||
|
## 模式
|
||||||
|
|
||||||
|
|
||||||
|
### Changelog Mode
|
||||||
|
|
||||||
|
Hudi可以保留消息的所有中间变化(+I / -U / +U / -D),然后通过flink的状态计算消费,从而拥有一个接近实时的数据仓库ETL管道(增量计算)。
|
||||||
|
|
||||||
|
|参数名称 | 描述 | 默认值 |
|
||||||
|
|----|----|----|
|
||||||
|
| changelog.enabled | 它在默认情况下是关闭的,为了拥有upsert语义,只有合并的消息被确保保留,中间的更改可以被合并。设置为true以支持使用所有更改 | true |
|
||||||
|
|
||||||
|
- 批处理(快照)读取仍然合并所有中间更改,不管格式是否存储了中间更改日志消息。
|
||||||
|
- changelog.enable设置为true后,更改日志记录的保留只是最好的工作:异步压缩任务将更改日志记录合并到一个记录中,因此,如果流源不及时使用,则压缩后只能读取每个键的合并记录。
|
||||||
|
解决方案是通过调整compact策略,比如压缩选项:compress.delta_commits和compression .delta_seconds,为读取器保留一些缓冲时间。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Insert Mode
|
||||||
|
|
||||||
|
- 默认情况下,Hudi对插入模式采用小文件策略:MOR将增量记录追加到日志文件中,COW合并 base parquet文件(增量数据集将被重复数据删除)。这种策略会导致性能下降。
|
||||||
|
- 如果要禁止文件合并行为,可将write.insert.deduplicate设置为false,则跳过重复数据删除。每次刷新行为直接写入一个new parquet文件(MOR表也直接写入parquet文件)。
|
||||||
|
- 适用于能否在外部保证写入hudi cow表的数据是单调递增的或者可以不在乎重复数据的情况,但是可能会存在小文件问题。
|
||||||
|
|
||||||
|
|参数名称 | 描述 | 默认值 |
|
||||||
|
|----|----|----|
|
||||||
|
| write.insert.deduplicate | Insert mode 默认启用重复数据删除功能。关闭此选项后,每次刷新行为直接写入一个now parquet文件 | true |
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user