一、概述

数据处理最关键的方面之一是管理元数据。元数据可以是临时的,如临时表、或者通过 TableEnvironment 注册的 UDF。元数据也可以是持久化的,例如 HiveMetastore 中的元数据。
Catalog 提供了一个统一的 API,用于管理元数据,如数据库、表、分区、视图以及数据库或其他外部系统中存储的函数和信息,并使其可以从 Table API 和 SQL 查询语句中来访问。

二、元数据 Catalog API 设计

Catalog 在 Flink 中提供了一个统一的 API,用于管理元数据,Catalog 提供了元数据信息,例如数据库、表、分区、视图以及数据库或其他外部系统中存储的函数和信息。

2.1. 元数据模型

Flink 的元数据模型定义了任务的元数据结构,如数据库、表、视图、函数等,Flink 定义了 4 类接口分别对应于 4 种元数据类型,元数据类型之间的层次关系如图,最顶层的 Catalog 是元数据的容器。

2.1.1. 数据库

数据库等同于数据库中的库实例,接口定义为 CatalogDatabase,定义数据库实例的元数据,一个数据库实例中包含表、视图、函数等多种对象

2.1.2. 表和视图

在 Catalog 中,每一张表对应的是一个 CatalogBaseTable 对象,CatalogBaseTable 及其子类的继承关系如下图:

截屏2023-06-07 21.48.35

Catalog 中管理的表大致可以分为两类,一类是表所对应的 CatalogTable,另一类则是视图所对应的 CatalogView。

2.1.3. 函数 CatalogFunction

Catalog 中的函数元数据的接口。函数元数据包含了函数所在的类信息和编程语言

2.2. 元数据管理

2.2.1. CatalogManager

Flink 通过定义类 CatalogManager 来组织当前系统中可用的 Catalog 和设置、查询当前 Catalog 等的信息。

2.2.2. 实现 AbstractCatalog

Catalog 用来管理的核心抽象,Catalog 接口中定义了一系列元数据管理的方法。目前 Flink 中实现了内存型 GenericInMemoryCatalog、HiveCatalog 和 AbstractJdbcCatalog。

  1. 内存型 GenericInMemoryCatalog

    内存型 Catalog 元数据在内存中临时保存,无持久化存储,在 SQL 校验和优化过程中使用。GenericlnMemoryCatalog ,把所有的元数据都保存在 Flink Client 端的内存里,元数据的生命周期跟 SQL Client 的 Session 周期一样,当 Session 结束,在 Session 里面创建的元数据也就自动的丢失了。

  2. Hive
    GenericlnMemoryCatalog 是临时,无持久化,其中的元数据无法在团队间共享。对接 Hive 的元数据,既可以与 Hadoop 生态直接打通,又能利用 Hive 存储元数据,一次创建多次使用。

  3. Jdbc

三、Flink Table/SQL 元数据设计

为了使用 SQL,首先需要解决的是元数据管理的问题。包括 Table/UDF/View 元数据的注册、查询以及验证。

四、自定义 Catalog

Flink Catalog 是扩展的,支持用户自定义。为了在 Flink SQL 中使用自定义 Catalog,用户需要通过实现 CatalogFactory 接口来实现对应的 Catalog 工厂。该工厂是使用 Java 的服务提供者接口 (SPI) 发现的。

可以将实现此接口的类添加到: META_INF/services/org.apache.flink.table.factories.FactoryJAR

  1. https://blog.csdn.net/qq_41463207/article/details/115677404
  2. https://mp.weixin.qq.com/s/LynPrZAjyMqGgeBkpUj17Q

五、总结

5.1. Refer