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

《大数据平台架构与原型实现:数据中台建设实战》博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名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
EOFtee 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
EOFaws s3 rm --recursive $APP_S3_HOME/inventory_ordersspark-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.mzph.cn/web/16059.shtml

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

相关文章

vue3添加收藏网站页面

结构与样式 <template><div class"web_view"><ul><li v-for"web in webList" :key"web.title"><a :href"web.src" :title"web.title" target"_blank"><img :src"web.img&…

微信小程序基础 -- 小程序UI组件(5)

小程序UI组件 1.小程序UI组件概述 开发文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/view/component.html 什么是组件&#xff1a; 组件是视图层的基本组成单元。 组件自带一些功能与微信风格一致的样式。 一个组件通常包括 开始标签 和 结…

Cyber Weekly #8

赛博新闻 1、微软召开年度发布会Microsoft Build 2024 本周&#xff08;5.22&#xff09;微软召开了年度发布会&#xff0c;Microsoft Build 2024&#xff0c;发布了包括大杀器 Copilot Studio 在内的 50 项更新。主要包括&#xff1a; 硬件层面&#xff1a;与英伟达 & A…

3D牙科网格分割使用基于语义的特征学习与图变换器

文章目录 3D Dental Mesh Segmentation Using Semantics-Based Feature Learning with Graph-Transformer摘要方法实验结果 3D Dental Mesh Segmentation Using Semantics-Based Feature Learning with Graph-Transformer 摘要 本文提出了一种新颖的基于语义的牙科网格分割方…

民国漫画杂志《时代漫画》第16期.PDF

时代漫画16.PDF: https://url03.ctfile.com/f/1779803-1248612470-6a05f0?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

【C++】二分查找:在排序数组中查找元素的第一个和最后一个位置

1.题目 难点&#xff1a;要求时间复杂度度为O(logn)。 2.算法思路 需要找到左边界和右边界就可以解决问题。 题目中的数组具有“二段性”&#xff0c;所以可以通过二分查找的思想进行解题。 代码&#xff1a; class Solution { public:vector<int> searchRange(vect…

Camunda BPM主要组件

Camunda BPM是使用java开发的,核心流程引擎运行在JVM里,纯java库,不依赖其他库或者底层操作系统。可以完美地与其他java框架融合,比如Spring。除了核心流程引擎外,还提供了一系列的管理,操作和监控工具。 1,工作流引擎 既适用于服务或者微服务编排,也适用于人工任务管…

Leetcode42题:接雨水

1.题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,…

【C语言】二叉树的实现

文章目录 前言⭐一、二叉树的定义&#x1f6b2;二、创建二叉树&#x1f3a1;三、二叉树的销毁&#x1f389;四、遍历二叉树1. 前序遍历2. 中序遍历3. 后序遍历4. 层序遍历 &#x1f332;五、二叉树的计算1. 计算二叉树结点个数2. 计算二叉树叶子结点的个数3. 计算二叉树的深度4…

一、Elasticsearch介绍与部署

目录 一、什么是Elasticsearch 二、安装Elasticsearch 三、配置es 四、启动es 1、下载安装elasticsearch的插件head 2、在浏览器&#xff0c;加载扩展程序 3、运行扩展程序 4、输入es地址就可以了 五、Elasticsearch 创建、查看、删除索引、创建、查看、修改、删除文档…

【MySQL】——并发控制

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

计算机毕业设计 | springboot+vue房屋租赁管理系统(附源码)

1&#xff0c;绪论 1.1 课题来源 随着社会的不断发展以及大家生活水平的提高&#xff0c;越来越多的年轻人选择在大城市发展。在大城市发展就意味着要在外面有一处安身的地方。在租房的过程中&#xff0c;大家也面临着各种各样的问题&#xff0c;比如需要费时费力去现场看房&…

Aws EC2 + Aws Cli + Terraform

1 什么是 Terraform&#xff1f; Terraform 是由 HashiCorp 创建的“基础架构即代码”(Infrastructure-as-Code&#xff0c;IaC)开源工具。Terraform 的配置语言是 HashiCorp Configuration Language&#xff08;HCL&#xff09;&#xff0c;用来替代更加冗长的 JSON 和 XML 等…

SpringBoot注解--09--idea创建spring boot项目,java版本只能选择17和21

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 idea创建spring boot项目1.问题描述2.原因3.解决方法方案一&#xff1a;升级JDK版本至17或更高方案二&#xff1a;替换Spring初始化的源https://start.aliyun.com i…

实时计算及异构计算随笔笔记

3、异构计算的典型应用 异构计算并不神秘&#xff0c;目前已渗透各个领域&#xff0c;不仅是PC领域&#xff0c;也包括了手持移动设备领域、行业领域&#xff0c;甚至是云计算、分布式计算领域。事实上&#xff0c;异构计算至少在应用端&#xff08;前台&#xff09;并不像它的…

ES的安装以及配置+ik分词

环境&#xff1a;windows10、ES&#xff08;8.13.3&#xff09;、Kibana&#xff08;8.13.3&#xff09;、Logstash&#xff08;8.13.3&#xff09;、ik&#xff08;8.13.3&#xff09; 1.下载安装ES Download Elasticsearch | ElasticDownload Elasticsearch or the complet…

AI预测体彩排3采取888=3策略+和值012路一缩定乾坤测试5月26日预测第2弹

今天继续基于8883的大底进行测试&#xff0c;昨天的预测已成功命中&#xff01;今天继续测试&#xff0c;按照排三前面的规律&#xff0c;感觉要出对子了&#xff0c;所以本次预测不再杀对子&#xff0c;将采用杀一个和尾来代替。好了&#xff0c;直接上结果吧~ 首先&#xff0…

mongoengine,一个非常实用的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - mongoengine。 Github地址&#xff1a;https://github.com/MongoEngine/mongoengine 在现代应用程序开发中&#xff0c;NoSQL数据库因其灵活性和高性能而广受欢迎。MongoD…

软件需求规范说明模板

每个软件开发组织都会为自己的项目选用一个或多个标准的软件需求规范说明模板。有许多软件需求规范说明模板可以使用(例如ISO/IEC/IEEE2011;Robertson and Robertson2013)。如果你的组织要处理各种类型或规模的项目&#xff0c;例如新的大型系统开发或是对现有系统进行微调&…

concurrency 并行编程

Goroutine go语言的魅力所在&#xff0c;高并发。 线程是操作系统调度的一种执行路径&#xff0c;用于在处理器执行我们在函数中编写的代码。一个进程从一个线程开始&#xff0c;即主线程&#xff0c;当该线程终止时&#xff0c;进程终止。这是因为主线程是应用程序的原点。然后…