Flink Catalog 解读与同步 Hudi 表元数据的最佳实践

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

在当前的大数据格局中,Spark / Hive / Flink 是最为主流的 ETL 或 Streaming 引擎,元数据方面,Hive Metastore 可以视为事实上的 Data Catalog 标准,而在数据湖存储格式上,又有 Hudi、Iceberg 这类新晋的框架,在这种复杂的格局下,用户希望能它们之间能相互打通,以便能根据应用场景灵活地选择技术栈,同时又不会出现技术上的“隔离”,一个非常典型的例子是:当我们选择了 Hudi 作为数据湖的统一存储格式后,我们希望不管是 Flink 还是 Spark (也包括 Hive)都能顺利读写 Hudi 表,这也暗含着“元数据最好统一存储在 Hive Metastore 中”这样的诉求,这非常普遍且典型的一种用户诉求,而我们这篇文章其实就是针对这个诉求给出解决方案。

1. Flink Catalog 的整体设计和各类具体实现


首先,我们要清楚地明白一点:Flink 是有自己的、完全独立的 Catalog 定义(接口)的,就像 Hive 设计并使用了自己的 Hive MetaStore 一样。Flink 在自已统一的 Catalog 定义(接口)下,提供了多种不同的实现,其实本质的差别主要是存储介质上的差异:

① 默认 Catalog(GenericInMemoryCatalog),基于内存,Session 结束时,metadata 也会随之丢失,下次再使用需要重新建库、建表

② 将元数据持久化到数据库中的 Catalog (JdbcCatalog),这就有点像 Hive Metastore 的实现方式了,但是要注意,只是性质上类似,metadata 的 schema 肯定是不一样的

③ 将元数据持久化到 Hive Metastore 中的 Catalog (HiveCatalog),这种方式要注意理解,它是把 Hive Metastore 当成了底层存储,通过调用 Hive Metastore 的 API 来读写 Flink 的 metadata,同时,使用这种方式还能读写 Hive 中已有的 Hive 表,某种角度上看,有点类似在 Flink Catalog 和 Hive Metastore 之间做了“适配”。鉴于 Hive Metestore 在大数据生态中的核心位置,将 Flink 的元数据统一到 Hive 的 Metastore 上也是一种必然地选择,不过,Flink Catalog 数据结构毕竟与 Hive 的 Catalog 结构有所不同,所以将大量 Flink 的 metadata 写入 Hive 会导致所谓的 “Hive 元数据污染” 问题(参考:《Flink 实时计算平台在知乎的演进》)

④ 用户自定义 Catalog,既然 Flink 的 Catalog 基于接口设计的,那么用户自然可以开发自己的 Catalog 实现。对于那些拥有内置元数据服务的数据湖框架,例如 Hudi 和 Iceberg,这是绝佳的元数据切入方式,通过这种形式,它们会开发自己的 Flink Catalog 实现,目的就在于为了和 Flink Catalog 机制无缝打通,让 Flink 能很好的读写这些格式内置的元数据,实际上,它们也确实这样做了

下图从本质上(类的继承关系)揭示了 Flink Catalog 的设计框架和各个实现之间的关系:

2985d7fdf562b086ff1fa19535a1279

同样的,下图从更大的一个上下文中展示了 Flink 表种 Catalog 具体实现的工作场景:

ed71d75153bb0dfa84342b0ffe38f6a3

2. Flink 读写 Hudi 表并同步至 Hive Metastore 的方法

存放 Hudi 的元数据有多种途径,本着不再发明轮子的态度,这两篇文章《Flink SQL操作Hudi并同步Hive使用总结》和 《Flink SQL通过Hudi HMS Catalog读写Hudi并同步Hive表》已经总结的非常全面和细致了,总结一下一共有以下几种途径:

① 在 Flink 的默认 Catalog 中创建 Hudi 表,不同步表格元数据到 Hive Metastore (不配置 hudi 表的 hive_sync.* 属性)

这一方案 Spark 和 Hive 都读取不到这张 Hudi 表,且 Flink 自己在 Session 关闭后也需要重新建表,所以,这一方案并没有实用价值。

② 在 Flink 的 Hive Catalog 中创建 Hudi 表,不同步表格元数据到 Hive Metastore (不配置 hudi 表的 hive_sync.* 属性)

这一方案是在 Flink SQL 中连通 Hive Metastore(即使用 HiveCatalog),直接在 Hive Metastore 中创建 Hudi 表,这样,原则上,Spark / Hive 都能发现这张 Hudi 表,并对其进行读写。但实际上,使用在这种模式下,Spark / Hive 是不能正常读写 Hudi 表的,因为该方法创建的 Hudi 表写入了大量的 Flink 特有的 metadata,同时又缺少了 Hive / Spark 必要的 Hudi 表的属性,所以 Spark / Hive 不能读写这种方式创建的 Hudi 表。简单地说,在这种方式下,Flink 只是将 Hive Metastore 当做一种底层的元数据存储服务,所以写入的元数据都是 Flink Catalog 风格的,并不会考虑任何与 Hive / Spark 元数据兼容的问题,所以 Spark / Hive 读不出这种方式创建的 Hudi 表就不难理解了。

③ 在 Flink 的默认 Catalog 中创建 Hudi 表,并同步表格元数据到 Hive Metastore (配置 hudi 表的 hive_sync.* 属性)

这一方案在 Flink 中创建的 Hudi 表的元数据能自动同步到 Hive Metastore,这样,Spark / Hive 就可以读写这张表了,但是,唯一不足的地方是:对于 Flink 这一端,具体说就是 Flink SQL Client,当 Session 关闭再重新打开后,Flink 的 Catalog 里原来的 Hudi 表就消失了,虽然可以通过注册 Hive Catalog 读到上次创建的 Hudi 表,但是,先后两次操作,SQL 会不一样,所以还是有一些瑕疵。说到底,这种方式是在混用 Flink Catalog 和 Hive Metastore。

④ 在 Flink 的 Hive Catalog 中创建 Hudi 表,并同步表格元数据到 Hive Metastore (配置 hudi 表的 hive_sync.* 属性)

这一方案和方案 2 很接近,通过主动同步 Hudi 元数据到 Hive Metastore 解决了 Hive / Spark 无法读写 Hudi 表的问题。不过,这一方案将势必在 Hive Metastore 中创建出至少两张以上的表(对于 MOR 表是 3 张),一张是 Flink 原生的 Hudi 表,另一张是通过 Hive Sync 同步出来的表,虽然两张表的数据是一份,但是元数据上确实是两张不同的表,且使用 Flink 时,只能读写 Flink 注册的表,使用 Hive / Spark 时,只能使用 Hive Sync 出来的表,虽然可以 work,但显然还是一种很别扭的方案

⑤ 使用 Hudi HMS Catalog ( HoodieHiveCatalog )

上述四种方案都有一定的局限性,为此,Flink / Hudi 社区专门针对 Hudi 的 metadata 开发了一个单独的 Flink Catalog 实现:HoodieHiveCatalog,这一方案从最底层上解决了元数据适配和共享的问题。接下来我们会详细介绍这种实现。

3. 最佳解决方案


在“Flink 读写 Hudi 表并同步至 Hive Metastore” 这件事情上,作为需求,最好的解决方案应该:在 Flink 中创建的 Hudi 表能自动被 Hive / Spark 发现和读写,鉴于 Hive Metastore 在大数据生态中的地位,元数据应该存储于 Hive Metastore 中,但不需要显式配置 Hive Sync,也不应存储两份以上的元数据,Flink / Hive / Spark 有统一的元数据视图,均可共同读写同一张 Hudi 表,而这就是 HoodieHiveCatalog 所要完成的任务。

从设计模式的角度看,本质上,HoodieHiveCatalog 是一个 “适配器”,它将 Flink Catalog 的元数据格式和 Hudi 的元数据格式以及 Hive Metastore 的格式做了完备的适配,这才得以实现三者的无缝集成!使得 Hudi 表元数据在 Flink / Hive / Spark 上做到的真正意义上的统一。下图非常细致地描绘了 HoodieHiveCatalog 的工作方式(Glue Data Catalog 部分不影响解读,可忽略):

flink-hudi-metadata

方案 5 自始至终只使用 Hive Metastore 一种存储介质,并面向 Hudi Metadata 的存储在 Flink Catalog 和 Hive Catalog 进行了适配,只存储一份元数据,而其他方案都是同时使用两套 Catalog,并通过 Hive Sync 尽量弥合两套 Catalog 之间的差异,总会遇到这样那样的不一致问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言的小角落】逻辑与逻辑或混合计算

关注小庄 顿顿解馋(≧◡≦) 引言:本篇博客小庄带领小伙伴们解决一个比较角落有时头疼的问题—关于逻辑与和逻辑或结合运算的问题,请放心食用~ 我们先放代码说话 int main() {int x 1;int y 3;int z 4;if(x1 || y && z){;} printf("y …

自动驾驶中之定位总结

1 前言2 典型的单个定位方式2.1 基于通信的定位方法2.1.1 GNSS 全球卫星导航系统2.1.1.1 gnss的优点与缺点2.1.1.2 gnss定位技术2.1.1.2.1 RTK定位技术2.1.1.2.2 PPP定位技术 2.1.1.2 gnss定位技术总结 2.1.2 车联网定位 2.1 基于航位推算的定位方法2.1.1 惯性测试单元定位IMU2…

unity 使用VS Code 开发,VS Code配置注意事项

vscode 对应的插件(unity开发) 插件:.Net Install Tool,c#,c# Dev Kit,IntelliCode For C# Dev Kit,Unity,Unity Code Snippets 本人现在是用了这些插件 unity需要安装Visual Studio Editor 1、.Net Install Tool 设置 需要在设置里面配置…

美容小程序:让预约更简单,服务更贴心

在当今繁忙的生活节奏中,美容预约常常令人感到繁琐和疲惫。为了解决这个问题,许多美容院和SPA中心已经开始采用美容小程序来简化预约流程,并提供更加贴心的服务。在这篇文章中,我们将引导您了解如何制作一个美容小程序&#xff0c…

网络安全--网鼎杯2018漏洞复现(二次注入)

一、环境:在线测试平台 BUUCTF在线评测 (buuoj.cn) 二、进入界面先尝试万能账号 1or11# 换格式 hais1bux1 11or11# 三、万能的不行那我们就得想注册了,去register.php去看看 注册个账号 发现用户名回显,猜测考点为用户名处二次注入&…

Stable Diffusion WebUI 界面介绍

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 大家好,我是水滴~~ 本文主要对 Stable Diffusion WebUI 的界面进行简单的介绍,让你对该 WebUI 有个大致的了解,为后面的深入学习打下一个基础。主要内容包…

算法沉淀——BFS 解决拓扑排序(leetcode真题剖析)

算法沉淀——BFS 解决拓扑排序 01.课程表02.课程表 II03.火星词典 Breadth-First Search (BFS) 在拓扑排序中的应用主要是用来解决有向无环图(DAG)的拓扑排序问题。拓扑排序是对有向图中所有节点的一种线性排序,使得对于每一条有向边 (u, v)&…

网络防火墙综合实验

备注:电信网段15.1.1.0 移动网段14.1.1.0 办公区 11.1.1.0 生产区 10.1.1.0 服务区 13.1.1.0 公网 1.1.1.1 和 2.2.2.2 需求: 1、办公区设备可以通过电信链路和移动链路上网(多对多nat,并且需要保留一个公网ip) 2、…

第二证券:资金持续入场掘金成长板块

上证指数重回2900点、ETF成交活跃、科技股强势反弹……龙年首个交易日,在心情回暖、资金涌入的背景下,A股迎来开门红,组织也摩拳擦掌进行布局。 从仓位状况来看,私募排排网数据显现,到2月2日,私募全体仓位…

CPU设计之分支预测

1、引言 在之前的学习过程中,我们一直在假设程序是顺序执行的。PC每一次都默认4,一直这样周而复始。然而CPU就和人生一样,不可能一直一帆风顺的向前走。在某些场合我们总是需要做出决策,这些决策点,就像高速公路的一个…

litemall系统默认弱口令漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

Emlog博客网站快速搭建并结合内网穿透实现远程访问本地站点

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总结 前言 博客作为使…

VMware还原Windows11 ghost镜像

文章目录 环境步骤准备制作启动iso文件创建虚拟机启动虚拟机还原Windows 参考 环境 Windows 11 家庭中文版VMware Workstation 17 Pro石大师装机大师Windows 11 ghost系统镜像 步骤 准备 下载好Windows 11 ghost系统镜像,我下载的文件是 FQ_WIN11_X64_VDL_V2080…

list链表

1. list基本概念 功能:将数据进行链式存储 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成:链表由一系列结点组成 结点的组成:一个是存储数据…

Go 是否有三元运算符?Rust 和 Python 是怎么做的?

嗨,大家好!本文是系列文章 Go 技巧第十四篇,系列文章查看:Go 语言技巧。 今天来聊聊在 Go 语言中是否支持三元运算符。这个问题很简单,没有。 首先,什么是三元运算符? 在其他一些编程语言中&a…

深入理解flinksql执行流程,calcite与catalog相关概念,扩展解析器实现语法的扩展

深入理解Flink Sql执行流程 1 Flink SQL 解析引擎1.1SQL解析器1.2Calcite处理流程1.2.1 SQL 解析阶段(SQL–>SqlNode)1.2.2 SqlNode 验证(SqlNode–>SqlNode)1.2.3 语义分析(SqlNode–>RelNode/RexNode&#…

代码随想录算法训练营DAY20 | 二叉树(7) (续)

一、LeetCode 236 二叉树的最近公共祖先 题目链接:236.二叉树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/ 思路:利用后序遍历是天然回溯过程、方便实现自底向上查找的原理,递归寻找公…

面试系列之《Spark》(持续更新...)

1.job&stage&task如何划分? job:应用程序中每遇到一个action算子就会划分为一个job。 stage:一个job任务中从后往前划分,分区间每产生了shuffle也就是宽依赖则划分为一个stage,stage这体现了spark的pipeline思…

普中51单片机学习(十四)

中断系统 中断的概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务),待CPU将事件B处理完毕后,再回到原来事件…

js_三种方法实现深拷贝

深拷贝( 递归 ) 适用于需要完全独立于原始对象的场景,特别是当对象内部有引用类型时,为了避免修改拷贝后的对象影响到原始对象,就需要使用深拷贝。 // 原始对象 const obj { uname: Lily,age: 19,hobby: [乒乓球, 篮球…