Flink 系列之三十四- Flink SQL - 重要概念:Module、状态管理、Catalog

之前做过数据平台,对于实时数据采集,使用了Flink。现在想想,在数据开发平台中,Flink的身影几乎无处不在,由于之前是边用边学,总体有点混乱,借此空隙,整理一下Flink的内容,算是一个知识积累,同时也分享给大家。

注意由于框架不同版本改造会有些使用的不同,因此本次系列中使用基本框架是 Flink-1.19.x,Flink支持多种语言,这里的所有代码都是使用java,JDK版本使用的是19
代码参考:https://github.com/forever1986/flink-study.git

这一章对一些Flink相关的概念进行讲解,这些概念在实际使用FlinkSQL中比较常用。

1 Module

Module:允许用户扩展 Flink 的内置对象,例如定义行为类似于 Flink 内置函数的函数。它们是可插拔的,虽然 Flink 提供了一些预构建的模块,但用户也可以编写自己的模块。

1.1 分类

目前Flink包括以下三种模块:

  • CoreModule :包含 Flink 所有系统(内置)函数,并默认加载启用。
  • HiveModule:为 SQL 和 Table API 用户提供了 Hive 内置函数作为 Flink 的系统函数。Flink 的 Hive 文档提供了有关设置该模块的完整详细信息《Hive 文档》。
  • User-Defined Module:用户可以通过实现Module的接口来开发自定义Module。若要在 SQL CLI 中使用自定义模块,用户则需要通过实现“ModuleFactory”接口来开发该模块及其对应的ModuleFactory。

1.2 调用顺序

在调用函数时,并未指定其模块名称,如果多个模块出现相同的函数名,则会以一下顺序进行查找调用:

  • 如果两个模块都处于启用状态,那么 Flink 将根据模块的解析顺序来解析该函数。
  • 如果其中一个模块被禁用,那么 Flink 将该函数解析到启用的模块。
  • 如果两个模块都处于禁用状态,那么 Flink 将无法解析该函数。

1.3 使用示例

1)下载依赖的jar包:每个版本可能不太一样,这个是1.19版本下的依赖

在这里插入图片描述

2)重启flink集群:由于Flink是冷加载模式,因此加入jar需要重启

./stop-cluster.sh
./start-cluster.sh

3)命令加载module

show full modules;
load module hive with('hive-version'='3.1.3');
show full modules;
show functions;

在这里插入图片描述

4)使用hive才有的split函数测试

SET sql-client.execution.result-mode=TABLEAU;
select split('Flink SQL',' ') as tmp;

在这里插入图片描述

5)卸载module

unload module hive;
show full modules;

在这里插入图片描述

2 状态管理

在前面的一些join操作中,可以发现有些join一直会等待对面流来数据进行匹配,这就意味着FlinkSQL是一个有状态的,这里可以想象,如果一直来数据,这意味着Flink可能会导致内存溢出。而在FlinkSQL中,可以设置这些“状态”数据的有效期,让其定期清理,这样就可以防止内存溢出,至于状态有效期的长短设置,则有业务性质决定。在FlinkSQL中,有3种方式设置状态有效期:

配置方式TableAPI/SQL 支持生效范围优先级
SET ‘table.exec.state.ttl’ = ‘…’TableAPI和SQL作业粒度,默认情况下所有状态算子都会使用该值控制状态生命周期,单位是ms默认配置,可被覆盖
SELECT /*+ STATE_TTL(…) */ …SQL有限算子粒度,当前支持连接和分组聚合算子该值将会优先作用于相应算子的状态生命周期。查阅状态生命周期提示获取更多信息。
修改序列化为 JSON 的 CompiledPlanTableAPI和SQL通用算子粒度, 可修改任一状态算子的生命周期table.exec.state.ttl 和 STATE_TTL 的值将会序列化到 CompiledPlan,如果作业使用 CompiledPlan 提交,则最终生效的生命周期由最后一次修改的状态元数据决定。

2.1 table.exec.state.ttl

table.exec.state.ttl :是一个作业级别的空闲状态维持时间参数,其指定了一个最小的时间间隔,用于表示闲置状态(即未更新的状态)将被保留的时长。只有在闲置时间少于该最小值时,状态才会被清除,并且会在闲置一段时间后进行清除。默认情况下,不会清理状态。注意:清理状态需要额外的记账开销。默认值为 0,这意味着永远不会清理状态。

示例说明:创建一个1秒生成id=1的cpu数据,然后使用sum函数统计cpu总数

1)创建log表,并使用sum函数查询

CREATE TABLE log(
	id INT,
	cpu DOUBLE,
	ts INT
) WITH (
  'connector' = 'datagen',
  'rows-per-second'='1',
  'fields.id.kind'='random',
  'fields.id.min'='1',
  'fields.id.max'='1',
  'fields.cpu.kind'='random',
  'fields.cpu.min'='1',
  'fields.cpu.max'='100',
  'fields.ts.kind'='sequence',
  'fields.ts.start'='1',
  'fields.ts.end'='100000'
);
SET sql-client.execution.result-mode=TABLEAU; 
select id,sum(cpu) from log group by id;

在这里插入图片描述

说明:可以看到cpu的值一直被更新,并且越来越大

2)设置table.exec.state.ttl为10ms

SET 'table.exec.state.ttl' = '10';
select id,sum(cpu) from log group by id;

在这里插入图片描述

说明:这里可以看到每次都是+I,这是因为过期时间是10ms,而数据1秒钟才生成一条,因此之前的数据10ms内没有被更新,则删除。因此每次来的数据都是+I。

2.2 STATE_TTL

上面是整个作业的空闲状态有效时间,当想在不同的算子之间设置不同的空闲状态有效时间,用户可以通过 STATE_TTL 来指定算子粒度的空闲状态维持时间,该方式能够使得在上述状态算子中使用与作业级别 table.exec.state.ttl 不同的值。

示例说明:将table.exec.state.ttl设置为0,表示无限保留,然后使用Hint方式设置STATE_TTL

SET 'table.exec.state.ttl' = '0';
select /*+ STATE_TTL('log'='10ms') */ id,sum(cpu) from log group by id;

在这里插入图片描述

说明:效果和设置 table.exec.state.ttl 一样,但是唯一不同的是只对这个select有效。

第三种方式通过,这个在这里就不演示,在《官方文档》中有相关方法,感兴趣的朋友自行查看学习。

3 Catalog

3.1 说明

在《系列之二十四 - Flink SQL - 基础操作》中提到,FlinkSQL在数据库之上,还有一层叫做Catalog 的目录。Catalog 提供了元数据信息,例如数据库、表、分区、视图以及数据库或其他外部系统中存储的函数和信息。
数据处理最关键的方面之一是管理元数据。 元数据可以是临时的,例如临时表、或者通过 TableEnvironment 注册的 UDF。 元数据也可以是持久化的,例如 Hive Metastore 中的元数据。Catalog 提供了一个统一的API,用于管理元数据,并使其可以从 Table API 和 SQL 查询语句中来访问。FlinkSQL提供了4种Catalog :

  • GenericInMemoryCatalog:是基于内存实现的 Catalog,所有元数据只在 session 的生命周期内可用。之前的例子中几乎都是使用这种Catalog
  • JdbcCatalog:使得用户可以将 Flink 通过 JDBC 协议连接到关系数据库。Postgres Catalog 和 MySQL Catalog 是目前 JDBC Catalog 仅有的两种实现。
  • HiveCatalog :有两个用途:作为原生 Flink 元数据的持久化存储,以及作为读写现有 Hive 元数据的接口。
  • 自定义 Catalog:Catalog 是可扩展的,用户可以通过实现 Catalog 接口来开发自定义 Catalog。 想要在 SQL CLI 中使用自定义 Catalog,用户除了需要实现自定义的 Catalog 之外,还需要为这个 Catalog 实现对应的 CatalogFactory 接口。

3.2 示例演示

下面通过JdbcCatalog来演示连接mysql的元数据

1)在Mysql中创建数据库Flink和表log

CREATE DATABASE flink;
use flink;
CREATE TABLE log (
	id varchar(100) NOT NULL,
	cpu DOUBLE NULL,
	ts INT NULL,
	PRIMARY KEY (id) 
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4;
insert into log values('server1',40.2,4);

在这里插入图片描述

2)上传connector的jar:需要将connector的jar和mysql连接驱动的jar上传到Flink服务器的lib目录下面

在这里插入图片描述

注意:之前使用的官方目前最新版本的flink-connector-jdbc-3.3.0-1.19.jar会报CatalogFact2ory类有歧义,发现包里面不同目录有2个该类,因此替换为flink-connector-jdbc-3…0-1.19.jar正常。

3)重启Flink集群

./stop-cluster.sh 
./start-cluster.sh 

4)在sql-client中创建Catalog

CREATE CATALOG my_catalog WITH(
   'type' = 'jdbc',
   'default-database' = 'flink',
   'base-url' = 'jdbc:mysql://localhost:3306',
   'username' = 'root',
   'password' = '你的数据库密码'
);

在这里插入图片描述

5)查看数据库

show catalogs;
use catalog my_catalog;
show tables;

在这里插入图片描述

6)查询数据

SET sql-client.execution.result-mode=TABLEAU;
select * from log;
show tables;

在这里插入图片描述

7)插入数据

insert into log values('server2',23.8,5);

在这里插入图片描述

从mysql中可以查询到插入的数据
在这里插入图片描述

注意:catalog模式下是不支持建表

结语:本章主要对FlinkSQL的一些重要的概念进行了讲解,这些概念对于使用FlinkSQL非常重要,可以多多复习掌握。下一章将讲保存点和检查点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linmoo1986

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值