如何通过编程方式访问Hudi指标,获取提交后记录操作统计数据
编程获取Hudi提交后指标实现方案
前置配置补充
你已经配置的hoodie.metrics.on=true和hoodie.metrics.reporter.type=INMEMORY是基础配置,还需要补充开启提交自动收集开关,完整配置如下:
hoodie.metrics.on=true hoodie.metrics.reporter.type=INMEMORY # 每次提交完成后自动收集指标到内存Reporter hoodie.metrics.inmemory.reporter.collect.on.commit=true
实现方案1:通过内存Metrics Reporter读取(适配DataFrame写入场景)
Hudi的INMEMORY类型指标Reporter会将最近一次提交的全量指标缓存在内存中,不需要直接实例化HoodieMetrics对象,通过静态方法即可读取:
Scala示例
import org.apache.hudi.metrics.HoodieInMemoryMetricsReporter import org.apache.spark.sql.SaveMode // 原有Hudi写入逻辑 df.write.format("hudi") .options(hudiConfig) .mode(SaveMode.Append) .save(tablePath) // 写入完成后读取指标 val allMetrics = HoodieInMemoryMetricsReporter.getLatestMetrics // 提取核心指标,键名可根据实际Hudi版本调整,若取不到可先打印allMetrics全量键值对确认 val insertCount = allMetrics.getOrDefault("commit.totalInsertRecords", 0L) val updateCount = allMetrics.getOrDefault("commit.totalUpdateRecords", 0L) val deleteCount = allMetrics.getOrDefault("commit.totalDeleteRecords", 0L) // 此处可将指标写入你需要留存的数据库
Java示例
import org.apache.hudi.metrics.HoodieInMemoryMetricsReporter; import java.util.Map; // 写入逻辑执行完成后 Map<String, Long> allMetrics = HoodieInMemoryMetricsReporter.getLatestMetrics(); long insertCount = allMetrics.getOrDefault("commit.totalInsertRecords", 0L); long updateCount = allMetrics.getOrDefault("commit.totalUpdateRecords", 0L); long deleteCount = allMetrics.getOrDefault("commit.totalDeleteRecords", 0L);
实现方案2:通过WriteClient返回元数据读取(适配原生API写入场景)
如果你使用Hudi原生HoodieWriteClient实现写入,不需要开启Metrics配置,直接从提交返回的元数据中即可读取指标:
// 提交写入操作 val writeMetadata = hoodieWriteClient.commit(instantTime, writeStatusList) // 直接从元数据中获取统计指标 val insertCount = writeMetadata.getCommitMetadata.getStats.getTotalInserts val updateCount = writeMetadata.getCommitMetadata.getStats.getTotalUpdates val deleteCount = writeMetadata.getCommitMetadata.getStats.getTotalDeletes
注意事项
- 若作业内并发写入多个Hudi表,需为每个表单独配置
hoodie.metrics.inmemory.reporter.table.name参数,避免不同表的指标互相覆盖 - 不同Hudi版本的指标键名存在少量差异,若内置键取不到,可先打印全量指标的键值对确认对应命名
内容的提问来源于stack exchange,提问作者Joha
相关产品推荐
相关产品推荐

