flink sql 知其所以然(一)| source\sink 原理

感谢您的关注  +  点赞 + 再看,对博主的肯定,会督促博主持续的输出更多的优质实战内容!!!

1.序篇-本文结构

本文从以下五个小节介绍 flink sql source\sink\format 的概念、原理。

  1. 背景篇-关于 sql

  2. 定义篇-sql source、sink

  3. 实战篇-sql source、sink 的用法

  4. 原理剖析篇-sql source、sink 是怎么跑起来的

  5. 总结与展望篇

2.背景篇-关于 sql

关于 flink sql 的定位。

先聊聊使用 sql 的原因,总结来说就是一切从简。

  • SQL 属于 DSL

  • SQL 易于理解

  • SQL 内置多种查询优化器

  • SQL 稳定的语言

  • SQL 易于管理

  • SQL 利于流批一体

目前 1.13 版本的 SQL 已经集成了大量高效、易用的 feature。本系列教程也是基于 1.13.1。

3.定义篇-sql source、sink

本文会简单介绍一些 flink sql 的 source、sink 的定义、使用方法,会着重切介绍其对应框架设计和实现。详细解析一下从一条 create table sql 到具体的算子层面的整个流程。

Notes:在 flink sql 中,source 有两种表,一种是数据源表,一种是数据维表。数据源表就是有源源不断的数据的表。比如 mq。数据维表就是用来给某些数据扩充维度使用的。比如 redis,mysql,一般都是做扩容维度的维表 join 使用。

本节主要介绍数据源表,数据维表的整个流程和数据源表几乎一样。下文中的 source 默认都为数据源表。

首先在介绍 sql 之前,我们先来看看 datastream 中定义一个 source 需要的最基本的内容。

  1. source、sink 的 connector 连接配置信息。比如 datastream api kafka connector 的 properties,topic 名称。

  2. source、sink 的序列化方式信息。比如 datastream api kafka connector 的 DeserializationSchema,SerializationSchema。

  3. source、sink 的字段信息。比如 datastream api kafka connector 的序列化或者反序列化出来的 Model 所包含的字段信息。

  4. source、sink 对象。比如 datastream api kafka connector source 对应的具体 java 对象。

sql 中的 source、sink 所包含的基本点其实和 datastream 都是相同的,可以将 sql 中的一些语法给映射到 datastream 中来帮助快速理解 sql:

  1. sql source、sink connector\properties。可以对应到 datastream api kafka connector 的 properties,topic 名称。

  2. sql source、sink format。可以对应到 datastream api kafka connector 的 DeserializationSchema,SerializationSchema。

  3. sql source、sink field。可以对应到 datastream api kafka connector 的序列化或者反序列化出来的 Model 所包含的字段信息。

  4. sql source、sink catalog_name、db_name、table_name。可以对应到 datastream api kafka connector source 对应的具体 java 对象。

  5. sql 本身的特性。比如某些场景下需要将 sql schema 持久化,会用到 hive catalog 等,这个可以说是 sql 目前比 datastream api 多的一个特性。但是仔细想想,其实 datastream 也能够拓展这样的能力,其实就是将某个 datastream 注册到外部存储中(可以,但对 datastream 来说没必要)。

来看看官网的文档 create table schema 的描述,可以发现就是围绕着上面这五点展开的。https://ci.apache.org/projects/flink/flink-docs-release-1.13/zh/docs/dev/table/sql/create/#create-table。

CREATE TABLE [IF NOT EXISTS] [catalog_name.][db_name.]table_name
  (
    {  |  |  }[ , ...n]
    [  ]
    [ <

你可能感兴趣的:(Apache,Flink,实战技巧,实时计算)