指标
在本节中,我们将介绍 Hudi 中的 MetricsReporter 和 HoodieMetrics。你可以在此处查看与指标相关的配置。
MetricsReporter
MetricsReporter 提供了将 HoodieMetrics 上报到用户指定后端的 API。目前的实现包括 InMemoryMetricsReporter、JmxMetricsReporter、MetricsGraphiteReporter 和 DatadogMetricsReporter。由于 InMemoryMetricsReporter 仅用于测试,我们将介绍其余三种实现。
JmxMetricsReporter
JmxMetricsReporter 是 JMX 上报器的一种实现,用于上报 JMX 指标。
配置
下面是 JmxMetricsReporter 的配置示例。更多详细配置可以参考此处。
hoodie.metrics.on=true
hoodie.metrics.reporter.type=JMX
hoodie.metrics.jmx.host=192.168.0.106
hoodie.metrics.jmx.port=4001演示
按照上面的配置,JmxMetricsReporter 将在端口 4001 上启动 JMX 服务器。我们可以启动 jconsole 连接到 192.168.0.106:4001。下面展示了通过 jconsole 监控 Hudi JMX 指标的示意图。

MetricsGraphiteReporter
MetricsGraphiteReporter 是 Graphite 报告器的一种实现,它连接到 Graphite 服务器,并向其发送 HoodieMetrics 数据。
配置项
以下是 MetricsGraphiteReporter 的配置示例。更多详细配置可参见此处。
hoodie.metrics.on=true
hoodie.metrics.reporter.type=GRAPHITE
hoodie.metrics.graphite.host=192.168.0.106
hoodie.metrics.graphite.port=2003
hoodie.metrics.graphite.metric.prefix=<your metrics prefix>演示
按照上述配置,假设 Graphite 服务器运行在主机 192.168.0.106、端口 2003 上,正在运行的 Hudi 作业将连接该服务器并向其上报指标数据。下面展示了如何通过 Graphite 监控 Hudi 指标。

DatadogMetricsReporter
DatadogMetricsReporter 是 Datadog 上报器的一种实现。该上报器通过 Datadog HTTP API 将指标值发布到 Datadog 监控服务。
配置
以下是 DatadogMetricsReporter 的配置示例。更详细的配置可参考此处。
hoodie.metrics.on=true
hoodie.metrics.reporter.type=DATADOG
hoodie.metrics.datadog.api.site=EU # or US
hoodie.metrics.datadog.api.key=<your api key>
hoodie.metrics.datadog.metric.prefix=<your metrics prefix>hoodie.metrics.datadog.api.site用于设置 Datadog API 站点,决定请求是发送到 api.datadoghq.eu(欧盟)还是 api.datadoghq.com(美国)。请根据您的 Datadog 账户设置进行配置。hoodie.metrics.datadog.api.key用于设置 API 密钥。hoodie.metrics.datadog.metric.prefix通过为不同作业设置不同的前缀来区分指标。请注意,它会使用.作为前缀与指标名称之间的分隔符。例如,如果前缀设置为foo,则会在指标名称前加上foo.。
演示
在本演示中,我们运行了一个 Hudi Streamer 作业,启用了 hoodie.metrics.enable,并正确设置了其他相关配置。

如上所示,我们能够收集 Hudi 与操作相关的指标,例如:
<prefix>.<table name>.commit.totalScanTime<prefix>.<table name>.clean.duration<prefix>.<table name>.index.lookup.duration
以及 Hudi Streamer 特有的指标:
<prefix>.<table name>.deltastreamer.duration<prefix>.<table name>.deltastreamer.hiveSyncDuration
PrometheusMetricsReporter
Prometheus 是一个开源的系统监控与告警工具包。Prometheus 提供了一个 PushGateway,Apache Hudi 可以利用它来进行指标上报。请参阅 Prometheus 文档 了解基本的设置说明。
与其他受支持的上报器类似,启用 pushgateway 上报器需要以下属性:
hoodie.metrics.on=true
hoodie.metrics.reporter.type=PROMETHEUS_PUSHGATEWAY以下属性用于配置 pushgateway 的地址和端口号。默认地址为 localhost,默认端口为 9091。
hoodie.metrics.pushgateway.host=xxxx
hoodie.metrics.pushgateway.port=9091你可以配置任务结束时是否从 Pushgateway 中删除监控信息,默认值为 true。
hoodie.metrics.pushgateway.delete.on.shutdown=false可以配置任务名称前缀以及是否需要随机后缀,默认为 true。
hoodie.metrics.pushgateway.job.name=xxxx
hoodie.metrics.pushgateway.random.job.name.suffix=falseAWS CloudWatchReporter
Hudi 支持将指标发布到 Amazon CloudWatch。可以通过将 hoodie.metrics.reporter.type 设置为 CLOUDWATCH 来进行配置。要使用的静态 AWS 凭证可以通过 hoodie.aws.access.key、hoodie.aws.secret.key 和 hoodie.aws.session.token 这些属性进行配置。在未配置静态 AWS 凭证的情况下,将使用 DefaultAWSCredentialsProviderChain 通过检查环境属性来获取凭证。其他可调优的 Amazon CloudWatch reporter 专属属性位于 HoodieMetricsCloudWatchConfig 类中。
该 reporter 类位于可选的 hudi-aws 模块中,并非所有引擎的 shade 包都会包含它:hudi-spark-bundle 就没有包含。如果因为无法加载 org.apache.hudi.aws.metrics.cloudwatch.CloudWatchMetricsReporter 而导致将 reporter 类型设置为 CLOUDWATCH 失败,请将与你的 Hudi 版本匹配的 hudi-aws-bundle jar 添加到 classpath 中。
UserDefinedMetricsReporter
允许用户定义自定义的指标 reporter。
配置
以下是 UserDefinedMetricsReporter 的一个示例。更多详细配置可参见此处。
hoodie.metrics.on=true
hoodie.metrics.reporter.class=test.TestUserDefinedMetricsReporter演示
在这个简单的演示中,TestMetricsReporter 将每 10 秒打印一次所有指标(gauge)。
public static class TestUserDefinedMetricsReporter
extends AbstractUserDefinedMetricsReporter {
private static final Logger log = LogManager.getLogger(DummyMetricsReporter.class);
private ScheduledExecutorService exec = Executors.newScheduledThreadPool(1, r -> {
Thread t = Executors.defaultThreadFactory().newThread(r);
t.setDaemon(true);
return t;
});
public TestUserDefinedMetricsReporter(Properties props, MetricRegistry registry) {
super(props, registry);
}
@Override
public void start() {
exec.schedule(this::report, 10, TimeUnit.SECONDS);
}
@Override
public void report() {
this.getRegistry().getGauges().forEach((key, value) ->
log.info("key: " + key + " value: " + value.getValue().toString()));
}
@Override
public Closeable getReporter() {
return null;
}
@Override
public void stop() {
exec.shutdown();
}
}HoodieMetrics
当 Hudi 写入器为 HoodieMetrics 配置了正确的表和环境后,它会生成以下 HoodieMetrics,以帮助调试 Hudi 表:
- 提交时长(Commit Duration) - 成功提交一批记录所花费的时间
- 回滚时长(Rollback Duration) - 类似地,撤销失败提交所遗留的部分数据所花费的时间(写入失败后会自动回滚)
- 文件级指标(File Level metrics) - 展示每次提交中新增文件数、版本数以及删除(清理)的文件数
- 记录级指标(Record Level Metrics) - 每次提交中插入/更新等操作的记录总数
- 分区级指标(Partition Level metrics) - 更新(upsert)的分区数量(对于理解提交时长的突然飙升非常有用)
这些 HoodieMetrics 随后可以绘制到 Grafana 等标准工具上。下面是提交时长图表的示例。

指标列表:
以下指标在各个时间线操作(deltacommit、compaction、clustering、rollback、clean、archival)以及提交后回调中输出。当设置了 hoodie.metrics.reporter.metricsname.prefix 时,每个名称都会带上 <prefix>.<name> 前缀。
| 名称 | 描述 |
|---|---|
| commitFreshnessInMs | 提交结束时间与传入记录最大事件时间之间的毫秒数。 |
| commitLatencyInMs | 提交结束时间与传入记录最小事件时间之间的毫秒数。 |
| commitTime | 提交时间,以纪元毫秒表示。 |
| duration | 提交/回滚操作所耗的总时间(毫秒)。 |
| numFilesDeleted | 清理/回滚过程中删除的文件数量。 |
| numFilesFinalized | 一次写入中最终确定(finalize)的文件数量。 |
| totalBytesWritten | HoodieCommit 中写入的字节数。 |
| totalCompactedRecordsUpdated | 压缩操作中更新的记录数。 |
| totalCreateTime | Hoodie Insert 操作中创建文件所耗的时间。 |
| totalFilesInsert | HoodieCommit 中新写入的文件数量。 |
| totalFilesUpdate | HoodieCommit 中更新的文件数量。 |
| totalInsertRecordsWritten | HoodieCommit 中插入的记录数,或转换为更新的记录数(用于处理小文件)。 |
| totalLogFilesCompacted | 某文件组中一个基础文件下被压缩的日志文件数量。 |
| totalLogFilesSize | 某文件组中一个基础文件下所有日志文件的总字节数。 |
| totalPartitionsWritten | HoodieCommit 中发生写入的分区数量。 |
| totalRecordsWritten | HoodieCommit 中写入的记录数。对于插入,为插入的总记录数;对于更新,为文件中的总记录数。 |
| totalScanTime | 读取并合并日志文件中日志块所耗的时间。 |
| totalUpdateRecordsWritten | HoodieCommit 中发生变更的记录数。 |
| totalUpsertTime | Hoodie Merge 所耗的时间。 |
| clean.duration | 清理操作的实际挂钟时间(毫秒)。 |
| archive.duration | 归档操作的实际挂钟时间(毫秒)。 |
| rollback.failure.counter | 每次回滚操作失败时递增。 |
| postCommit.success.counter | 每次所有提交后回调成功时递增。 |
| postCommit.failure.counter | 每次提交后回调失败时递增(提交后失败是非致命的)。 |
| postCommit.duration | 提交后回调执行的实际挂钟时间(毫秒)。 |
| archival.archivalNumAllCommits | 本次归档运行中归档的瞬时(instant)总数。 |
| archival.archivalNumWriteCommits | 归档的写入类瞬时数量(commit、deltacommit、replacecommit)。 |
| archival.archivalNumCleanCommits | 归档的 clean 瞬时数量。 |
| archival.archivalNumRollbackCommits | 归档的回滚瞬时数量。 |
| archival.archivalStatus | 成功为 1,失败为 -1。 |
| archival.archivalFailure.<ExceptionClassName> | 归档失败时递增;后缀为所抛异常的简单类名。 |
| archival.archivalOutOfMemory | 归档因 OutOfMemoryError 失败时递增。 |
| <action>.totalCorruptedLogBlocks | 压缩过程中遇到的损坏日志块数量。仅在 hoodie.metricscompaction.log.blocks.on=true 时上报。<action> 为提交动作类型(例如 commit)。 |
| <action>.totalRollbackLogBlocks | 压缩过程中遇到的回滚日志块数量。仅在 hoodie.metricscompaction.log.blocks.on=true 时上报。 |
| <action>.totalLogBlocksCompacted | 压缩的日志块总数。仅在 hoodie.metricscompaction.log.blocks.on=true 时上报。 |
这些指标位于 org.apache.hudi.metrics.HoodieMetrics(与归档相关的特定指标名称来自 org.apache.hudi.client.utils.ArchivalMetrics),并由 org.apache.hudi.common.model.HoodieCommitMetadata 和 org.apache.hudi.common.model.HoodieWriteStat 引用。
在多租户部署场景中,如果单个 Spark 作业写入多个 Hudi 表,则每张表都会拥有各自独立、互不干扰的 MetricRegistry,其作用域为 <tableName>.<registryName>,从而确保不同表的指标不会相互冲突。此功能无需任何配置。
评论
登录后参与评论
KnowForge