序言

基于最新的v1.14.4 梳理下批流统一的用法cuiyaonan2000@163.com

官方的文档看的头晕,要把所有的都穿起来还是有难度.先基于其它码友的经验文章,在去看官网我觉得效果更好.

批流统一总的来说,使用上层的API以操作传统关系型数据库表的方式来进行计算

参考资料:

  1. 概览 | Apache Flink
  2. DataStream API Integration | Apache Flink
  3. 流式概念 | Apache Flink
  4. 概览 | Apache Flink    --- 官方默认提供的source 和 sink
  5. User-defined Sources & Sinks | Apache Flink    ----自定义source和sink的方法

Planner的一些信息

Blink将批处理作业,视为流式处理的特殊情况。所以,blink不支持表和DataSet之间的转换,批处理作业将不转换为DataSet应用程序,而是跟流处理一样,转换为DataStream程序来处理。

因为批流统一,Blink planner也不支持BatchTableSource,而使用有界的StreamTableSource代替.

由上知道:

  1. Blink不支持 表 和 DataSet之间的转换,即批流统一不支持DataSet使用
  2. 批流统一处理有界流和无界流,最终都是转换成DataStream的Api进行处理
  3. 有界流使用StreamTableSource,无界流使用TableSource 作为批流统一的原始数据源.

创建表环境

创建表环境最简单的方式,就是基于流处理执行环境,调create方法直接创建:

//创建流式环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

//创建表环境
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);

TableEnvironment 是 Table API 和 SQL 的核心概念。它负责:

  • 在内部的 catalog 中注册 Table   
  • 注册外部的 catalog                          
  • 加载可插拔模块
  • 执行 SQL 查询
  • 注册自定义函数 (scalar、table 或 aggregation)
  • 将 DataStream 或 DataSet 转换成 Table  ----由此可见批流的操作对象是Table
  • 持有对 ExecutionEnvironment 或 StreamExecutionEnvironment 的引用

设置表环境环境变量

可以看到在创建表环境StreamTableEnvironment 时,可以设置表环境的配置信息

flink 批处理计算基于hive flink做批处理_SQL

当前版本还是不稳定,之前很多可用的配置都被取消了,官方能别这么着急发版本么cuiyaonan2000@163.com

如下是创建环境信息的方法

flink 批处理计算基于hive flink做批处理_SQL_02

TableEnvironment可以注册目录Catalog,并可以基于Catalog注册表. TableEnvironment会维护一个Catalog-Table表之间的map.

命名空间

表(Table)是由一个“标识符”来指定的,由3部分组成(如果没有指定目录或数据库,就使用当前的默认值):

  1. Catalog名  ---- 如果连接进入同一个catalog,数据库则可以共享该命名空间下的所有表cuiyaonan2000@163.com
  2. 数据库(database)名
  3. 对象名(表名)

表类型

  • 常规的(Table,表): 一般可以用来描述外部数据,比如文件、数据库表或消息队列的数据,也可以直接从 DataStream转换而来
  • 虚拟的(View,视图): 可以从现有的表中创建,通常是table API或者SQL查询的一个结果

常规表

如上可知常规表,一般都是外部数据.来源可以是文件,kafka,mysql,mongodb,hive等

Flink的改变很大,很多历史博客的连接外部资源使用的是tableEnv.connect()这个方法,但是在最新的版本中该方法已经消失了. 参照官网的连接都是使用的sql方式.即以属性添加外部资源信息的方式,使用sql来注册外部资源cuiyaonan2000@163.com

flink 批处理计算基于hive flink做批处理_SQL_03

表连接器&表格式

Filink提供了2个概念以连接外部资源(注入Kafka,Hive,Mongodb等),

  1. 表连接器(table connector): 表连接即通过类Sql的形式连接外部资源.
  2. 表格式(table format): 表格式是一种存储格式,定义了如何将外部资源的信息映射到Flink内部自定义的格式上.

表格式

Flink 提供了一套与表连接器(table connector)一起使用的表格式(table format)。表格式是一种存储格式,定义了如何把二进制数据映射到表的列上

flink 批处理计算基于hive flink做批处理_Apache_04

具体的使用其实也比较简单,但是可能对于使用SQL这种方式连接Kafka,Mysql的不习惯,第一次看比较陌生.

如下所示表格式的配置,在表连接配置下方

flink 批处理计算基于hive flink做批处理_API_05

 关于表格式的属性可以参考官网信息.这里紧列举Json的格式配置信息

flink 批处理计算基于hive flink做批处理_SQL_06

表的查询

利用外部系统的连接器connector,我们可以读写数据,并在环境的Catalog中注册表。接下来就可以对表做查询转换了。

Flink给我们提供了两种查询方式:Table API和 SQL。

Table API的调用

Table API是集成在Scala和Java语言内的查询API。与SQL不同,Table API的查询不会用字符串表示,而是在宿主语言中一步一步调用完成的。

Table API基于代表一张“表”的Table类,并提供一整套操作处理的方法API。这些方法会返回一个新的Table对象,这个对象就表示对输入表应用转换操作的结果。有些关系型转换操作,可以由多个方法调用组成,构成链式调用结构。例如table.select(…).filter(…),其中select(…)表示选择表中指定的字段,filter(…)表示筛选条件。

val sensorTable: Table = tableEnv.from("inputTable")

val resultTable: Table = senorTable

.select("id, temperature")

.filter("id ='sensor_1'")

另外TableApi是按照Sql的使用习惯设置了一些方法,具体参考:Table API | Apache Flink

SQL查询

Flink的SQL集成,基于的是ApacheCalcite,它实现了SQL标准。在Flink中,用常规字符串来定义SQL查询语句。SQL 查询的结果,是一个新的 Table。

代码实现如下:

val resultSqlTable: Table = tableEnv.sqlQuery("select id, temperature from inputTable where id ='sensor_1'")