运维 Hudi

CLI

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

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

本地环境搭建

Hudi 构建完成后,可以通过执行 cd packaging/hudi-cli-bundle && hudi-cli-with-bundle.sh 或 packaging/hudi-cli-bundle/hudi-cli-with-bundle.sh 来启动 shell。

Hudi CLI 环境搭建

从 0.13.0 版本开始,我们新增了一种启动 hudi cli 的方式,即使用 hudi-cli-bundle 脚本。

注意:从 1.0.2 版本起,传统的 hudi-cli.sh 脚本已被弃用,并由 hudi-cli-with-bundle.sh 取代。建议用户迁移到新的打包版 CLI 脚本 hudi-cli-with-bundle.sh,以获得更好的兼容性和更便捷的使用体验。

使用前需要满足若干前提条件,例如在本地机器上安装 spark。必须使用打包了 Hadoop 依赖的 Spark 发行版,例如来自 https://archive.apache.org/dist/spark/ 的 spark-3.5.4-bin-hadoop3.tgz。我们还建议你设置环境变量 $SPARK_HOME,指向机器上 Spark 的安装路径。需要注意的是,使用 hudi-cli-bundle 时,hudi-spark-bundle 也必须存在。
要指定这些 bundle jar 的位置,可以在 shell 中按如下方式设置:export CLI_BUNDLE_JAR=<path-to-cli-bundle-jar-to-use>、export SPARK_BUNDLE_JAR=<path-to-spark-bundle-jar-to-use>。

如果你不自行编译项目而是下载 jar,请按以下步骤操作:

  1. 创建一个空文件夹作为新目录
  2. 将 hudi-cli-bundle jar 和 hudi-spark*-bundle jar 复制到该目录
  3. 将以下脚本和文件夹复制到该目录
packaging/hudi-cli-bundle/hudi-cli-with-bundle.sh
packaging/hudi-cli-bundle/conf .  the `conf` folder should be in this directory.
  1. 设置好环境变量后,启动 Hudi CLI shell
export SPARK_HOME=<spark-home-folder>
export CLI_BUNDLE_JAR=<cli-bundle-jar-to-use>
export SPARK_BUNDLE_JAR=<spark-bundle-jar-to-use>

./hudi-cli-with-bundle.sh

基础路径

Hudi 表存储在分布式文件系统(DFS)上,其所在位置称为 basePath,要连接 Hudi 表就需要这个位置。Hudi 库通过 .hoodie 子目录在内部有效地管理该表,用于跟踪所有元数据。

在 S3 中使用 Hudi-cli

如果你使用的是随 AWS EMR 打包提供的 Hudi,可以在这里找到使用 hudi-cli 的说明。如果你不使用 EMR,或者希望使用 master 分支上最新的 hudi-cli,可以按照以下步骤在本地环境(笔记本电脑)中访问 S3 数据集。

使用对应的 Spark 版本构建 Hudi,例如 -Dspark3.5。

设置以下环境变量。

export AWS_REGION=us-east-2
export AWS_ACCESS_KEY_ID=<key_id>
export AWS_SECRET_ACCESS_KEY=<secret_key>

export SPARK_HOME=<spark_home>
export CLI_BUNDLE_JAR=<cli-bundle-jar-to-use>
export SPARK_BUNDLE_JAR=<spark-bundle-jar-to-use>

请确保将 SPARK\_HOME 设置为与上面编译的 Hudi Spark 版本兼容的本地 Spark 主目录。需要注意的一个重要事项是,在使用 hudi-cli-bundle 时,hudi-spark-bundle 也必须存在。

除此之外,我们可能还需要将 AWS 相关的 jar 包添加到类路径中,以便能够从本地访问 S3。我们需要两个 jar,分别是 aws-java-sdk-bundle jar 和 hadoop-aws jar,你可以在网上找到它们。例如:

wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.3.4/hadoop-aws-3.3.4.jar -o /lib/spark-3.5.4-bin-hadoop3/jars/hadoop-aws-3.3.4.jar
wget https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.12.262/aws-java-sdk-bundle-1.12.262.jar -o /lib/spark-3.5.4-bin-hadoop3/jars/aws-java-sdk-bundle-1.12.262.jar

注意:以下 AWS jar 版本特定于 Spark 3.5.4 和 Hadoop 3.3.4

export CLIENT_JAR=/lib/spark-3.5.4-bin-hadoop3/jars/aws-java-sdk-bundle-1.12.262.jar:/lib/spark-3.5.4-bin-hadoop3/jars/hadoop-aws-3.3.4.jar

设置完成后,即可启动 hudi-cli 并访问 S3 数据集。

./packaging/hudi-cli-bundle/hudi-cli-with-bundle.sh

在 Google Dataproc 上使用 hudi-cli

Dataproc 是 Google 提供的托管服务,用于运行 Apache Hadoop、Apache Spark、Apache Flink、Presto 以及包括 Hudi 在内的许多其他框架。如果你想在未启用 Hudi 支持的 Dataproc 节点上运行 Hudi CLI,可以按照以下步骤操作:

以下步骤使用 Hudi 1.2.1 版本。如果想使用其他版本,你需要相应地修改下面的命令:

  1. 启动 Dataproc 集群后,可以通过以下方式 SSH 登录:
$ gcloud compute ssh --zone "YOUR_ZONE" "HOSTNAME_OF_MASTER_NODE"  --project "YOUR_PROJECT"
  1. 下载 Hudi CLI bundle
wget https://repo1.maven.org/maven2/org/apache/hudi/hudi-cli-bundle_2.12/1.2.1/hudi-cli-bundle_2.12-1.2.1.jar
  1. 下载 Hudi Spark Bundle
wget https://repo1.maven.org/maven2/org/apache/hudi/hudi-spark3.5-bundle_2.12/1.2.1/hudi-spark3.5-bundle_2.12-1.2.1.jar
  1. 下载用于启动 Hudi CLI bundle 的 shell 脚本
wget https://raw.githubusercontent.com/apache/hudi/release-1.2.1/packaging/hudi-cli-bundle/hudi-cli-with-bundle.sh
  1. 使用相应的环境变量启动 Hudi CLI bundle,如下所示:
CLIENT_JAR=$DATAPROC_DIR/lib/gcs-connector.jar CLI_BUNDLE_JAR=hudi-cli-bundle_2.12-1.2.1.jar SPARK_BUNDLE_JAR=hudi-spark3.5-bundle_2.12-1.2.1.jar ./hudi-cli-with-bundle.sh
  1. hudi->connect --path gs://path_to_some_table
    Metadata for table some_table loaded
  2. hudi:some_table->commits show --limit 5
    如果上述步骤均正常执行,该命令应显示最近的提交记录。

连接到启用 Kerberos 的集群

在连接到启用 Kerberos 的集群之前,可以先使用 kerberos kinit 命令。该命令的用法如下。

hudi->help kerberos kinit
NAME
       kerberos kinit - Perform Kerberos authentication

SYNOPSIS
       kerberos kinit --krb5conf String [--principal String] [--keytab String]

OPTIONS
       --krb5conf String
       Path to krb5.conf
       [Optional, default = /etc/krb5.conf]

       --principal String
       Kerberos principal
       [Mandatory]

       --keytab String
       Path to keytab
       [Mandatory]

例如:

hudi->kerberos kinit --principal user/host@DOMAIN --keytab /etc/security/keytabs/user.keytab
Perform Kerberos authentication
Parameters:
--krb5conf: /etc/krb5.conf
--principal: user/host@DOMAIN
--keytab: /etc/security/keytabs/user.keytab
Kerberos current user: user/host@DOMAIN (auth:KERBEROS)
Kerberos login user: user/host@DOMAIN (auth:KERBEROS)
Kerberos authentication success

如果命令输出中出现“Kerberos authentication success”,则表示 Kerberos 认证已成功。

kerberos kdestroy 是其对应命令:它会将登录用户从 keytab 中登出,并重置缓存的 UserGroupInformation,这正是在同一会话中切换为其他主体进行认证前所需要的。但只有当该用户持有 Kerberos 凭据时,它才会执行这些操作;否则会输出 Currently, no user login with kerberos, do nothing 并保持会话不变。

hudi->kerberos kdestroy --krb5conf /etc/krb5.conf
Destroy Kerberos authentication
Parameters:
--krb5conf: /etc/krb5.conf
Current user: user (auth:SIMPLE)
Login user: user (auth:SIMPLE)
Destroy Kerberos authentication success

--krb5conf 默认为 /etc/krb5.conf。如果没有用户当前使用 Kerberos 登录,命令会打印 Currently, no user login with kerberos, do nothing,并且仍然报告成功,因此可以安全地重复运行。

使用 hudi-cli

要初始化 hudi 表,请使用以下命令。

===================================================================
*         ___                          ___                        *
*        /\__\          ___           /\  \           ___         *
*       / /  /         /\__\         /  \  \         /\  \        *
*      / /__/         / /  /        / /\ \  \        \ \  \       *
*     /  \  \ ___    / /  /        / /  \ \__\       /  \__\      *
*    / /\ \  /\__\  / /__/  ___   / /__/ \ |__|     / /\/__/      *
*    \/  \ \/ /  /  \ \  \ /\__\  \ \  \ / /  /  /\/ /  /         *
*         \  /  /    \ \  / /  /   \ \  / /  /   \  /__/          *
*         / /  /      \ \/ /  /     \ \/ /  /     \ \__\          *
*        / /  /        \  /  /       \  /  /       \/__/          *
*        \/__/          \/__/         \/__/    Apache Hudi CLI    *
*                                                                 *
===================================================================

hudi->create --path /user/hive/warehouse/table1 --tableName hoodie_table_1 --tableType COPY_ON_WRITE
.....

要查看 Hudi 表的描述,请使用以下命令:

hudi:hoodie_table_1->desc
18/09/06 15:57:19 INFO timeline.HoodieActiveTimeline: Loaded instants []
    _________________________________________________________
    | Property                | Value                        |
    |========================================================|
    | basePath                | ...                          |
    | metaPath                | ...                          |
    | fileSystem              | hdfs                         |
    | hoodie.table.name       | hoodie_table_1               |
    | hoodie.table.type       | COPY_ON_WRITE                |
    | hoodie.archivelog.folder|                              |

以下是一个连接包含 uber 行程数据的 Hudi 表的示例命令。

hudi:trips->connect --path /app/uber/trips

16/10/05 23:20:37 INFO model.HoodieTableMetadata: All commits :HoodieCommits{commitList=[20161002045850, 20161002052915, 20161002055918, 20161002065317, 20161002075932, 20161002082904, 20161002085949, 20161002092936, 20161002105903, 20161002112938, 20161002123005, 20161002133002, 20161002155940, 20161002165924, 20161002172907, 20161002175905, 20161002190016, 20161002192954, 20161002195925, 20161002205935, 20161002215928, 20161002222938, 20161002225915, 20161002232906, 20161003003028, 20161003005958, 20161003012936, 20161003022924, 20161003025859, 20161003032854, 20161003042930, 20161003052911, 20161003055907, 20161003062946, 20161003065927, 20161003075924, 20161003082926, 20161003085925, 20161003092909, 20161003100010, 20161003102913, 20161003105850, 20161003112910, 20161003115851, 20161003122929, 20161003132931, 20161003142952, 20161003145856, 20161003152953, 20161003155912, 20161003162922, 20161003165852, 20161003172923, 20161003175923, 20161003195931, 20161003210118, 20161003212919, 20161003215928, 20161003223000, 20161003225858, 20161004003042, 20161004011345, 20161004015235, 20161004022234, 20161004063001, 20161004072402, 20161004074436, 20161004080224, 20161004082928, 20161004085857, 20161004105922, 20161004122927, 20161004142929, 20161004163026, 20161004175925, 20161004194411, 20161004203202, 20161004211210, 20161004214115, 20161004220437, 20161004223020, 20161004225321, 20161004231431, 20161004233643, 20161005010227, 20161005015927, 20161005022911, 20161005032958, 20161005035939, 20161005052904, 20161005070028, 20161005074429, 20161005081318, 20161005083455, 20161005085921, 20161005092901, 20161005095936, 20161005120158, 20161005123418, 20161005125911, 20161005133107, 20161005155908, 20161005163517, 20161005165855, 20161005180127, 20161005184226, 20161005191051, 20161005193234, 20161005203112, 20161005205920, 20161005212949, 20161005223034, 20161005225920]}
Metadata for table trips loaded

连接到表之后,许多其他命令便可使用。Shell 提供上下文自动补全帮助(按 TAB 键),help 会列出你的构建版本实际包含的所有命令。下面的命令参考记录了全部命令及其选项。

查看提交信息

在 Hudi 中,对一批传入记录执行更新插入或插入的任务称为一次 commit(提交)。提交提供了基本的原子性保证,即只有已提交的数据才可供查询。每次提交都有一个单调递增的字符串/数字,称为 提交编号。通常,这就是我们开始该次提交的时间。

要查看最近 10 次提交的部分基本信息,

hudi:trips->commits show --sortBy "Total Bytes Written" --desc true --limit 10
    ________________________________________________________________________________________________________________________________________________________________________
    | CommitTime    | Total Bytes Written| Total Files Added| Total Files Updated| Total Partitions Written| Total Records Written| Total Update Records Written| Total Errors|
    |=======================================================================================================================================================================|
    ....
    ....
    ....

在每次写入开始时,Hudi 还会向 .hoodie 文件夹写入一个 .inflight 提交文件。你可以使用其中的时间戳来估算该提交处于进行中(inflight)状态的时长。

$ hdfs dfs -ls /app/uber/trips/.hoodie/*.inflight
-rw-r--r--   3 vinoth supergroup     321984 2016-10-05 23:18 /app/uber/trips/.hoodie/20161005225920.inflight

要列出所有已运行超过指定分钟数的进行中(inflight)和已请求(requested)的 instants,可使用 commits show_infights:

hudi:trips->commits show_infights --lookbackInMins 30

此命令列出所有请求时间戳早于 30 分钟的 inflight 或 requested instant,显示提交时间、操作类型和当前状态。这有助于检测挂起或卡住的写入操作。--lookbackInMins 选项默认为 0(返回所有 inflight/requested instant)。

下钻到特定的提交

要了解写入在特定分区上的分布情况,

hudi:trips->commit showpartitions --commit 20161005165855 --sortBy "Total Bytes Written" --desc true --limit 10
    __________________________________________________________________________________________________________________________________________
    | Partition Path| Total Files Added| Total Files Updated| Total Records Inserted| Total Records Updated| Total Bytes Written| Total Errors|
    |=========================================================================================================================================|
     ....
     ....

如果需要文件级别的粒度,可以按如下方式操作

hudi:trips->commit showfiles --commit 20161005165855 --sortBy "Partition Path"
    ________________________________________________________________________________________________________________________________________________________
    | Partition Path| File ID                             | Previous Commit| Total Records Updated| Total Records Written| Total Bytes Written| Total Errors|
    |=======================================================================================================================================================|
    ....
    ....

FileSystem View

Hudi 将每个分区视为一组文件组(file-group)的集合,每个文件组按提交顺序包含一系列文件切片(file-slice)(参见概念)。以下命令允许用户查看数据集的文件切片。

hudi:stock_ticks_mor->show fsview all
 ....
  _______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
 | Partition | FileId | Base-Instant | Data-File | Data-File Size| Num Delta Files| Total Delta File Size| Delta Files |
 |==============================================================================================================================================================================================================================================================================================================================================================================================================|
 | 2018/08/31| 111415c3-f26d-4639-86c8-f9956f245ac3| 20181002180759| hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/111415c3-f26d-4639-86c8-f9956f245ac3_0_20181002180759.parquet| 432.5 KB | 1 | 20.8 KB | [HoodieLogFile {hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/.111415c3-f26d-4639-86c8-f9956f245ac3_20181002180759.log.1}]|



hudi:stock_ticks_mor->show fsview latest --partitionPath "2018/08/31"
 ......
 __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
 | Partition | FileId | Base-Instant | Data-File | Data-File Size| Num Delta Files| Total Delta Size| Delta Size - compaction scheduled| Delta Size - compaction unscheduled| Delta To Base Ratio - compaction scheduled| Delta To Base Ratio - compaction unscheduled| Delta Files - compaction scheduled | Delta Files - compaction unscheduled|
 |=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================|
 | 2018/08/31| 111415c3-f26d-4639-86c8-f9956f245ac3| 20181002180759| hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/111415c3-f26d-4639-86c8-f9956f245ac3_0_20181002180759.parquet| 432.5 KB | 1 | 20.8 KB | 20.8 KB | 0.0 B | 0.0 B | 0.0 B | [HoodieLogFile {hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/.111415c3-f26d-4639-86c8-f9956f245ac3_20181002180759.log.1}]| [] |

统计信息

由于 Hudi 直接管理 DFS 表的文件大小,因此有必要获取一个整体概况

hudi:trips->stats filesizes --partitionPath 2016/09/01 --sortBy "95th" --desc true --limit 10
    ________________________________________________________________________________________________
    | CommitTime    | Min     | 10th    | 50th    | avg     | 95th    | Max     | NumFiles| StdDev  |
    |===============================================================================================|
    | <COMMIT_ID>   | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 93.9 MB | 2       | 2.3 KB  |
    ....
    ....

如果 Hudi 写入耗时过长,最好查看写放大情况,看是否出现突然增长,可使用 \--show-write-amplification`` 参数。

hudi:trips->stats wa
    __________________________________________________________________________
    | CommitTime    | Total Upserted| Total Written| Write Amplifiation Factor|
    |=========================================================================|
    ....
    ....

归档提交(Archived Commits)

为了限制 DFS 上 .commit 文件数量的增长,Hudi 会在尊重清理(cleaner)策略的前提下,将较旧的 .commit 文件归档到 commits.archived 文件中。这是一个 sequence 文件,包含从 commitNumber => json 的映射,其中 json 存储了该提交的原始信息(与上面良好汇总展示的信息相同)。

归档通常与写入操作内联执行。trigger archival 可针对当前连接的表,按需以 Spark 作业的形式运行归档。保留选项与同名的写入配置一致,因此此处不传入任何参数时,将使用 Hudi 的默认设置进行归档,而不是使用你的写入器所配置的值。

hudi:trips->trigger archival --minCommits 20 --maxCommits 30 --commitsRetainedByCleaner 10 --enableMetadata true
Archival successfully triggered
选项默认值说明
--minCommits20活跃时间线中保留的最少 instant 数量。对应 hoodie.keep.min.commits。
--maxCommits30活跃时间线中保留的最多 instant 数量。对应 hoodie.keep.max.commits。
--commitsRetainedByCleaner10在不执行清理的情况下保留的提交数量。
--enableMetadatatrue本次运行是否启用元数据表。
--sparkMemory1GSpark executor 内存。
--sparkMasterlocalSpark master。

当 Spark 作业返回退出码 0 时,该命令会报告 Archival successfully triggered,否则报告 Failed to trigger archival。请查看 Spark 日志以了解失败原因。

Compaction(压缩)

若要了解压缩与写入应用之间的延迟情况,可使用以下命令列出所有待处理的 compaction。

hudi:trips->compactions show all
     ___________________________________________________________________
    | Compaction Instant Time| State    | Total FileIds to be Compacted|
    |==================================================================|
    | <INSTANT_1>            | REQUESTED| 35                           |
    | <INSTANT_2>            | INFLIGHT | 27                           |

要检查特定的 compaction 计划,请使用

hudi:trips->compaction show --instant <INSTANT_1>
    _________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
    | Partition Path| File Id | Base Instant  | Data File Path                                    | Total Delta Files| getMetrics                                                                                                                    |
    |================================================================================================================================================================================================================================================
    | 2018/07/17    | <UUID>  | <INSTANT_1>   | viewfs://ns-default/.../../UUID_<INSTANT>.parquet | 1                | {TOTAL_LOG_FILES=1.0, TOTAL_IO_READ_MB=1230.0, TOTAL_LOG_FILES_SIZE=2.51255751E8, TOTAL_IO_WRITE_MB=991.0, TOTAL_IO_MB=2221.0}|

要手动调度或执行 Compaction,请使用以下命令。该命令使用 Spark launcher 来执行 compaction 操作。

注意: 请确保没有其他应用程序在并发地为该表调度 compaction {: .notice--info}

hudi:trips->help compaction schedule
Keyword:                   compaction schedule
Description:               Schedule Compaction
 Keyword:                  sparkMemory
   Help:                   Spark executor memory
   Mandatory:              false
   Default if specified:   '__NULL__'
   Default if unspecified: '1G'

* compaction schedule - Schedule Compaction
hudi:trips->help compaction run
Keyword:                   compaction run
Description:               Run Compaction for given instant time
 Keyword:                  tableName
   Help:                   Table name
   Mandatory:              true
   Default if specified:   '__NULL__'
   Default if unspecified: '__NULL__'

 Keyword:                  parallelism
   Help:                   Parallelism for hoodie compaction
   Mandatory:              true
   Default if specified:   '__NULL__'
   Default if unspecified: '__NULL__'

 Keyword:                  schemaFilePath
   Help:                   Path for Avro schema file
   Mandatory:              true
   Default if specified:   '__NULL__'
   Default if unspecified: '__NULL__'

 Keyword:                  sparkMemory
   Help:                   Spark executor memory
   Mandatory:              true
   Default if specified:   '__NULL__'
   Default if unspecified: '__NULL__'

 Keyword:                  retry
   Help:                   Number of retries
   Mandatory:              true
   Default if specified:   '__NULL__'
   Default if unspecified: '__NULL__'

 Keyword:                  compactionInstant
   Help:                   Base path for the target hoodie table
   Mandatory:              true
   Default if specified:   '__NULL__'
   Default if unspecified: '__NULL__'

* compaction run - Run Compaction for given instant time

验证压缩

验证压缩计划:检查压缩所需的所有文件是否存在且有效。

hudi:stock_ticks_mor->compaction validate --instant 20181005222611
...

   COMPACTION PLAN VALID

    ___________________________________________________________________________________________________________________________________________________________________________________________________________________________
    | File Id                             | Base Instant Time| Base Data File                                                                                                                   | Num Delta Files| Valid| Error|
    |==========================================================================================================================================================================================================================|
    | 05320e98-9a57-4c38-b809-a6beaaeb36bd| 20181005222445   | hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/05320e98-9a57-4c38-b809-a6beaaeb36bd_0_20181005222445.parquet| 1              | true |      |



hudi:stock_ticks_mor->compaction validate --instant 20181005222601

   COMPACTION PLAN INVALID

    _______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
    | File Id                             | Base Instant Time| Base Data File                                                                                                                   | Num Delta Files| Valid| Error                                                                           |
    |=====================================================================================================================================================================================================================================================================================================|
    | 05320e98-9a57-4c38-b809-a6beaaeb36bd| 20181005222445   | hdfs://namenode:8020/user/hive/warehouse/stock_ticks_mor/2018/08/31/05320e98-9a57-4c38-b809-a6beaaeb36bd_0_20181005222445.parquet| 1              | false| All log files specified in compaction operation is not present. Missing ....    |

注意: 以下命令必须在没有其他写入/摄取应用运行的情况下执行。{: .notice--warning}

有时,为了加快或解除压实操作的阻塞,需要从压实计划中移除某个 fileId。在压实计划被调度之后,该文件上产生的任何新日志文件都会被安全地重命名,从而得到保留。Hudi 提供了以下 CLI 来支持这一操作

取消调度压实

hudi:trips->compaction unscheduleFileId --fileId <FileUUID>
....
No File renames needed to unschedule file from pending compaction. Operation successful.

在其他情况下,需要回滚整个压缩计划。以下 CLI 命令支持该操作

hudi:trips->compaction unschedule --instant <compactionInstant>
.....
No File renames needed to unschedule pending compaction. Operation successful.

修复压缩(Repair Compaction)

上述取消压缩计划的操作有时可能会部分失败(例如:DFS 暂时不可用)。出现部分失败时,压缩操作可能会与文件切片(file-slice)的状态不一致。运行 compaction validate 时,你可以发现是否存在无效的压缩操作。在这种情况下,修复命令就能派上用场,它会重新整理文件切片,确保数据不丢失,并使文件切片与压缩计划保持一致。

hudi:stock_ticks_mor->compaction repair --instant 20181005222611
......
Compaction successfully repaired
.....

保存点与恢复

顾名思义,"保存点"会在提交时间点保存表的状态,以便在后续需要时将表恢复到该保存点。你可以在这里了解更多关于保存点和恢复的信息。

要为 Hudi 表触发保存点

connect --path /tmp/hudi_trips_cow/
commits show
set --conf SPARK_HOME=<SPARK_HOME>
savepoint create --commit 20220128160245447 --sparkMaster local[2]

要将表恢复到某个已创建 savepoint 的提交:

connect --path /tmp/hudi_trips_cow/
commits show
set --conf SPARK_HOME=<SPARK_HOME>
savepoints show
╔═══════════════════╗
║ SavepointTime     ║
╠═══════════════════╣
║ 20220128160245447 ║
╚═══════════════════╝
savepoint rollback --savepoint 20220128160245447 --sparkMaster local[2]

回滚到 savepoint 会在时间线上写入一个 restore 瞬时操作。show restores 和 show restore 都会将一次 restore 展开为一行一条被回滚的提交;show restore 则是限定在单个瞬时操作上的同一视图。这就是事后确认一次 restore 实际撤销了什么的方式。注意,--limit 限制的是行数而非 restore 次数,因此一次回滚了十几条提交的 restore 就会独自占满默认的分页。

hudi:trips->show restores --limit 10 --includeInflights false
hudi:trips->show restore --instant 20220128170512331

show restores 接受 --limit(默认 10)、--sortBy(默认未设置)、--desc(默认 false)、--headeronly(默认 false)以及 --includeInflights(默认 false,即仅列出已完成的恢复操作)。show restore 通过 --instant 指定要展开的 instant,并接受相同的 --limit / --sortBy / --desc / --headeronly 显示选项;它没有 --includeInflights 参数。

升级与降级表

如果用户需要降级所使用的 Hudi 库版本,则必须先在较新版本的 Hudi CLI 中手动降级 Hudi 表,然后再降级库。要通过 CLI 降级 Hudi 表,用户需要按如下方式指定目标 Hudi 表版本:

connect --path <table_path>
downgrade table --toVersion <target_version>

下表列出了 Hudi 表版本与 Hudi 发布版本之间的对应关系:

Hudi 表版本Hudi 发布版本
NINE 或 91.1.x - 1.2.x
EIGHT 或 81.0.x
SIX 或 60.14.x - 0.15.x
FIVE 或 50.12.x - 0.13.x
FOUR 或 40.11.x
THREE 或 30.10.x
TWO 或 20.9.x
ONE 或 10.6.x - 0.8.x
ZERO 或 00.5.x 及以下

例如,要将表从版本 EIGHT(8)(当前版本)降级到 SIX(6),应执行以下命令(请根据你的环境使用合适的 Spark master):

downgrade table --toVersion SIX --sparkMaster local[2]

或

downgrade table --toVersion 6 --sparkMaster local[2]

你可以通过查看表路径下 .hoodie/hoodie.properties 文件中的 hoodie.table.version 属性来验证表版本:

hoodie.table.version=6

Hudi CLI 还提供了手动升级 Hudi 表的功能。通过 CLI 升级 Hudi 表的方法如下:

upgrade table --toVersion <target_version>

:::note

升级 Hudi 库之后,Hudi 写入客户端会在 Hudi Streamer 等不同部署模式下自动处理表升级,因此用户无需手动升级。这种自动表升级方式总体上是推荐的做法,而不是使用 upgrade CLI 命令。

从表版本 ONE 升级到 TWO 需要键生成器相关配置,例如 "hoodie.datasource.write.recordkey.field",而这些配置只有在用户配置写入作业时才可用。因此,不支持通过 CLI 将表从版本 ONE 升级到 TWO,用户应依赖写入客户端中的自动升级。

也可以在不指定目标版本的情况下运行升级命令。此时,将使用与库发布版本对应的最新表版本:

upgrade table

记录级索引查询

要通过存储在元数据表中的记录级索引(RLI,Record Level Index)查询记录所在的文件位置:

hudi:trips->metadata lookup-record-index --record_key <key>

对于分区(非全局)的 RLI,需要提供分区路径:

hudi:trips->metadata lookup-record-index --record_key <key> --partition_path <partition>

--partition_path 参数对于全局 RLI(记录键在所有分区间唯一)是可选的,对于分区 RLI 则是必需的。如果对分区 RLI 省略 --partition_path,命令将返回错误。输出列包括 Record key、Partition path、File Id 和 Instant time。

用于从元数据表中彻底删除记录索引分区,例如在重建之前。注意前提条件:与 metadata delete 不同,此命令在 Spark 引擎上下文中运行,而该上下文仅由 metadata create、metadata init 或 metadata list-partitions 创建。请先在同一会话中运行其中任意一个命令,否则命令会因 Spark 上下文未初始化而失败,而不会执行任何操作:

hudi:trips->metadata list-partitions --sparkMaster local[2]
hudi:trips->metadata delete-record-index --backup true
Record Index has been deleted from the Metadata Table and backed up to /user/hive/warehouse/table1/.hoodie/.metadata_record_index_20260831090412345

--backup 默认为 true。备份操作是重命名而非复制,因此开销很小:.hoodie/metadata/record_index 分区会被移动到 .hoodie/.metadata_record_index_<instantTime>,其中 <instantTime> 是当前 instant,格式为 yyyyMMddHHmmssSSS。传入 --backup false 则会直接删除该分区,此时输出仅为 Record Index has been deleted from the Metadata Table,唯一的恢复方式是重建索引。

无论采用哪种方式,命令都会先在表配置中关闭该分区,以便在文件被删除之前读取方停止查询该索引。如果 record index 分区不存在,或者备份重命名失败,消息仍会打印,只是备份路径的位置显示为 null,因此出现 null 本身并不能作为分区不存在的确证。

更改 Hudi 表类型

某些场景下我们需要更改 Hudi 表类型。例如,将 COW 表改为 MOR,以实现更高效、更低延迟的写入;或者将 MOR 改为 COW,以获得更好的读取性能以及对下游引擎的兼容性。因此,我们提供了 table 命令来便捷地执行这类修改。

将 COW 改为 MOR 时,只需把 hoodie.properties 中的 hoodie.table.type 修改为 MERGE_ON_READ 即可。

而将 MOR 改为 COW 时,必须确保所有日志文件都已合并(compaction)完毕后再修改表类型,否则会导致数据丢失。

connect --path <table_path>
table change-table-type <target_table_type>

参数 target_table_type 的可选值如下:

target table typecomment

MOR将 COW 表变更为 MERGE_ON_READ。

COW将 MOR 表变更为 COPY_ON_WRITE。
默认情况下,变更为 COW 时会执行所有待处理的 compaction,如果仍有日志文件残留,还会执行一次完全 compaction。设置 --enable-compaction=false 可以禁用默认的 compaction 行为。
compaction 操作支持以下参数:

--parallelism:默认 3,Hoodie compaction 的并行度。
--sparkMaster:默认 local,Spark Master。
--sparkMemory:默认 4G,Spark executor 内存。
--retry:默认 1,重试次数。
--propsFilePath:默认 ,本地文件系统或分布式文件系统上配置文件的路径,其中包含用于 compaction 的 hoodie 客户端配置。
--hoodieConfigs:默认 ,任何可以在配置文件中设置的配置,都可以以数组形式在此处传入。

下面的示例展示了将 MOR 表变更为 COW:

connect --path /var/dataset/test_table_mor2cow
desc
╔════════════════════════════════════════════════╤═════════════════════════════════════════╗
║ Property                                       │ Value                                   ║
╠════════════════════════════════════════════════╪═════════════════════════════════════════╣
║ basePath                                       │ /var/dataset/test_table_mor2cow         ║
╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
║ metaPath                                       │ /var/dataset/test_table_mor2cow/.hoodie ║
╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
║ fileSystem                                     │ file                                    ║
╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
║ hoodie.table.name                              │ test_table                              ║
╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
║ hoodie.compaction.record.merger.strategy       │ eeb8d96f-b1e4-49fd-bbf8-28ac514178e5    ║
╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
║ hoodie.table.metadata.partitions               │ files                                   ║
╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
║ hoodie.table.type                              │ MERGE_ON_READ                           ║
╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
║ hoodie.table.metadata.partitions.inflight      │                                         ║
╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
║ hoodie.archivelog.folder                       │ archived                                ║
╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
║ hoodie.timeline.layout.version                 │ 1                                       ║
╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
║ hoodie.table.checksum                          │ 2702201862                              ║
╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
║ hoodie.compaction.payload.type                 │ HOODIE_AVRO                             ║
╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
║ hoodie.table.version                           │ 6                                       ║
╟────────────────────────────────────────────────┼─────────────────────────────────────────╢
║ hoodie.datasource.write.drop.partition.columns │ false                                   ║
╚════════════════════════════════════════════════╧═════════════════════════════════════════╝

table change-table-type COW
╔════════════════════════════════════════════════╤══════════════════════════════════════╤══════════════════════════════════════╗
║ Property                                       │ Old Value                            │ New Value                            ║
╠════════════════════════════════════════════════╪══════════════════════════════════════╪══════════════════════════════════════╣
║ hoodie.archivelog.folder                       │ archived                             │ archived                             ║
╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
║ hoodie.compaction.payload.type                 │ HOODIE_AVRO                          │ HOODIE_AVRO                          ║
╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
║ hoodie.compaction.record.merger.strategy       │ eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 │ eeb8d96f-b1e4-49fd-bbf8-28ac514178e5 ║
╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
║ hoodie.datasource.write.drop.partition.columns │ false                                │ false                                ║
╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
║ hoodie.table.checksum                          │ 2702201862                           │ 2702201862                           ║
╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
║ hoodie.table.metadata.partitions               │ files                                │ files                                ║
╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
║ hoodie.table.metadata.partitions.inflight      │                                      │                                      ║
╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
║ hoodie.table.name                              │ test_table                           │ test_table                           ║
╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
║ hoodie.table.type                              │ MERGE_ON_READ                        │ COPY_ON_WRITE                        ║
╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
║ hoodie.table.version                           │ 6                                    │ 6                                    ║
╟────────────────────────────────────────────────┼──────────────────────────────────────┼──────────────────────────────────────╢
║ hoodie.timeline.layout.version                 │ 1                                    │ 1                                    ║
╚════════════════════════════════════════════════╧══════════════════════════════════════╧══════════════════════════════════════╝

检查 Timeline

commits show 列出已完成的 commit,并且只包含 commit、deltacommit、replacecommit 和 clustering 这几种 action。timeline 命令会显示每一个 instant,无论其 action 和状态如何——在诊断卡住的表时,这正是你需要的:一个停留在 REQUESTED 状态的 compaction 永远不会出现在 commits show 中,rollback 无论处于何种状态也一样不会出现。

hudi:trips->timeline show active --limit 10
hudi:trips->timeline show incomplete

两者都会打印 Instant、Action、State 以及 Requested / Inflight / Completed 文件的修改时间。timeline show incomplete 会将列出的条目限制为尚未完成的实例。

选项默认值适用范围描述
--limit10两者均适用要显示的行数。
--sortBy未设置两者均适用排序所依据的字段。
--descfalse两者均适用反转排序顺序。
--headeronlyfalse两者均适用只打印表头。
--show-rollback-infofalse两者均适用在两个方向上为 Action 列添加标注:回滚实例显示 Rolls back ...(回滚了……),被回滚的实例显示 Rolled back by ...(被……回滚)。
--show-time-secondsfalse两者均适用在实例文件修改时间中包含秒数。
--with-metadata-tablefalse仅 timeline show active在数据表时间线旁显示元数据表时间线,并额外添加 MT Action、MT State 以及三个对应的 MT 时间列。

元数据表拥有自己的时间线,当元数据提交失败时,两者可能不一致。若要直接读取它:

hudi:trips->metadata timeline show active --limit 10
hudi:trips->metadata timeline show incomplete

这些命令接受 --limit、--sortBy、--desc、--headeronly 和 --show-time-seconds。它们没有 --show-rollback-info,也没有 --with-metadata-table,因为它们的作用范围已经是元数据表。

比较文件或分区

diff file 和 diff partition 会回放时间线,并显示所有触及指定文件组或分区的提交,这是回答「这个文件一直在被谁写入」这一问题的最快方式。两者都会报告标准的提交列,并且仅针对匹配条目的写入统计信息。

hudi:trips->diff file --fileId 5f8a1e0b-1b4b-4a3f-9b1a-2c7d6e5f4a3b-0 --limit 10
hudi:trips->diff partition --partitionPath 2026/08/26 --includeArchivedTimeline true

diff file 接受 --fileId,diff partition 接受 --partitionPath(相对于表基础路径的分区路径)。diff partition 仅对分区表有意义。两者随后共享以下选项:

选项默认值说明
--includeArchivedTimelinefalse除了活动时间线外,还扫描已归档的 instant。
--startTs未设置,即当前时间减 10 天instant 范围的起始时间。仅在 --includeArchivedTimeline 为 true 时生效。
--endTs未设置,即当前时间减 1 天instant 范围的结束时间。仅在 --includeArchivedTimeline 为 true 时生效。
--limit-1,即不限制显示的行数。
--sortBy未设置排序字段。
--descfalse反转排序顺序。
--headeronlyfalse仅打印表头。

请注意这三个范围选项之间的相互作用,这一点很容易搞错。--startTs 和 --endTs 仅用于筛选已归档的 instant。默认情况下 --includeArchivedTimeline 为 false,此时会扫描整个活动时间线,两个边界值均被忽略,因此传入一个较窄的范围并不会限制输出。将 --includeArchivedTimeline 设为 true 后边界值才会生效,并且要注意,此时已归档的范围会与完整的活动时间线合并,而不是取代它。

修复表

repair show empty commit metadata 会扫描活动时间线上的已完成 instant,并报告那些元数据文件为空的 instant——这正是在文件创建之后、元数据写入之前被中断的 commit 所留下的状态。

hudi:trips->repair show empty commit metadata

请注意,该命令不会返回表格结果,而是以 WARN 级别将发现的问题写入 CLI 日志,因此在默认日志配置下,你会在控制台日志中看到 Empty Commit: ... 这样的行,而不是在渲染结果中看到。它只做报告,不会修改时间线。

rename partition 会以 Spark 作业的方式,把某个分区值下的数据重写到另一个分区值下,并在成功后删除旧分区。该命令仅适用于只有一个分区字段的表:重写作业会按名称在 DataFrame 的 schema 中查找分区字段,而在多字段表中该名称是用逗号连接的字段列表,因此作业会在写入任何数据之前就失败。

hudi:trips->set --conf SPARK_HOME=<SPARK_HOME>
hudi:trips->rename partition --oldPartition 2026/08/26 --newPartition 2026-08-26 --sparkMaster local[2]

repair deprecated partition 是该 rename 操作的特殊情况,适用于在 Hudi 确定使用占位符表示 null 分区值之前写入的表:它会将已弃用的 default 分区中的数据重写到 __HIVE_DEFAULT_PARTITION__ 分区中。

hudi:trips->repair deprecated partition --sparkMaster local[2]

两者都接受 --sparkProperties(Spark 属性文件路径,默认为空)、--sparkMaster(默认未设置,即表示 yarn——参见命令参考图例下方的说明)以及 --sparkMemory(默认为 4G)。两者都会读取旧分区,将这些记录改写到新的分区值下,然后针对旧分区发起一次 delete_partition 写操作,因此变更会经过时间线,而不是绕过时间线。当旧分区中没有任何记录时,两者都是空操作。

有一点差异值得了解:rename partition 在删除写操作完成后,还会从存储中移除旧分区目录,若移除失败则记录一条警告;而 repair deprecated partition 则会保留已经清空的 default 目录。无论如何,这些操作都会重写数据,因此如果该表很重要,请先创建一个 savepoint。

审计存储锁

当表使用基于存储的锁提供器(lock provider)时,锁提供器可以把每一次锁状态变更记录到一组 JSONL 文件中,以便事后重建疑似发生的并发冲突。审计功能默认关闭,由锁本身所在位置旁边的一个配置文件控制,即 <basePath>/.hoodie/.locks/audit_enabled.json;审计记录写入 <basePath>/.hoodie/.locks/audit/。

hudi:trips->locks audit enable
Lock audit enabled successfully.
Audit config written to: /user/hive/warehouse/table1/.hoodie/.locks/audit_enabled.json
Audit files will be stored at: /user/hive/warehouse/table1/.hoodie/.locks/audit

locks audit status 会报告审计是否已开启,以及配置和记录分别存放在哪里。从未启用过审计的表会报告 DISABLED,并标注配置文件 (not found)。

hudi:trips->locks audit status
Lock Audit Status: ENABLED
Table: /user/hive/warehouse/table1
Config file: /user/hive/warehouse/table1/.hoodie/.locks/audit_enabled.json
Audit files location: /user/hive/warehouse/table1/.hoodie/.locks/audit

locks audit validate 正是收集这些记录的原因。它会解析审计文件夹中的每个 .jsonl 文件,将其切分为事务窗口,并逐一相互比对。重叠的窗口会被报告为错误,因为两个写入者同时持有锁恰恰是锁提供者(lock provider)所要防止的违规行为。从未释放锁的事务会被报告为警告,这通常意味着驱动器 OOM 或非正常关闭,而非正确性问题。最终结论可能是 PASSED(通过)、WARNING(仅发现警告)或 FAILED(发现任何错误)。

hudi:trips->locks audit validate
Validation Result: PASSED
Audit Files: 12 total, 12 parsed successfully, 0 failed to parse
Transactions Validated: 12
Issues Found: 0
Details: All audit lock transactions validated successfully

当没有审计文件夹或没有审计文件时,该命令会报告 PASSED,且校验事务数为零,因此仅凭 PASSED 的结论并不能证明审计功能曾经开启过。请先检查 locks audit status。

locks audit cleanup 用于清理旧记录。--ageDays 默认为 7,--dryRun 默认为 false,因此建议先使用 --dryRun true 运行一次,以查看将会删除哪些内容。

hudi:trips->locks audit cleanup --dryRun true --ageDays 30

locks audit disable 用于关闭审计功能。默认情况下会保留已有的审计记录;如需同时删除它们,可传入 --keepAuditFiles false,该参数在内部会执行相同的清理操作,但不设置保留时限。

hudi:trips->locks audit disable --keepAuditFiles true

所有五个命令都需要先连接表,否则会报告 No Hudi table loaded. Please connect to a table first.

命令参考

hudi-cli 暴露的每条命令,按功能领域分组,并列出其选项及默认值。标记为 (required) 的选项没有默认值,必须提供;选项后面用反引号括起的值是该选项的默认值;既未标记也未给出反引号值的选项为可选项,默认未设置,对大多数命令而言,这意味着会向命令传入空字符串。前面的章节已经更深入地介绍过其中常用的部分。

有一个默认值需要先说明,因为它并不像表面看起来那样是空字符串:未设置或留空的 --sparkMaster 会解析为 yarn。CLI 会把空值视同未设置,回退到自身的默认值,因此下面展示的每一条未附带值的 --sparkMaster,只要你不传入其他值,都会在 YARN 上运行。compaction(压缩)相关命令是例外:它们显式声明为 local。注意 marker delete 并非例外——尽管它看起来像是例外——因为它没有声明任何默认值,所以会像其他命令一样解析为 yarn。

某些条目其实是同一条命令的别名,而非彼此独立的命令。refresh、metadata refresh、commits refresh、cleans refresh 和 savepoints reload(savepoints refresh)是同一种方法的五个名称,用于重新加载表元数据;而 temp query / temp_query、temp delete / temp_delete 和 temps show / temps_show 则是同样三条命令的下划线与空格两种写法。

表与会话

  • cleans refresh 刷新表元数据。
  • commits refresh 刷新表元数据。
  • connect 连接到一个 hoodie 表。
    选项:--path(必填)、--eventuallyConsistent(false)、--initialCheckIntervalMs(2000)、--maxWaitIntervalMs(300000)、--maxCheckIntervalMs(7)、--timeGeneratorType(WAIT_TO_ADJUST_SKEW)、--maxExpectedClockSkewMs(200)、--useDefaultLockProvider(false)
  • create 如果 hoodie 表不存在,则创建该表。
    选项:--path(必填)、--tableName(必填)、--tableType(COPY_ON_WRITE)、--archiveLogFolder、--tableVersion、--payloadClass(org.apache.hudi.common.model.HoodieAvroPayload)
  • desc 描述 Hoodie 表的属性。
  • fetch table schema 获取最新的表结构。
    选项:--outputFilePath
  • kerberos kdestroy 销毁 Kerberos 认证。
    选项:--krb5conf(/etc/krb5.conf)
  • kerberos kinit 执行 Kerberos 认证。
    选项:--krb5conf(/etc/krb5.conf)、--principal(必填)、--keytab(必填)
  • metadata refresh 刷新表元数据。
  • refresh 刷新表元数据。
  • savepoints refresh 刷新表元数据。
  • set 为 CLI 设置 Spark 启动器环境变量。
    选项:--conf(必填)
  • show env 按键显示 Spark 启动器环境变量。
    选项:--key(必填)
  • show envs all 显示所有 Spark 启动器环境变量。
  • table change-table-type 将 Hudi 表类型更改为目标类型:COW 或 MOR。在更改为 COW 之前,除非另有指示,否则该命令会执行所有待处理的压缩操作,并在需要时执行一次完全压缩。
    选项:--target-type(必填)、--enable-compaction(true)、--parallelism(3)、--sparkMaster(local)、--sparkMemory(4G)、--retry(1)、--propsFilePath、--hoodieConfigs
  • table delete-configs 从表中删除所提供的表配置。
    选项:--comma-separated-configs(必填)
  • table recover-configs 恢复因中途失败的更新/删除操作而中断的表配置。
  • table update-configs 使用提供的文件中的配置更新表配置。
    选项:--props-file(必填)
  • utils loadClass 加载一个类。
    选项:--class(必填)

提交与时间线

  • commit show_write_stats 显示某个提交的写入统计信息。
    选项:--createView、--commit(必填)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)、--includeArchivedTimeline(false)
  • commit showfiles 显示某个提交的文件级详细信息。
    选项:--createView、--commit(必填)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)、--includeArchivedTimeline(false)
  • commit showpartitions 显示某个提交的分区级详细信息。
    选项:--createView、--commit(必填)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)、--includeArchivedTimeline(false)
  • commits compare 将提交与另一个 Hoodie 表进行比较。
    选项:--path(必填)
  • commits show 显示提交记录。
    选项:--includeExtraMetadata(false)、--createView、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)、--partition、--includeArchivedTimeline(false)
  • commits show_infights 显示滞留时间超过指定时长的进行中(inflight)即时操作。
    选项:--lookbackInMins(0)
  • commits showarchived 显示已归档的提交。
    选项:--includeExtraMetadata(false)、--createView、--startTs、--endTs、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)、--partition
  • commits sync 将提交与另一个 Hoodie 表进行同步。
    选项:--path(必填)
  • diff file 检查某个文件在一系列提交中的变化情况。
    选项:--fileId(必填)、--startTs、--endTs、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)、--includeArchivedTimeline(false)
  • diff partition 检查某个分区在一系列提交中的变化情况。该命令仅适用于分区表。
    选项:--partitionPath(必填)、--startTs、--endTs、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)、--includeArchivedTimeline(false)
  • metadata timeline show active 列出元数据表活动时间线中的所有即时操作。
    选项:--limit(10)、--sortBy、--desc(false)、--headeronly(false)、--show-time-seconds(false)
  • metadata timeline show incomplete 列出元数据表活动时间线中所有未完成的即时操作。
    选项:--limit(10)、--sortBy、--desc(false)、--headeronly(false)、--show-time-seconds(false)
  • show archived commit stats 从归档文件中读取提交,并显示文件组详细信息。
    选项:--archiveFolderPattern、--limit(10)、--sortBy、--desc(false)、--headeronly(false)
  • show archived commits 从归档文件中读取提交,并显示详细信息。
    选项:--skipMetadata(true)、--limit(10)、--sortBy、--desc(false)、--headeronly(false)
  • timeline show active 列出活动时间线中的所有即时操作。
    选项:--limit(10)、--sortBy、--desc(false)、--headeronly(false)、--with-metadata-table(false)、--show-rollback-info(false)、--show-time-seconds(false)
  • timeline show incomplete 列出活动时间线中所有未完成的即时操作。
    选项:--limit(10)、--sortBy、--desc(false)、--headeronly(false)、--show-rollback-info(false)、--show-time-seconds(false)
  • trigger archival 触发归档操作。
    选项:--minCommits(20)、--maxCommits(30)、--commitsRetainedByCleaner(10)、--enableMetadata(true)、--sparkMemory(1G)、--sparkMaster(local)

文件、统计信息与日志文件

  • show fsview all 显示完整的文件系统视图。
    选项:--pathRegex(*)、--baseFileOnly(false)、--maxInstant、--includeMax(false)、--includeInflight(false)、--excludeCompaction(false)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)
  • show fsview latest 显示最新的文件系统视图。
    选项:--partitionPath、--baseFileOnly(false)、--maxInstant、--merge(true)、--includeMax(false)、--includeInflight(false)、--excludeCompaction(false)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)
  • show logfile metadata 从日志文件中读取提交元数据。
    选项:--logFilePathPattern(必填)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)
  • show logfile records 从日志文件中读取记录。
    选项:--limit(10)、--logFilePathPattern(必填)、--mergeRecords(false)
  • stats filesizes 文件大小。显示文件大小的汇总统计信息。
    选项:--partitionPath(*/*/*)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)
  • stats wa 写放大。被更新插入(upsert)的记录数与实际写入的记录数之比。
    选项:--limit(-1)、--sortBy、--desc(false)、--headeronly(false)

表服务

  • clean showpartitions 显示清理(clean)的分区级别详情。
    选项:--clean(必填)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)
  • cleans run 执行清理。
    选项:--sparkMemory(4G)、--propsFilePath、--hoodieConfigs、--sparkMaster
  • cleans show 显示清理记录。
    选项:--limit(-1)、--sortBy、--startTs、--endTs、--includeArchivedTimeline(false)、--desc(false)、--headeronly(false)
  • clustering run 执行聚簇(Clustering)。
    选项:--sparkMaster(yarn)、--sparkMemory(4g)、--parallelism(1)、--retry(1)、--clusteringInstant、--propsFilePath、--hoodieConfigs
  • clustering schedule 调度聚簇。
    选项:--sparkMaster(yarn)、--sparkMemory(1g)、--propsFilePath、--hoodieConfigs
  • clustering scheduleAndExecute 执行聚簇。先生成聚簇计划并立即执行该计划。
    选项:--sparkMaster(yarn)、--sparkMemory(4g)、--parallelism(1)、--retry(1)、--propsFilePath、--hoodieConfigs
  • compaction repair 重命名文件,使其与 Hudi 元数据所规定的时间线保持一致。当 compaction unschedule 部分失败时使用。
    选项:--instant(必填)、--parallelism(3)、--sparkMaster(local)、--sparkMemory(2G)、--dryRun(false)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)
  • compaction run 为指定的 instant 时间执行压缩(Compaction)。
    选项:--parallelism(3)、--schemaFilePath、--sparkMaster(local)、--sparkMemory(4G)、--retry(1)、--compactionInstant、--propsFilePath、--hoodieConfigs
  • compaction schedule 调度压缩。
    选项:--sparkMemory(1G)、--propsFilePath、--hoodieConfigs、--sparkMaster(local)
  • compaction scheduleAndExecute 调度压缩计划并立即执行该计划。
    选项:--parallelism(3)、--schemaFilePath、--sparkMaster(local)、--sparkMemory(4G)、--retry(1)、--propsFilePath、--hoodieConfigs
  • compaction show 显示特定压缩 instant 的压缩详情。
    选项:--instant(必填)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)、--partition
  • compaction showarchived 显示特定压缩 instant 的压缩详情。
    选项:--instant(必填)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)、--partition
  • compaction unschedule 取消调度压缩。
    选项:--instant(必填)、--parallelism(3)、--sparkMaster(local)、--sparkMemory(2G)、--skipValidation(false)、--dryRun(false)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)
  • compaction unscheduleFileId 取消调度指定 fileId 的压缩。
    选项:--fileId(必填)、--partitionPath、--sparkMaster(local)、--sparkMemory(2G)、--skipValidation(false)、--dryRun(false)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)
  • compaction validate 校验压缩。
    选项:--instant(必填)、--parallelism(3)、--sparkMaster(local)、--sparkMemory(2G)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)
  • compactions show all 显示活跃时间线中的所有压缩。
    选项:--includeExtraMetadata(false)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)
  • compactions showarchived 显示指定时间窗口内的压缩详情。
    选项:--includeExtraMetadata(false)、--startTs、--endTs、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)
  • marker delete 删除标记(marker)。
    选项:--commit(必填)、--sparkProperties、--sparkMaster、--sparkMemory(1G)

回滚、保存点、恢复与修复

  • commit rollback 回滚一个提交。
    选项:--commit(必需)、--sparkProperties、--sparkMaster、--sparkMemory(4G)、--rollbackUsingMarkers(false)
  • downgrade table 降级一张表。
    选项:--toVersion、--sparkProperties、--sparkMaster、--sparkMemory(4G)
  • rename partition 重命名分区。用法:rename partition --oldPartition <oldPartition> --newPartition <newPartition>。
    选项:--oldPartition(必需)、--newPartition(必需)、--sparkProperties、--sparkMaster、--sparkMemory(4G)
  • repair addpartitionmeta 为表补充分区元数据(若不存在)。
    选项:--dryrun(true)
  • repair corrupted clean files 修复损坏的 clean 文件。
  • repair deduplicate 对包含重复数据的分区路径进行去重,并生成可用于替换的修复文件。
    选项:--duplicatedPartitionPath、--repairedOutputPath(必需)、--sparkProperties、--sparkMaster、--sparkMemory(4G)、--dryrun(true)、--dedupeType(insert_type)
  • repair deprecated partition 修复已弃用的分区(default)。将该弃用分区中的数据重写到 __HIVE_DEFAULT_PARTITION__ 中。
    选项:--sparkProperties、--sparkMaster、--sparkMemory(4G)
  • repair migrate-partition-meta 将当前以文本格式存储的所有分区 meta 文件迁移为以 base 文件格式存储。参见 HoodieTableConfig#PARTITION_METAFILE_USE_DATA_FORMAT。
    选项:--dryrun(true)
  • repair overwrite-hoodie-props 使用提供的文件覆盖 hoodie.properties。这是一个有风险的操作,请务必谨慎!
    选项:--new-props-file(必需)
  • repair show empty commit metadata 显示失败的提交。
  • savepoint create 为一个提交创建检查点(savepoint)。
    选项:--commit(必需)、--user(default)、--comments(default)、--sparkProperties、--sparkMaster、--sparkMemory(4G)
  • savepoint delete 删除检查点。
    选项:--commit(必需)、--sparkProperties、--sparkMaster、--sparkMemory(4G)
  • savepoint rollback 回滚到一个检查点。
    选项:--savepoint(必需)、--sparkProperties、--sparkMaster、--lazyFailedWritesCleanPolicy(false)、--sparkMemory(4G)
  • savepoints show 显示所有检查点。
  • show restore 显示某次 restore instant 的详细信息。
    选项:--instant(必需)、--limit(10)、--sortBy、--desc(false)、--headeronly(false)
  • show restores 列出所有 restore instant。
    选项:--limit(10)、--sortBy、--desc(false)、--headeronly(false)、--includeInflights(false)
  • show rollback 显示某次 rollback instant 的详细信息。
    选项:--instant(必需)、--limit(10)、--sortBy、--desc(false)、--headeronly(false)
  • show rollbacks 列出所有 rollback instant。
    选项:--limit(10)、--sortBy、--desc(false)、--headeronly(false)
  • upgrade table 升级一张表。
    选项:--toVersion、--sparkProperties、--sparkMaster、--sparkMemory(4G)

元数据表

  • metadata create 如果元数据表不存在,则创建该元数据表。
    选项:--sparkMaster(yarn)
  • metadata delete 删除元数据表。
    选项:--backup(true)
  • metadata delete-record-index 删除元数据表中的记录索引。
    选项:--backup(true)
  • metadata init 根据元数据表创建以来的提交记录更新元数据表。
    选项:--sparkMaster(yarn)、--readonly(false)
  • metadata list-files 打印元数据中某个分区下所有文件的列表。
    选项:--partition
  • metadata list-partitions 列出元数据中的所有分区。
    选项:--sparkMaster(yarn)
  • metadata lookup-record-index 打印某个 record_key 的记录索引信息。对于全局 RLI 只需提供 record key;对于分区 RLI 则需要同时提供 record key 和分区路径。
    选项:--record_key(必填)、--partition_path
  • metadata set 设置元数据表的选项。
    选项:--metadataDir
  • metadata stats 打印元数据的统计信息。
  • metadata validate-files 校验元数据中所有分区下的所有文件。
    选项:--verbose(false)

Bootstrap

  • bootstrap index showmapping 显示 bootstrap 索引映射关系。
    选项:--partitionPath、--fileIds、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)
  • bootstrap index showpartitions 显示已建立 bootstrap 索引的分区。
  • bootstrap run 对当前 Hudi 表执行 bootstrap 操作。
    选项:--srcPath(必填)、--targetPath(必填)、--tableName(必填)、--tableType(必填)、--rowKeyField(必填)、--partitionPathField、--bootstrapIndexClass(org.apache.hudi.common.bootstrap.index.hfile.HFileBootstrapIndex)、--selectorClass(org.apache.hudi.client.bootstrap.selector.MetadataOnlyBootstrapModeSelector)、--keyGeneratorClass(org.apache.hudi.keygen.SimpleKeyGenerator)、--fullBootstrapInputProvider(org.apache.hudi.bootstrap.SparkParquetBootstrapDataProvider)、--schemaProviderClass、--payloadClass、--merge-mode、--merge-strategy-id、--merge-impl-classes、--parallelism(1500)、--sparkMaster、--sparkMemory(4G)、--enableHiveSync(false)、--propsFilePath、--hoodieConfigs

锁审计

  • locks audit cleanup 清理过期的审计锁文件。
    选项:--dryRun(false)、--ageDays(7)
  • locks audit disable 为当前表禁用存储锁审计服务。
    选项:--keepAuditFiles(true)
  • locks audit enable 为当前表启用存储锁审计服务。
  • locks audit status 显示锁审计服务的当前状态。
  • locks audit validate 校验审计锁文件的一致性和完整性。

导出、临时视图与同步

  • export instants 从时间线(Timeline)中导出 Instant 及其元数据。
    选项:--limit(-1)、--actions(clean,commit,deltacommit,rollback,savepoint,restore)、--desc(false)、--localFolder(必填)
  • sync validate 通过统计记录数量来校验同步结果。
    选项:--mode(complete)、--sourceDb(rawdata)、--targetDb(dwh_hoodie)、--partitionCount(5)、--hiveServerUrl(必填)、--hiveUser、--hivePass
  • temp delete 删除视图名称。
    选项:--view(必填)
  • temp query 对已创建的临时视图执行查询。
    选项:--sql(必填)
  • temp_delete 删除视图名称。
    选项:--view(必填)
  • temp_query 对已创建的临时视图执行查询。
    选项:--sql(必填)
  • temps show 显示所有视图名称。
  • temps_show 显示所有视图名称。

博客

评论

登录后参与评论

正在加载评论…