统一的Catalog API(FLink FLIP-30翻译)
文章目录
- 统一的Catalog API(FLink FLIP-30翻译)
- 一、动机
- 二、公共接口
- 三、实现方案(提议)
- 四、ReadableCatalog接口
- 五、CatalogDatabase类
- 六、ObjectPath 类
- 七、CatalogCommonTable & CatalogTable接口
- 八、HiveTable类
- 九、GenericCatalogTable 类
- 十、CatalogView接口
- 十一、CatalogFunction类/接口
- 十二、ReadableWritableCatalog接口
- 十三、HiveCatalogBase类
- 十四、HiveCatalog类
- 十五、GenericHiveMetastoreCatalog类
- 十六、CatalogManager 类
- 十七、TableEnvironment 类
- 十八、目录的YAML配置
- 十九、TableFactory 接口
- 二十、HiveTableFactory 类
- 二十一、自动加载Table Factory
- 二十二、补充说明
- 二十三、实施计划
- 二十四、兼容性,弃用和迁移计划
- 二十五、测试计划
一、动机
随着FLink在流处理中的广泛采用,Flink也显示了其在批处理中的潜力。改进Flink的批处理,尤其是在SQL方面的能力,将使Flink在流处理之外得到更多的应用,并为用户提供流和批处理需求的全套解决方案。
另一方面,Hive已将其重点放在大数据技术及其完整的生态系统上。对于大多数大数据用户而言,Hive不仅是大数据分析和ETL领域SQL引擎,还是一个数据管理平台,可以在Hive平台上,发现,定义和演化数据。也就是说,Hive是Hadoop上大数据事实上的标准。
因此,Flink与Hive生态系统集成势在必行,进一步,FLink可以获得更多的Hive批处理和SQL用户支持。为此,Flink需要与Hive元数据(metadata)和数据(data)集成。
FLink与Hive Metastore集成有两个方面:
1.Hive的meta-object(元数据对象:例如表和视图)可供Flink使用,并且Flink也能够在Hive中创建此类meta-object(元数据对象)
2.使用Hive Metastore作为持久化存储,使Flink的meta-object(元数据对象:表,视图和UDF)持久化。
本文档是Flink和Hive生态系统集成的三个部分之一。不仅涉到FLink与Hive集成,还涉及到重构catalog interface接口,以及TableEnvironment内部catalog及外部catalog规整,长远目标是能够在catalog中,存储批处理和流处理connector连接器信息(不仅仅是Hive,还包括是Kafka, Elasticsearch等连接器)。
二、公共接口
在下一节中可以看到,本文档主要介绍了一组与catalog相关的API,以替换现有的,不完整的和未使用的API。更具体地说,我们提出了一系列接口,用于管理和统一catalog内部的表,视图,函数等,这些接口在要么在外部系统(例如Hive),或者在内部系统(例如Flink内部SQL Client定义YAML文件)。我们还为catalog通常依赖的meta-object(元数据对象)定义了接口,例如表,视图和函数(UDF)。由于Flink允许多个catalog共存于一个用户会话中,因此需要一个管理类CatalogManager,让用户代码更为简洁和方便。简而言之,这些接口主要与SQL和Table API有关。
Catalog可以在客户端程序(例如SQL Client)中配置。因此,我们还支持YAML方式配置Catalog。
三、实现方案(提议)
在当前的Flink代码库中,已经为外部catalog定义了一组接口。但是,这些API尚不稳定,需要适应我们后续的工作计划。
实现方案的层次结构如下:
在图1中,ReadableCatalog、ReadableWritableCatalog和CatalogManager是我们定义的主要接口。其他的只是实现类或接口调用者。
四、ReadableCatalog接口
这个类来自重命名现有的ExternalCatalog 类。删除“External”(外部)关键字的原因是内部和外部之间没有明确的区别,因为外部catalog也可以用于存储Flink的元对象。
我们需要调整现有的API,以容纳其他meta-objects(元数据对象),例如Flink中存在的表和视图,它们在典型的数据库catalog中也很常见。我们还恢复了schema/database概念,而不是非标准的子目录(sub-catalog)术语。
/**
* All methods in this class can throw a `CatalogException` if the communication
* fails or the API is not used as intended.
*/
public interface ReadableCatalog {
/**
* Open and close methods for establishing or tearing down connections
* to external systems.
*/
void open();
void close();
/**
* Get a table factory instance that can convert catalog tables of this catalog
* to sources or sinks. This allows a catalog to provide connectors directly without
* going through a discovery mechanism. If a table factory isn’t provided, the
* current discovery mechanism will be used with Java Service Providers.
*/
Optional<TableFactory> getTableFactory();
/**
* List and get instances of databases.
*/
List<String> listDatabases();
/**
* Return information about the database (description, last modified date, etc.).
* Throw a `DatabaseNotFound` exception if database isn’t found.
*/
CatalogDatabase getDatabase(String databaseName);
/**
* List table names under the given database. Throw a `DatabaseNotFound` exception
* if database isn’t found.
*/
List<String> listTables(String databaseName);
/**
* List view names under the given database. Throw a `DatabaseNotFound` exception
* if database isn’t found.
*/
List<String> listViews(String databaseName);
/**
* Returns both physical or virtual tables (aka tables or views).
*/
CatalogCommonTable getTable(ObjectPath tableOrViewName);
/**
* List function names under the given database. Throw a `DatabaseNotFound` exception if
* database isn’t found.
*/
List<String> listFunctions(String databaseName);
/**
* Returns a function definition.
*/
CatalogFunction getFunction(ObjectPath functionName);
}
变更包括:
1、添加open()和close()。它们被添加到ReadableCatalog 接口,以兼容外部连接(external connections)。他们可能需要一些运行时上下文,但是我们暂时不做介绍。
2、添加了view/ UDF相关的读取接口
3、定义了表(table)和视图(view)