Hudi回调功能简介及使用示例

从0.6.0版本起,Hudi支持commit回调功能,成功提交commit时会向外部系统发回调信息。本文介绍了支持的HTTP和Kafka两种回调方式,详细说明了参数配置,并以HTTP回调为例给出使用示例,方便用户查询增量数据进行业务处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 功能简介

从0.6.0版本开始,Hudi开始支持 commit 回调功能。每当Hudi成功提交一次 commit, 其内部的回调服务就会向外部系统发出一条回调信息。用户可以根据该回调信息查询hudi表的增量数据,并根据具体需求进行相应的业务处理。

1.1 支持的回调方式

当前 HoodieDeltaStreamer 可用过 HTTP(默认) 和 Kafka 两种方式向外部发送回调信息,而 SparkDataSource 只支持 HTTP 一种。两种数据摄入方式在使用回调功能上没有区别(除了回调方式支持不同外),均通过参数配置实现。

配置相应参数后,启动的任务会在每次成功提交后像外部系统发送 Json 格式的回调信息,信息样例:

{"commitTime":"20201225152956","tableName":"callback_test","basePath":"file:///tmp/hudi_callback"}

1.2 参数配置

1.2.1 HTTP

HTTP 回调是默认方式,可通过配置下列参数启用.

必配参数:

## 是否开启回调功能,默认false
hoodie.write.commit.callback.on=true

## 回调地址(必填)
hoodie.write.commit.callback.http.url=http://ip:端口/callback

可选参数:

## 超时时间,默认三秒
hoodie.write.commit.callback.http.timeout.seconds=xxx
## api key 默认:hudi_write_commit_http_callback
hoodie.write.commit.callback.http.api.key=fake_api_key

Note: 回调接收服务需使用 callbackMsg 字段接收信息。

1.2.2 Kafka

Kafka回调目前只支持 HoodieDeltaStreamer,使用方式与 HTTP类似.

必配参数:

## 是否开启回调功能,默认false
hoodie.write.commit.callback.on=true

## 回调方式,使用Kafka实现类
hoodie.write.commit.callback.class=org.apache.hudi.utilities.callback.kafka.HoodieWriteCommitKafkaCallback

## Kafka server
hoodie.write.commit.callback.kafka.bootstrap.servers=xxx:9092

## 回调 kafka 主题
hoodie.write.commit.callback.kafka.topic=xxx_topic

可选参数:

## 输出写出的分区,默认 0
hoodie.write.commit.callback.kafka.partition=分区数

## ack 级别,默认 all
hoodie.write.commit.callback.kafka.acks=all

## 失败重试次数,默认 3
hoodie.write.commit.callback.kafka.retries=重试次数

2. HTTP方式使用示例

由于使用方式相同,这里方便起见我们使用HTTP 方式示例。

数据写入代码:

@Test
def insert(): Unit = {
  val inserts = convertToStringList(dataGen.generateInserts(100))
  val df = spark.read.json(spark.sparkContext.parallelize(inserts, 2))
  df.write.format("hudi").
    options(getQuickstartWriteConfigs).
    option(PRECOMBINE_FIELD_OPT_KEY, "ts").
    option(RECORDKEY_FIELD_OPT_KEY, "uuid").
    option(PARTITIONPATH_FIELD_OPT_KEY, "partitionpath").
    option(HoodieWriteCommitCallbackConfig.CALLBACK_ON, "true").
    option(HoodieWriteCommitCallbackConfig.CALLBACK_HTTP_URL_PROP, "http://localhost:8080/callback").
    option(TABLE_NAME, tableName).
    mode(Overwrite).
    save(basePath)
}

Note:

tableName = "callback_test"
basePath = "file:///tmp/hudi_callback"

接收回调信息的服务:

@RestController
public class HoodieCallbackController {

  @RequestMapping("/callback")
  public void callback(@RequestBody String callbackMsg) {
    System.out.println(callbackMsg);
  }
}

启动insert方法,控制台打印出回调信息:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.4.1)

2020-12-25 15:29:37.732  INFO 3860 --- [           main] c.h.h.HudiCallbackApplication            : Starting HudiCallbackApplication using Java 1.8.0_211 on Mathieu with PID 3860 (/Users/wangxianghu/github/hudi-callback/target/classes started by wangxianghu in /Users/wangxianghu/github/hudi-callback)
2020-12-25 15:29:37.735  INFO 3860 --- [           main] c.h.h.HudiCallbackApplication            : No active profile set, falling back to default profiles: default
2020-12-25 15:29:38.386  INFO 3860 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2020-12-25 15:29:38.394  INFO 3860 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-12-25 15:29:38.394  INFO 3860 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.41]
2020-12-25 15:29:38.443  INFO 3860 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-12-25 15:29:38.443  INFO 3860 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 674 ms
2020-12-25 15:29:38.577  INFO 3860 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2020-12-25 15:29:38.737  INFO 3860 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-12-25 15:29:38.747  INFO 3860 --- [           main] c.h.h.HudiCallbackApplication            : Started HudiCallbackApplication in 1.279 seconds (JVM running for 1.698)
2020-12-25 15:29:59.893  INFO 3860 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-12-25 15:29:59.894  INFO 3860 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2020-12-25 15:29:59.894  INFO 3860 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms
{"commitTime":"20201225152956","tableName":"callback_test","basePath":"file:///tmp/hudi_callback"}

3. 总结

本文简要介绍了Hudi支持的回调方式以及各种方式的详细配置,并以 HTTP回调方式为例做了简要示范。

### Apache Hudi 使用教程 Apache Hudi 是一种用于管理大数据集的开源框架,它允许用户在 Hadoop 文件系统上执行高效的增量数据摄取和查询操作。以下是关于其使用的详细介绍: #### 1. 基本概念与架构 Apache Hudi 提供了一种灵活的方式来管理和分析海量数据。它的设计目标是在不改变现有基础设施的情况下提供高性能的数据写入和读取能力[^1]。Hudi 支持多种存储格式(如 Parquet 和 ORC),并可以无缝集成到现有的大数据生态系统中。 #### 2. 安装与配置 为了开始使用 Apache Hudi,需要完成以下几个步骤: - **下载与安装**:可以从官方仓库获取最新的二进制版本或者源码编译。 - **依赖项设置**:确保环境中已安装必要的组件,例如 Hadoop、Spark 等。 - **配置文件调整**:根据实际需求修改 `hudi-site.xml` 配置文件中的参数[^2]。 #### 3. 数据写入流程 Hudi 提供了两种主要的数据写入方式——批量插入 (Bulk Insert) 和追加/更新 (Append/Update),具体实现如下: ```java // 创建 SparkSession 实例 val spark = SparkSession.builder().appName("Hoodie Example").getOrCreate() // 设置表路径和其他选项 val hudipath = "path/to/hudi/table" val tableName = "my_hudi_table" // 构建 DataFrame 并保存至 Hudi 表 df.write.format("org.apache.hudi"). options(Map[String,String]( HoodieWriteConfig.TABLE_NAME -> tableName, hoodie.datasource.write.precombine.field -> "ts", hoodie.datasource.write.recordkey.field -> "uuid", hoodie.datasource.write.partitionpath.field -> "partition_field" )).mode(SaveMode.Append).save(hudipath) ``` 上述代码片段展示了如何通过 Apache Spark 将数据写入到 Hudi 表中。 #### 4. 查询机制 对于已经存放在 Hudi 中的数据,可以通过以下方式进行访问: - **实时视图**:反映最近一次提交后的状态变化情况; - **快照视图**:展示某一时间点上的固定记录集合; - **增量拉取**:仅提取自上次同步以来新增或更改的部分内容。 这些特性使得基于不同业务场景下的数据分析变得更加便捷高效[^3]。 #### 5. 注意事项 当实际应用过程中可能会遇到一些挑战,因此建议遵循以下指导原则来保障系统的稳定性和效率[^4]: - 维护好元数据服务端口开放权限以及副本数量设定; - 对于大容量作业适当增加分片数目减少热点形成概率 ; - 测试验证各个阶段衔接是否顺畅无误后再推广上线运营. #### 总结 综上所述,借助恰当的方法论配合良好规划之后实施部署方案,则能够充分发挥出Apache Hudi所带来的优势价值所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值