平台与工具

引导初始化

师成师成· 更新于 2026-09-29· 阅读 15 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

Hudi 通过维护提交时间线(commit timeline)和索引等元数据来管理表。提交时间线有助于了解表上发生的操作以及表的当前状态。索引则用于维护记录键到文件 ID 的映射,以便高效地定位记录。目前,Hudi 仅支持写入 Parquet 列式格式。若要开始将 Hudi 用于现有的表,你需要将现有表迁移为 Hudi 管理的表。实现这一点有几种方式。

方法

仅将 Hudi 用于新的分区

Hudi 可以在不影响、不改变表中已有历史数据的前提下管理现有表。Hudi 的实现兼容这种混合表,但有一个限制:完整的 Hive 分区必须要么全部由 Hudi 管理,要么完全不由 Hudi 管理。因此,Hudi 管理表的最小粒度是 Hive 分区。你可以开始使用 datasource API 或 WriteClient 向表写入数据,但要确保是从新分区开始写入,或者将最后 N 个分区(而非整张表)转换为 Hudi 管理。请注意,由于历史分区不由 Hudi 管理,Hudi 提供的所有原语都无法作用于这些分区中的数据。更具体地说,对于不由 Hudi 表管理的较旧分区,无法执行更新(upsert)或增量拉取(incremental pull)。如果你的表是仅追加(append only)类型的表,并且不打算对已有(或非 Hudi 管理的)分区进行更新,就采用这种方法。

将现有表转换为 Hudi

将现有表导入为 Hudi 管理的表。由于所有数据都由 Hudi 管理,方法一的所有限制在此都不适用。跨任意分区的更新都可以应用到该表上,Hudi 会高效地让这些更新对查询可见。请注意,你不仅可以在该表上使用所有 Hudi 原语,这样做还有其他额外好处。Hudi 会自动管理 Hudi 管理表的文件大小。你可以在转换表时指定期望的文件大小,Hudi 会确保写出的文件符合该配置。它还会确保后续将较小的文件修正——通过把一些新插入的数据路由到小文件中,而不是写出新的小文件,从而保持集群的健康状态。

选择这种方法时有几个选项。

使用 Hudi Streamer

使用 Hudi Streamer 工具。Hudi Streamer 通过 --run-bootstrap 命令行选项支持引导(bootstrap)。引导有两种类型:METADATA_ONLY 和 FULL_RECORD。METADATA_ONLY 只会生成包含键/页脚的骨架基础文件,从而避免重写整个数据集的全部开销。FULL_RECORD 则会将数据完整地复制/重写为 Hudi 表。此外,还可以使用正则表达式模式选择性地指定分区,以应用上述某一种引导方式。

下面是一个使用 Hudi Streamer 对所有匹配正则表达式 .* 的分区执行 FULL_RECORD 引导、并保留 hive 风格分区的示例。该示例将 hoodie.bootstrap.mode.selector 配置为 org.apache.hudi.client.bootstrap.selector.BootstrapRegexModeSelector,从而可以根据正则表达式 hoodie.bootstrap.mode.selector.regex 对选定的分区应用 FULL_RECORD 引导模式。

spark-submit --master local \
--jars "packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle_2.12-1.2.1.jar,packaging/hudi-spark-bundle/target/hudi-spark3.5-bundle_2.12-1.2.1.jar" \
--conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \
--class org.apache.hudi.utilities.streamer.HoodieStreamer `ls packaging/hudi-utilities-slim-bundle/target/hudi-utilities-slim-bundle-*.jar` \
--run-bootstrap \
--target-base-path /tmp/hoodie/bootstrap_table \
--target-table bootstrap_table \
--table-type COPY_ON_WRITE \
--hoodie-conf hoodie.bootstrap.base.path=/tmp/source_table \
--hoodie-conf hoodie.datasource.write.recordkey.field=${KEY_FIELD} \
--hoodie-conf hoodie.datasource.write.partitionpath.field=${PARTITION_FIELD} \
--hoodie-conf hoodie.table.ordering.fields=${ORDERING_FIELDS} \
--hoodie-conf hoodie.bootstrap.keygen.class=org.apache.hudi.keygen.SimpleKeyGenerator \
--hoodie-conf hoodie.bootstrap.mode.selector=org.apache.hudi.client.bootstrap.selector.BootstrapRegexModeSelector \
--hoodie-conf hoodie.bootstrap.mode.selector.regex='.*' \
--hoodie-conf hoodie.bootstrap.mode.selector.regex.mode=FULL_RECORD \
--hoodie-conf hoodie.datasource.write.hive_style_partitioning=true

使用 Spark Datasource Writer

对于超大规模的表,这可能简单到只需:

for partition in [list of partitions in source table] {
        val inputDF = spark.read.format("any_input_format").load("partition_path")
        inputDF.write.format("org.apache.hudi").option()....save("basePath")
}

使用 Spark SQL CALL 过程

更多详情请参阅 Bootstrap 过程。

使用 Hudi CLI

自行编写自定义逻辑,决定如何将现有表加载为由 Hudi 管理的表。有关 RDD API 的说明,请阅读此处。使用 bootstrap 运行 CLI。在通过 mvn clean install -DskipTests 构建 Hudi 之后,可以通过 cd hudi-cli && ./hudi-cli.sh 启动 shell。

hudi->bootstrap run --srcPath /tmp/source_table --targetPath /tmp/hoodie/bootstrap_table --tableName bootstrap_table --tableType COPY_ON_WRITE --rowKeyField ${KEY_FIELD} --partitionPathField ${PARTITION_FIELD} --sparkMaster local --hoodieConfigs hoodie.datasource.write.hive_style_partitioning=true --selectorClass org.apache.hudi.client.bootstrap.selector.FullRecordBootstrapModeSelector

与 Hudi Streamer 不同,FULL_RECORD 或 METADATA_ONLY 是通过 --selectorClass 设置的,详情可通过 help "bootstrap run" 查看。

配置

以下是控制引导(bootstrapping)的基础配置。

Config NameDefaultDescription

hoodie.bootstrap.base.path无 **(必需)**需要被引导为 Hudi 表的数据集的基础路径

Config Param: BASE_PATH
Since Version: 0.6.0

hoodie.bootstrap.mode.selectororg.apache.hudi.client.bootstrap.selector.MetadataOnlyBootstrapModeSelector(可选)选择引导数据集中每个文件/分区被引导时所采用的模式
可能的取值:

  • org.apache.hudi.client.bootstrap.selector.MetadataOnlyBootstrapModeSelector:在此模式下,完整记录数据不会被复制到 Hudi 中,因此避免了重写整个数据集的全部开销。取而代之的是,仅包含相应元数据列的「骨架」文件被添加到 Hudi 表中。Hudi 依赖原始表中的数据,如果原始表位置中的文件被删除或修改,将会导致数据丢失或损坏。
  • org.apache.hudi.client.bootstrap.selector.FullRecordBootstrapModeSelector:在此模式下,完整记录数据会被复制到 Hudi 中,并添加元数据列。全量记录引导在功能上等同于一次 bulk-insert。完成全量记录引导后,即使原始表被修改或删除,Hudi 仍能正常运行。
  • org.apache.hudi.client.bootstrap.selector.BootstrapRegexModeSelector:一种按指定分区来采用引导模式的引导选择器。

Config Param: MODE_SELECTOR_CLASS_NAME
Since Version: 0.6.0

hoodie.bootstrap.mode.selector.regex.* (可选)使用该正则表达式匹配引导数据集的每个分区,并对其应用下述模式。此配置仅在 hoodie.bootstrap.mode.selector 等于 org.apache.hudi.client.bootstrap.selector.BootstrapRegexModeSelector 时适用

Config Param: PARTITION_SELECTOR_REGEX_PATTERN
Since Version: 0.6.0

hoodie.bootstrap.mode.selector.regex.modeMETADATA_ONLY (可选)指定后,会对与 hoodie.bootstrap.mode.selector.regex 中提供的正则表达式相匹配的分区应用某一种可能的引导模式。对于未匹配的分区,则应用另一种引导模式。此配置仅在 hoodie.bootstrap.mode.selector 等于 org.apache.hudi.client.bootstrap.selector.BootstrapRegexModeSelector 时适用。
可能的取值:

配置参数:PARTITION_SELECTOR_REGEX_MODE
起始版本:0.6.0

默认情况下,若仅提供 hoodie.bootstrap.base.path,则会选择 METADATA_ONLY 模式。其他选项的详细信息,请参阅 bootstrap 配置。

视频

评论

登录后参与评论

正在加载评论…