运维 Hudi

指标

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

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

在本节中,我们将介绍 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 指标的示意图。

hudi_jxm_metrics.png

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 指标。

hudi_graphite_metrics.png

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_datadog_metrics.png

如上所示,我们能够收集 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=false

AWS 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 等标准工具上。下面是提交时长图表的示例。

hudi_commit_duration.png

指标列表:

以下指标在各个时间线操作(deltacommit、compaction、clustering、rollback、clean、archival)以及提交后回调中输出。当设置了 hoodie.metrics.reporter.metricsname.prefix 时,每个名称都会带上 <prefix>.<name> 前缀。

名称描述
commitFreshnessInMs提交结束时间与传入记录最大事件时间之间的毫秒数。
commitLatencyInMs提交结束时间与传入记录最小事件时间之间的毫秒数。
commitTime提交时间,以纪元毫秒表示。
duration提交/回滚操作所耗的总时间(毫秒)。
numFilesDeleted清理/回滚过程中删除的文件数量。
numFilesFinalized一次写入中最终确定(finalize)的文件数量。
totalBytesWrittenHoodieCommit 中写入的字节数。
totalCompactedRecordsUpdated压缩操作中更新的记录数。
totalCreateTimeHoodie Insert 操作中创建文件所耗的时间。
totalFilesInsertHoodieCommit 中新写入的文件数量。
totalFilesUpdateHoodieCommit 中更新的文件数量。
totalInsertRecordsWrittenHoodieCommit 中插入的记录数,或转换为更新的记录数(用于处理小文件)。
totalLogFilesCompacted某文件组中一个基础文件下被压缩的日志文件数量。
totalLogFilesSize某文件组中一个基础文件下所有日志文件的总字节数。
totalPartitionsWrittenHoodieCommit 中发生写入的分区数量。
totalRecordsWrittenHoodieCommit 中写入的记录数。对于插入,为插入的总记录数;对于更新,为文件中的总记录数。
totalScanTime读取并合并日志文件中日志块所耗的时间。
totalUpdateRecordsWrittenHoodieCommit 中发生变更的记录数。
totalUpsertTimeHoodie 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>,从而确保不同表的指标不会相互冲突。此功能无需任何配置。

评论

登录后参与评论

正在加载评论…