Hudi 多表摄取工具 HoodieMultiTableStreamer 配置方法与示例

news2024/10/7 20:24:43
《大数据平台架构与原型实现:数据中台建设实战》博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维码进入京东手机购书页面。

1. 多表公共配置和差异配置的两种处理方式


由于 Hudi 的 HoodieMultiTableStreamer / HoodieMultiTableDeltaStreamer 是一次处理多张 Hudi 表的写入,这些表既会有如 hoodie.deltastreamer.source.kafka.value.deserializer.class 这样相同的公共配置,也会有如 hoodie.datasource.write.recordkey.field 这样每张表每张表都不同的个性化配置,为此,HoodieMultiTableStreamer / HoodieMultiTableDeltaStreamer 给出的解决方案是:将公共配置提取到一个配置文件,将每张表的个性化配置放置到多个对应文件中,至于如何将每张表的表名和它的配置文件映射起来,Hudi 提供两种方案:

方式一:

在公共配置文件中通过 hoodie.deltastreamer.ingestion.<db>.<table>.configFile 显式指定 <db>.<table> 对应的配置文件,以下是一个示例:

hoodie.deltastreamer.ingestion.tablesToBeIngested=db1.table1,db2.table2
hoodie.deltastreamer.ingestion.db1.table1.configFile=/tmp/config_table1.properties
hoodie.deltastreamer.ingestion.db2.table2.configFile=/tmp/config_table2.properties

方式二:

将所有表的配置文件统一放置到一个文件夹,并按照 <database>_<table>_config.properties 形式统一命名,通过 --config-folder 参数指明文件夹的路径后,Hudi 就能根据文件名自动映射到对应表,不必再向方式一那样显式配置。这是使用了“约定大约配置”的处理方式,方式二更加简洁,是首选的配置方式,我们接下来就详细介绍一下。

2. 首选方式:使用约定的多表文件命名规则简化配置


这一配置方式可简述为:将所有表的配置文件统一放置到一个文件夹下,并按照 <database>_<table>_config.properties 形式统一命名,同时,在公共配置文件中通过 hoodie.deltastreamer.ingestion.tablesToBeIngested 配置项以 <db1>.<table1>,<db2>.<table2>,... 的形式列出所有表,最后,在命令行中通过参数 --config-folder 指明文件夹的路径,这样 Hudi 就能根据约定的命名规则找到每张表的对应配置文件,那就不必再通过 hoodie.streamer.ingestion.<database>.<table>.configFile 显式地逐一配置。以下是一个示例:

1. common.properties

hoodie.deltastreamer.ingestion.tablesToBeIngested=db1.table1,db2.table2

2. config folder 目录结构

/tmp
├── db1_table1_config.properties
├── db2_table2_config.properties

3. 作业提交命令

spark-submit \
    ...
    --props file://common.properties \
    --config-folder file://tmp \
    ...

3. 启用 Schema Registry 时多个 Topic 的 Schema URL 的配置方法


另一个涉及多表特化配置的地方是在 HoodieMultiTableStreamer 摄取 Debezium CDC 数据写入 Hudi 表时,由于 Hudi 的 Streamer 在处理 Debezium CDC 时强依赖 Confluent Schema Registry,在摄取每一张表对应的 Topic 时都需要指定 Topic 的 Schema Url,为了避免大量的手动配置,HoodieMultiTableStreamer 再次使用了“约定大约配置”的处理方式,它通过hoodie.streamer.schemaprovider.registry.baseUrl 指定 url 的 base 部分,通过 hoodie.streamer.schemaprovider.registry.urlSuffix 指定 url 的后缀部分,中间部分是 Topic 的名称,由 Hudi 自动拼接,这样动态地获得了每张表对应 Topic 的 Schema Url。

4. 重点参数


我们上面提到的几个重点参数再集中梳理一下:

4.1 命令行中的重要参数


  • --base-path-prefix 指定摄取数据后 Hudi 数据集存放的 base 目录,数据集将按照:<base-path-prefix>/<database>/<table> 格式存放
  • --config-folderHoodieMultiTableStreamer 下专门用于指定存放所有表配置文件的路径,配置约定的文件命名 pattern:<database>_<table>_config.properties,Hudi 就能自动找到每张表的配置文件,那不必再通过 hoodie.streamer.ingestion.<database>.<table>.configFile 单独配置

4.2 配置文件中的重要参数


  • hoodie.streamer.ingestion.tablesToBeIngested:需要被实时摄取并同步的表,单表使用 <database>.<table> 形式,多表用逗号分隔,例如:db1.table1,db1.table2

  • hoodie.streamer.ingestion.<database>.<table>.configFile:每张表需要提供的 Hudi 配置文件的存放路径。由于数据表可能非常多,逐一配置所有的表非常繁琐,因此 Hudi Streamer 提供一种文件命名模式:<database>_<table>_config.properties,只要我们将对应表的配置文件以此模式命名并放置于 --config-folder 配置的文件夹下,Hudi 就能自动映射为对应表的配置,不必再显式地配置这一项!

  • hoodie.streamer.schemaprovider.registry.url 是给单表(HoodieStreamer)用的

  • hoodie.streamer.schemaprovider.registry.baseUrl + hoodie.streamer.schemaprovider.registry.urlSuffix 联合起来给多表 用的!!

5. 完整示例


最后,我们引用《CDC 数据入湖方案:Kafka Connect > Kafka + Schema Registry > Hudi ( HoodieMultiTableStreamer ) 》一文第 6 节给出一个完整示例作为一个参考:

tee global-config.properties << EOF
# deltastreamer props
hoodie.deltastreamer.schemaprovider.registry.schemaconverter=org.apache.hudi.utilities.schema.converter.JsonToAvroSchemaConverter
hoodie.deltastreamer.ingestion.tablesToBeIngested=inventory.orders
hoodie.deltastreamer.schemaprovider.class=org.apache.hudi.utilities.schema.SchemaRegistryProvider
hoodie.deltastreamer.schemaprovider.registry.baseUrl=${SCHEMA_REGISTRY_URL}/subjects/
hoodie.deltastreamer.schemaprovider.registry.urlSuffix=-value/versions/latest
hoodie.deltastreamer.source.kafka.value.deserializer.class=io.confluent.kafka.serializers.KafkaAvroDeserializer
# kafka props
bootstrap.servers=$KAFKA_BOOTSTRAP_SERVERS
auto.offset.reset=earliest
# schema registry props
schema.registry.url=http://10.0.13.30:8085
EOF

tee inventory_orders_config.properties << EOF
include=global-config.properties
hoodie.deltastreamer.source.kafka.topic=osci.mysql-server-3.inventory.orders
hoodie.datasource.write.recordkey.field=order_number
hoodie.datasource.write.partitionpath.field=order_date
hoodie.datasource.hive_sync.partition_extractor_class=org.apache.hudi.hive.MultiPartKeysValueExtractor
hoodie.datasource.write.hive_style_partitioning=true
hoodie.datasource.hive_sync.database=inventory
hoodie.datasource.hive_sync.table=orders
hoodie.datasource.hive_sync.partition_fields=order_date
EOF

aws s3 rm --recursive $APP_S3_HOME/inventory_orders

spark-submit \
    --master yarn \
    --deploy-mode client \
    --jars /usr/lib/spark/connector/lib/spark-avro.jar \
    --class org.apache.hudi.utilities.deltastreamer.HoodieMultiTableDeltaStreamer \
    /usr/lib/hudi/hudi-utilities-bundle.jar \
    --props file://$HOME/global-config.properties \
    --table-type COPY_ON_WRITE \
    --op UPSERT \
    --config-folder file://$HOME \
    --base-path-prefix $APP_S3_HOME \
    --target-table inventory.orders \
    --continuous \
    --min-sync-interval-seconds 60 \
    --source-class org.apache.hudi.utilities.sources.debezium.MysqlDebeziumSource \
    --payload-class org.apache.hudi.common.model.debezium.MySqlDebeziumAvroPayload \
    --schemaprovider-class org.apache.hudi.utilities.schema.SchemaRegistryProvider

关联阅读

  • 《CDC 数据入湖方案:Kafka Connect > Kafka + Schema Registry > Hudi ( HoodieMultiTableStreamer ) 》

  • 《CDC 数据入湖方案:Flink CDC > Kafka + Schema Registry > Hudi ( HoodieMultiTableStreamer ) 》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1697598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot和Mybatis实现的留言板案例

目录 一、需求及界面展示 二、准备工作 引入依赖 .yml文件相关配置 数据库数据准备 三、编写后端代码 需求分析 代码结构 Model Mapper Service Controller 前端代码 四、测试 一、需求及界面展示 需求&#xff1a; 1. 输入留言信息&#xff0c;点击提交&…

2024-6-遥远的救世主

2024-6-遥远的救世主 2024-4-18 豆豆 fatux&#xff1a; 2021.5.26 看完电视剧《天道》之后购买本书&#xff0c;断断续续一直没有读完。 非常好奇&#xff0c;一个什么样的作者能写出如此奇书。老丁&#xff0c;一个智者&#xff0c;智者是多么孤独&#xff0c;因为找不到同…

AtCoder Regular Contest 178 A~D

A.Good Permutation 2&#xff08;贪心&#xff09; 题意&#xff1a; 给你一个正整数 N N N和一个由 M M M个正整数 A ( A 1 , A 2 , … , A M ) A(A_{1},A_{2}, \dots,A_{M}) A(A1​,A2​,…,AM​)组成的序列。 在这里&#xff0c; A A A的所有元素都是介于 1 1 1和 N N …

nss做题

[NCTF 2018]签到题 1.f12在index.php中找到flag [NSSCTF 2022 Spring Recruit]ezgame 1.在js源码中就有flag [UUCTF 2022 新生赛]websign 1.打开环境后发现ctrlu和右键&#xff0c;f12都被禁用了。两种方法&#xff0c;第一种&#xff1a;禁用js&#xff1b;第二中提前打开…

数据结构(五)树与二叉树

2024年5月26日一稿(王道P142) 基本概念 术语 性质 二叉树 5.2.2 二叉树存储结构

vue3中基于element-plus封装一个表格弹框组件,要求可以单选和多选table数据

单选&#xff1a; <template><SelectMaterialref"selectMaterialRef"check"checkbox"select"selectMaterial"></SelectMaterial><el-button type"primary" size"small" icon"el-icon-plus"…

【STM32】新建工程(江科大)

文章目录 STM32的开发方式库函数文件夹一、新建一个基于标准库的工程1.建立一个存放工程的文件夹2.打开Keil5 二、通过配置寄存器来完成点灯1.配置RCC寄存器2.配置PC13口&#xff08;1&#xff09;配置PC13口的模式&#xff08;2&#xff09;给PC13口输出数据 三、为寄存器添加…

与MySQL的初相遇

&#x1f30e;初识MySQL 注&#xff1a;本文SQL语句只为了验证猜想&#xff0c;不会也不要紧。 文章目录&#xff1a; MySql开端 认识数据库       什么是数据库       主流数据库       MySQL的本质 MySQL基础使用       连接mysql服务器     …

【Linux初探】:解锁开源世界的神秘钥匙

文章目录 &#x1f680;一、了解Linux&#x1f525;二、Linux 的发行版❤️三、Linux应用领域&#x1f4a5;四、Linux vs Windows & mac &#x1f680;一、了解Linux Linux是一种自由、开放源代码的操作系统&#xff0c;它的内核由芬兰计算机科学家Linus Torvalds在1991年创…

图片AI高效生成惊艳之作,一键解锁无限创意,轻松打造概念艺术新纪元!

在数字化时代&#xff0c;图片已经成为我们表达创意、传递信息的重要载体。然而&#xff0c;传统的图片生成方式往往耗时耗力&#xff0c;无法满足我们对于高效、创意的需求。幸运的是&#xff0c;现在有了图片AI&#xff0c;它以其高效、智能的特点&#xff0c;为我们带来了全…

数组-最接近给出数字的三数之和

题目描述 解题思路 这里使用三层for循环&#xff0c;暴力解法穷举所有三个数和的可能性&#xff0c;注意三层循环里的索引不要重复。 代码实现 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返…

C语言——小知识和小细节19

一、奇数位与偶数位互换 1、题目介绍 实现一个宏&#xff0c;将一个整数的二进制补码的奇数位与偶数位互换。输出格式依旧是十进制整数。示例&#xff1a; 2、分析 既然想要交换奇数位和偶数位上的数字&#xff0c;那么我们就要先得到奇数位和偶数位上的数字&#xff0c;那么…

THREE.JS中的向量点乘,以及他的几何意义。

1. THREE.JS中的向量点乘&#xff0c;以及他的几何意义 向量点乘的公式 : 2. 在three.js 中计算向量点乘 const a new THREE.Vector3(10, 10, 0); const b new THREE.Vector3(20, 0, 0); const dot a.dot(b);从这里可以看出&#xff0c;向量的点乘的结果是一个数字(标量…

嵌入式进阶——LED呼吸灯(PWM)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 PWM基础概念STC8H芯片PWMA应用PWM配置详解占空比 PWM基础概念 PWM全称是脉宽调制&#xff08;Pulse Width Modulation&#xff09…

安卓手机电脑平板均支持

最近随着人工智能的火热&#xff0c;越来越多人问我怎么设置&#xff0c;我这边主要提供简单的配置&#xff0c;能够实现想要的功能&#xff0c;不懂得的友友们可以私聊我&#xff0c;

一文读懂Apollo客户端配置加载流程

本文基于 apollo-client 2.1.0 版本源码进行分析 Apollo 是携程开源的配置中心&#xff0c;能够集中化管理应用不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端&#xff0c;并且具备规范的权限、流程治理等特性。 Apollo支持4个维度管理Key-Value格式的配…

MyBatis详细教程!!(入门版)

目录 什么是MyBatis&#xff1f; MyBatis入门 1&#xff09;创建工程 2&#xff09;数据准备 3&#xff09;配置数据库连接字符串 4&#xff09;写持久层代码 5&#xff09;生成测试类 MyBatis打印日志 传递参数 MyBatis的增、删、改 增&#xff08;Insert&#xff0…

OpenAI策略:指令层级系统让大模型免于恶意攻击

现代的大模型&#xff08;LLMs&#xff09;不再仅仅是简单的自动完成系统&#xff0c;它们有潜力赋能各种代理应用&#xff0c;如网页代理、电子邮件秘书、虚拟助手等。然而&#xff0c;这些应用广泛部署的一个主要风险是敌手可能诱使模型执行不安全或灾难性的行动&#xff0c;…

别人不愿意教,那我来教你Simulink建模(二)【语法知识】【原创分享】

文章目录 前言节点和状态的区别?local 和非 local 的区别?事件的作用?Bus 总线?Memory 模块?caller用法?自己瞎练习的(我也不知道为啥会多出来.h文件)自己瞎练习的(这个没有多出来.h文件)autosar实例学习前言 继续更新去年的博文系列,请君切记,师父领进门修行在个…

ant design pro 6.0列表渲实践demo

ant design pro 用户列表渲实践 用户页面&#xff1a; src\pages\Admin\User\index.tsx import { PlusOutlined } from ant-design/icons; import type { ActionType, ProColumns, ProDescriptionsItemProps } from ant-design/pro-components; import {PageContainer,ProDe…