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

Hudi常见配置参数

本章节介绍Hudi重要配置的详细信息,更多配置请参考hudi官网:https://hudi.apache.org/cn/docs/0.11.0/configurations/。

  • 提交DLI Spark SQL作业时,在SQL编辑器界面右上角的”设置”->”参数设置”中可以配置Hudi参数。
  • 提交DLI Spark jar作业时,Hudi参数可以通过Spark datasource API的option来配置。

    或者,在提交作业时配置到"Spark参数(--conf)" 中,注意,此处配置的参数,键需要添加前缀 ”spark.hadoop.”,例如”spark.hadoop.hoodie.compact.inline=true”

写入操作配置

表1 写入操作重要配置项

参数

描述

默认值

hoodie.datasource.write.table.name

指定写入的hudi表名。

hoodie.datasource.write.operation

写hudi表指定的操作类型,当前支持upsert、delete、insert、bulk_insert等方式。

  • upsert:更新插入混合操作
  • delete:删除操作
  • insert:插入操作
  • bulk_insert: 用于初始建表导入数据, 注意初始建表禁止使用upsert、insert方式
  • insert_overwrite:对静态分区执行insert overwrite
  • insert_overwrite_table:动态分区执行insert overwrite,该操作并不会立刻删除全表做overwrite,会逻辑上重写hudi表的元数据,无用数据后续由hudi的clean机制清理。效率比bulk_insert + overwrite 高

upsert

hoodie.datasource.write.table.type

指定hudi表类型,一旦这个表类型被指定,后续禁止修改该参数,可选值MERGE_ON_READ。

COPY_ON_WRITE

hoodie.datasource.write.precombine.field

该值用于在写之前对具有相同的key的行进行合并去重。

指定为具体的表字段

hoodie.datasource.write.payload.class

在更新过程中,该类用于提供方法将要更新的记录和更新的记录做合并,该实现可插拔,如要实现自己的合并逻辑,可自行编写。

org.apache.hudi.common.model.DefaultHoodieRecordPayload

hoodie.datasource.write.recordkey.field

用于指定hudi的主键,hudi表要求有唯一主键。

指定为具体的表字段

hoodie.datasource.write.partitionpath.field

用于指定分区键,该值配合hoodie.datasource.write.keygenerator.class使用可以满足不同的分区场景。

hoodie.datasource.write.hive_style_partitioning

用于指定分区方式是否和hive保持一致,建议该值设置为true。

true

hoodie.datasource.write.keygenerator.class

配合hoodie.datasource.write.partitionpath.field,hoodie.datasource.write.recordkey.field产生主键和分区方式。

说明:

写入设置KeyGenerator与表保存的参数值不一致时将提示需要保持一致。

org.apache.hudi.keygen.ComplexKeyGenerator

同步Hive表配置

由DLI提供的元数据服务是一种Hive Metastore服务(HMS),因此下列参数与同步元数据服务相关。

表2 同步Hive表参数配置

参数

描述

默认值

hoodie.datasource.hive_sync.enable

是否同步hudi表信息到Hive。当使用DLI提供的元数据服务时,配置该参数代表同步至DLI的元数据中。

注意:

建议该值设置为true,统一使用元数据服务管理hudi表。

false

hoodie.datasource.hive_sync.database

要同步给hive的数据库名。

default

hoodie.datasource.hive_sync.table

要同步给hive的表名,建议这个值和hoodie.datasource.write.table.name保证一致。

unknown

hoodie.datasource.hive_sync.partition_fields

用于决定hive分区列。

""

hoodie.datasource.hive_sync.partition_extractor_class

用于提取hudi分区列值,将其转换成hive分区列。

org.apache.hudi.hive.SlashEncodedDayPartitionValueExtractor

hoodie.datasource.hive_sync.support_timestamp

当hudi表存在timestamp类型字段时,需指定此参数为true,以实现同步timestamp类型到hive元数据中。该值默认为false,默认将timestamp类型同步为bigInt,默认情况可能导致使用sql查询包含timestamp类型字段的hudi表出现错误。

true

hoodie.datasource.hive_sync.username

使用jdbc方式同步Hive时,指定的用户名。

hive

hoodie.datasource.hive_sync.password

使用jdbc方式同步Hive时,指定的密码。

hive

hoodie.datasource.hive_sync.jdbcurl

连接hive jdbc指定的连接。

""

hoodie.datasource.hive_sync.use_jdbc

是否使用Hive jdbc方式连接Hive同步Hudi表信息。建议该值设置为false,设置为false后jdbc连接相关配置无效。

true

index相关配置

表3 index相关参数配置

参数

描述

默认值

hoodie.index.class

用户自定义索引的全路径名,索引类必须为HoodieIndex的子类,当指定该配置时,其会优先于hoodie.index.type配置。

""

hoodie.index.type

使用的索引类型,默认为布隆过滤器。可能的选项是[BLOOM | GLOBAL_BLOOM | SIMPLE | GLOBAL_SIMPLE] 。 布隆过滤器消除了对外部系统的依赖,并存储在Parquet数据文件的页脚中。

BLOOM

hoodie.index.bloom.num_entries

存储在布隆过滤器中的条目数。 假设maxParquetFileSize为128MB,averageRecordSize为1024B,因此,一个文件中的记录总数约为130K。 默认值(60000)大约是此近似值的一半。

注意:

将此值设置得太低,将产生很多误报,并且索引查找将必须扫描比其所需的更多的文件;如果将其设置得非常高,将线性增加每个数据文件的大小(每50000个条目大约4KB)。

60000

hoodie.index.bloom.fpp

根据条目数允许的错误率。 用于计算应为布隆过滤器分配多少位以及哈希函数的数量。通常将此值设置得很低(默认值:0.000000001),在磁盘空间上进行权衡以降低误报率。

0.000000001

hoodie.bloom.index.parallelism

索引查找的并行度,其中涉及Spark Shuffle。 默认情况下,根据输入的工作负载特征自动计算的。

0

hoodie.bloom.index.prune.by.ranges

为true时,从文件框定信息,可以加快索引查找的速度。 如果键具有单调递增的前缀,例如时间戳,则特别有用。

true

hoodie.bloom.index.use.caching

为true时,将通过减少用于计算并行度或受影响分区的IO来缓存输入的RDD以加快索引查找。

true

hoodie.bloom.index.use.treebased.filter

为true时,启用基于间隔树的文件过滤优化。与暴力模式相比,此模式可根据键范围加快文件过滤速度。

true

hoodie.bloom.index.bucketized.checking

为true时,启用了桶式布隆过滤。这减少了在基于排序的布隆索引查找中看到的偏差。

true

hoodie.bloom.index.keys.per.bucket

仅在启用bloomIndexBucketizedChecking并且索引类型为bloom的情况下适用。

此配置控制“存储桶”的大小,该大小可跟踪对单个文件进行的记录键检查的次数,并且是分配给执行布隆过滤器查找的每个分区的工作单位。 较高的值将分摊将布隆过滤器读取到内存的固定成本。

10000000

hoodie.bloom.index.update.partition.path

仅在索引类型为GLOBAL_BLOOM时适用。

为true时,当对一个已有记录执行包含分区路径的更新操作时,将会导致把新记录插入到新分区,而把原有记录从旧分区里删除。为false时,只对旧分区的原有记录进行更新。

true

存储配置

表4 存储参数配置

参数

描述

默认值

hoodie.parquet.max.file.size

Hudi写阶段生成的parquet文件的目标大小。对于DFS,这需要与基础文件系统块大小保持一致,以实现最佳性能。

120 * 1024 * 1024 byte

hoodie.parquet.block.size

parquet页面大小,页面是parquet文件中的读取单位,在一个块内,页面被分别压缩。

120 * 1024 * 1024 byte

hoodie.parquet.compression.ratio

当Hudi尝试调整新parquet文件的大小时,预期对parquet数据进行压缩的比例。 如果bulk_insert生成的文件小于预期大小,请增加此值。

0.1

hoodie.parquet.compression.codec

parquet压缩编解码方式名称,默认值为gzip。可能的选项是[gzip | snappy | uncompressed | lzo]

snappy

hoodie.logfile.max.size

LogFile的最大值。这是在将日志文件移到下一个版本之前允许的最大值。

1GB

hoodie.logfile.data.block.max.size

LogFile数据块的最大值。这是允许将单个数据块附加到日志文件的最大值。 这有助于确保附加到日志文件的数据被分解为可调整大小的块,以防止发生OOM错误。此大小应大于JVM内存。

256MB

hoodie.logfile.to.parquet.compression.ratio

随着记录从日志文件移动到parquet,预期会进行额外压缩的比例。 用于merge_on_read存储,以将插入内容发送到日志文件中并控制压缩parquet文件的大小。

0.35

compaction&cleaning配置

表5 compaction&cleaning参数配置

参数

描述

默认值

hoodie.clean.automatic

是否执行自动clean。

true

hoodie.cleaner.policy

要使用的清理政策。Hudi将删除旧版本的parquet文件以回收空间。 任何引用此版本文件的查询和计算都将失败。建议确保数据保留的时间超过最大查询执行时间。

KEEP_LATEST_COMMITS

hoodie.cleaner.commits.retained

保留的提交数。因此,数据将保留为num_of_commits * time_between_commits(计划的),这也直接转化为逐步提取此数据集的数量。

10

hoodie.keep.max.commits

触发归档操作的commit数阈值。

30

hoodie.keep.min.commits

归档操作保留的commit数。

20

hoodie.commits.archival.batch

这控制着批量读取并一起归档的提交即时的数量。

10

hoodie.parquet.small.file.limit

该值应小于maxFileSize,如果将其设置为0,会关闭此功能。由于批处理中分区中插入记录的数量众多,总会出现小文件。Hudi提供了一个选项,可以通过将对该分区中的插入作为对现有小文件的更新来解决小文件的问题。此处的大小是被视为“小文件大小”的最小文件大小。

104857600 byte

hoodie.copyonwrite.insert.split.size

插入写入并行度。为单个分区的总共插入次数。写出100MB的文件,至少1KB大小的记录,意味着每个文件有100K记录。默认值是超额配置为500K。 为了改善插入延迟,请对其进行调整以匹配单个文件中的记录数。将此值设置为较小的值将导致文件变小(尤其是当compactionSmallFileSize为0时)。

500000

hoodie.copyonwrite.insert.auto.split

Hudi是否应该基于最后24个提交的元数据动态计算insertSplitSize,默认关闭。

true

hoodie.copyonwrite.record.size.estimate

平均记录大小。如果指定,Hudi将使用它,并且不会基于最后24个提交的元数据动态地计算。 没有默认值设置。这对于计算插入并行度以及将插入打包到小文件中至关重要。

1024

hoodie.compact.inline

当设置为true时,紧接在插入或插入更新或批量插入的提交或增量提交操作之后由摄取本身触发压缩。

true

hoodie.compact.inline.max.delta.commits

触发内联压缩之前要保留的最大增量提交数。

5

hoodie.compaction.lazy.block.read

当CompactedLogScanner合并所有日志文件时,此配置有助于选择是否应延迟读取日志块。选择true以使用I/O密集型延迟块读取(低内存使用),或者为false来使用内存密集型立即块读取(高内存使用)。

true

hoodie.compaction.reverse.log.read

HoodieLogFormatReader会从pos=0到pos=file_length向前读取日志文件。如果此配置设置为true,则Reader会从pos=file_length到pos=0反向读取日志文件。

false

hoodie.cleaner.parallelism

如果清理变慢,请增加此值。

200

hoodie.compaction.strategy

用来决定在每次压缩运行期间选择要压缩的文件组的压缩策略。默认情况下,Hudi选择具有累积最多未合并数据的日志文件。

org.apache.hudi.table.action.compact.strategy.

LogFileSizeBasedCompactionStrategy

hoodie.compaction.target.io

LogFileSizeBasedCompactionStrategy的压缩运行期间要花费的MB量。当压缩以内联模式运行时,此值有助于限制摄取延迟。

500 * 1024 MB

hoodie.compaction.daybased.target.partitions

由org.apache.hudi.io.compact.strategy.DayBasedCompactionStrategy使用,表示在压缩运行期间要压缩的最新分区数。

10

hoodie.compaction.payload.class

这需要与插入/插入更新过程中使用的类相同。就像写入一样,压缩也使用记录有效负载类将日志中的记录彼此合并,再次与基本文件合并,并生成压缩后要写入的最终记录。

org.apache.hudi.common.model.Defaulthoodierecordpayload

hoodie.schedule.compact.only.inline

在写入操作时,是否只生成压缩计划。在hoodie.compact.inline=true时有效。

false

hoodie.run.compact.only.inline

通过Sql执行run compaction命令时,是否只执行压缩操作,压缩计划不存在时直接退出。

false

单表并发控制配置

表6 单表并发控制参数配置

参数

描述

默认值

hoodie.write.lock.provider

指定lock provider,在元数据由DLI托管的场景,推荐配置com.huawei.luxor.hudi.util.DliCatalogBasedLockProvider

Spark SQL作业和Flink SQL作业会根据元数据服务切换对应的实现类,由DLI托管元数据的场景为com.huawei.luxor.hudi.util.DliCatalogBasedLockProvider

hoodie.write.lock.hivemetastore.database

HMS服务中的database

hoodie.write.lock.hivemetastore.table

HMS服务中的table name

hoodie.write.lock.client.num_retries

重试次数

10

hoodie.write.lock.client.wait_time_ms_between_retry

重试间隔

10000

hoodie.write.lock.conflict.resolution.strategy

lock provider类,必须是ConflictResolutionStrategy的子类

org.apache.hudi.client.transaction.SimpleConcurrentFileWritesConflictResolutionStrategy

Clustering配置

Clustering中有两个策略分别是hoodie.clustering.plan.strategy.class和hoodie.clustering.execution.strategy.class。一般情况下指定plan.strategy为SparkRecentDaysClusteringPlanStrategy或者SparkSizeBasedClusteringPlanStrategy时,execution.strategy不需要指定。但当plan.strategy为SparkSingleFileSortPlanStrategy时,需要指定execution.strategy为SparkSingleFileSortExecutionStrategy。

表7 Clustering参数配置

参数

描述

默认值

hoodie.clustering.inline

是否同步执行clustering

false

hoodie.clustering.inline.max.commits

触发clustering的commit数

4

hoodie.clustering.async.enabled

是否启用异步执行clustering

false

hoodie.clustering.async.max.commits

异步执行时触发clustering的commit数

4

hoodie.clustering.plan.strategy.target.file.max.bytes

指定clustering后每个文件大小最大值

1024 * 1024 * 1024 byte

hoodie.clustering.plan.strategy.small.file.limit

小于该大小的文件会被clustering

300 * 1024 * 1024 byte

hoodie.clustering.plan.strategy.sort.columns

clustering用以排序的列

hoodie.layout.optimize.strategy

Clustering执行策略,可选linear、z-order、hilbert 三种排序方式

linear

hoodie.layout.optimize.enable

使用z-order、hilbert时需要开启

false

hoodie.clustering.plan.strategy.class

筛选FileGroup进行clustering的策略类,默认筛选小于hoodie.clustering.plan.strategy.small.file.limit阈值的文件

org.apache.hudi.client.clustering.plan.strategy.SparkSizeBasedClusteringPlanStrategy

hoodie.clustering.execution.strategy.class

执行clustering的策略类(RunClusteringStrategy的子类),用以定义群集计划的执行方式。

默认类们按指定的列对计划中的文件组进行排序,同时满足配置的目标文件大小

org.apache.hudi.client.clustering.run.strategy.SparkSortAndSizeExecutionStrategy

hoodie.clustering.plan.strategy.max.num.groups

设置执行clustering时最多选择多少个FileGroup,该值越大并发度越大

30

hoodie.clustering.plan.strategy.max.bytes.per.group

设置执行clustering时每个FileGroup最多有多少数据参与clustering

2 * 1024 * 1024 * 1024 byte

相关文档