CLI
本地环境搭建
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,请按以下步骤操作:
- 创建一个空文件夹作为新目录
- 将 hudi-cli-bundle jar 和 hudi-spark*-bundle jar 复制到该目录
- 将以下脚本和文件夹复制到该目录
packaging/hudi-cli-bundle/hudi-cli-with-bundle.sh
packaging/hudi-cli-bundle/conf . the `conf` folder should be in this directory.- 设置好环境变量后,启动 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 版本。如果想使用其他版本,你需要相应地修改下面的命令:
- 启动 Dataproc 集群后,可以通过以下方式 SSH 登录:
$ gcloud compute ssh --zone "YOUR_ZONE" "HOSTNAME_OF_MASTER_NODE" --project "YOUR_PROJECT"- 下载 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- 下载 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- 下载用于启动 Hudi CLI bundle 的 shell 脚本
wget https://raw.githubusercontent.com/apache/hudi/release-1.2.1/packaging/hudi-cli-bundle/hudi-cli-with-bundle.sh- 使用相应的环境变量启动 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- hudi->connect --path gs://path_to_some_table
Metadata for table some_table loaded - 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| 选项 | 默认值 | 说明 |
|---|---|---|
--minCommits | 20 | 活跃时间线中保留的最少 instant 数量。对应 hoodie.keep.min.commits。 |
--maxCommits | 30 | 活跃时间线中保留的最多 instant 数量。对应 hoodie.keep.max.commits。 |
--commitsRetainedByCleaner | 10 | 在不执行清理的情况下保留的提交数量。 |
--enableMetadata | true | 本次运行是否启用元数据表。 |
--sparkMemory | 1G | Spark executor 内存。 |
--sparkMaster | local | Spark 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 Compactionhudi: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 20220128170512331show 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 或 9 | 1.1.x - 1.2.x |
EIGHT 或 8 | 1.0.x |
SIX 或 6 | 0.14.x - 0.15.x |
FIVE 或 5 | 0.12.x - 0.13.x |
FOUR 或 4 | 0.11.x |
THREE 或 3 | 0.10.x |
TWO 或 2 | 0.9.x |
ONE 或 1 | 0.6.x - 0.8.x |
ZERO 或 0 | 0.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=6Hudi 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 会将列出的条目限制为尚未完成的实例。
| 选项 | 默认值 | 适用范围 | 描述 |
|---|---|---|---|
--limit | 10 | 两者均适用 | 要显示的行数。 |
--sortBy | 未设置 | 两者均适用 | 排序所依据的字段。 |
--desc | false | 两者均适用 | 反转排序顺序。 |
--headeronly | false | 两者均适用 | 只打印表头。 |
--show-rollback-info | false | 两者均适用 | 在两个方向上为 Action 列添加标注:回滚实例显示 Rolls back ...(回滚了……),被回滚的实例显示 Rolled back by ...(被……回滚)。 |
--show-time-seconds | false | 两者均适用 | 在实例文件修改时间中包含秒数。 |
--with-metadata-table | false | 仅 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 truediff file 接受 --fileId,diff partition 接受 --partitionPath(相对于表基础路径的分区路径)。diff partition 仅对分区表有意义。两者随后共享以下选项:
| 选项 | 默认值 | 说明 |
|---|---|---|
--includeArchivedTimeline | false | 除了活动时间线外,还扫描已归档的 instant。 |
--startTs | 未设置,即当前时间减 10 天 | instant 范围的起始时间。仅在 --includeArchivedTimeline 为 true 时生效。 |
--endTs | 未设置,即当前时间减 1 天 | instant 范围的结束时间。仅在 --includeArchivedTimeline 为 true 时生效。 |
--limit | -1,即不限制 | 显示的行数。 |
--sortBy | 未设置 | 排序字段。 |
--desc | false | 反转排序顺序。 |
--headeronly | false | 仅打印表头。 |
请注意这三个范围选项之间的相互作用,这一点很容易搞错。--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/auditlocks 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/auditlocks 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 30locks 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获取最新的表结构。
选项:--outputFilePathkerberos 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、--hoodieConfigstable 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)、--partitioncommits 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、--sparkMastercleans 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、--hoodieConfigsclustering schedule调度聚簇。
选项:--sparkMaster(yarn)、--sparkMemory(1g)、--propsFilePath、--hoodieConfigsclustering scheduleAndExecute执行聚簇。先生成聚簇计划并立即执行该计划。
选项:--sparkMaster(yarn)、--sparkMemory(4g)、--parallelism(1)、--retry(1)、--propsFilePath、--hoodieConfigscompaction 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、--hoodieConfigscompaction schedule调度压缩。
选项:--sparkMemory(1G)、--propsFilePath、--hoodieConfigs、--sparkMaster(local)compaction scheduleAndExecute调度压缩计划并立即执行该计划。
选项:--parallelism(3)、--schemaFilePath、--sparkMaster(local)、--sparkMemory(4G)、--retry(1)、--propsFilePath、--hoodieConfigscompaction show显示特定压缩 instant 的压缩详情。
选项:--instant(必填)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)、--partitioncompaction showarchived显示特定压缩 instant 的压缩详情。
选项:--instant(必填)、--limit(-1)、--sortBy、--desc(false)、--headeronly(false)、--partitioncompaction 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打印元数据中某个分区下所有文件的列表。
选项:--partitionmetadata list-partitions列出元数据中的所有分区。
选项:--sparkMaster(yarn)metadata lookup-record-index打印某个 record_key 的记录索引信息。对于全局 RLI 只需提供 record key;对于分区 RLI 则需要同时提供 record key 和分区路径。
选项:--record_key(必填)、--partition_pathmetadata set设置元数据表的选项。
选项:--metadataDirmetadata 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、--hivePasstemp delete删除视图名称。
选项:--view(必填)temp query对已创建的临时视图执行查询。
选项:--sql(必填)temp_delete删除视图名称。
选项:--view(必填)temp_query对已创建的临时视图执行查询。
选项:--sql(必填)temps show显示所有视图名称。temps_show显示所有视图名称。
博客
评论
登录后参与评论
KnowForge