【大数据】Flink 详解(八):SQL 篇 Ⅰ

Flink 详解》系列(已完结),共包含以下 10 10 10 篇文章:

  • 【大数据】Flink 详解(一):基础篇
  • 【大数据】Flink 详解(二):核心篇 Ⅰ
  • 【大数据】Flink 详解(三):核心篇 Ⅱ
  • 【大数据】Flink 详解(四):核心篇 Ⅲ
  • 【大数据】Flink 详解(五):核心篇 Ⅳ
  • 【大数据】Flink 详解(六):源码篇 Ⅰ
  • 【大数据】Flink 详解(七):源码篇 Ⅱ
  • 【大数据】Flink 详解(八):SQL 篇 Ⅰ
  • 【大数据】Flink 详解(九):SQL 篇 Ⅱ
  • 【大数据】Flink 详解(十):SQL 篇 Ⅲ

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

Flink 详解(八):SQL 篇 Ⅰ

  • 82.Flink SQL 有没有使用过?
  • 83.Flink 被称作流批一体,那从哪个版本开始,真正实现流批一体的?
  • 84.Flink SQL 使用哪种解析器?
  • 85.Calcite 主要功能包含哪些?
  • 86.Flink SQL 处理流程说一下?
  • 87.Flink SQL 包含哪些优化规则?
  • 88.Flink SQL 中涉及到哪些 Operation?
  • 89.Flink Hive 有没有使用过?
  • 90.Flink 与 Hive 集成时都做了哪些操作?
  • 91.HiveCatalog 类包含哪些方法?
  • 92.Flink SQL 1.11 新增了实时数仓功能,介绍一下?
  • 93.Flink - Hive 实时写数据介绍下?
    • 93.1 Flink-SQL 写法
    • 93.2 Flink-Table 写法
  • 94.Flink - Hive 实时读数据介绍下?
  • 95.Flink - Hive 实时写数据时,如何保证已经写入分区的数据何时才能对下游可见呢?

82.Flink SQL 有没有使用过?

在 Flink 中,一共有四种级别的抽象,而 Flink SQL 作为最上层,是 Flink API 的一等公民。

在这里插入图片描述
在标准 SQL 中,SQL 语句包含四种类型

  • 数据操作语言DMLData Manipulation Language):用来定义数据库记录(数据)。
  • 数据控制语言DCLData Control Language):用来定义访问权限和安全级别。
  • 数据查询语言DQLData Query Language):用来查询记录(数据)。
  • 数据定义语言DDLData Definition Language):用来定义数据库对象(库,表,列等)。

Flink SQL 包含 DML 数据操作语言、 DDL 数据定义语言, DQL 数据查询语言,不包含 DCL 语言。

🚀 可以参考我的这篇博客:【数据库】DDL、DML、DCL简介

83.Flink 被称作流批一体,那从哪个版本开始,真正实现流批一体的?

1.9.0 版本开始,引入了阿里巴巴的 Blink ,对 FIink TabIe & SQL 模块做了重大的重构,保留了 Flink Planner 的同时,引入了 Blink PIanner,没引入以前,Flink 没考虑流批作业统一,针对流批作业,底层实现两套代码,引入后,基于流批一体理念,重新设计算子,以流为核心,流作业和批作业最终都会被转为 transformation

84.Flink SQL 使用哪种解析器?

Flink SQL 使用 Apache Calcite 作为解析器和优化器。

Calcite 一种动态数据管理框架,它具备很多典型数据库管理系统的功能 如 SQL 解析SQL 校验SQL 查询优化SQL 生成 以及 数据连接查询 等,但是又省略了一些关键的功能,如 Calcite 并不存储相关的元数据和基本数据,不完全包含相关处理数据的算法等。

85.Calcite 主要功能包含哪些?

Calcite 主要包含以下五个部分:

  • SQL 解析Parser
    • Calcite SQL 解析是通过 JavaCC 实现的,使用 JavaCC 编写 SQL 语法描述文件,将 SQL 解析成未经校验的 AST 语法树。
  • SQL 校验Validato
    • 无状态的校验:即验证 SQL 语句是否符合规范。
    • 有状态的校验:即通过与元数据结合验证 SQL 中的 Schema、Field、 Function 是否存在,输入输出类型是否匹配等。
  • SQL 查询优化
    • 对上个步骤的输出(RelNode,逻辑计划树)进行优化,得到优化后的物理执行计划。优化有两种:基于规则的优化基于代价的优化,后面会详细介绍。
  • SQL 生成
    • 将物理执行计划生成为在特定平台 / 引擎的可执行程序,如生成符合 MySQL 或 Oracle 等不同平台规则的 SQL 查询语句等。
  • 数据连接与执行
    • 通过各个执行平台执行查询,得到输出结果。 在 Flink 或者其他使用 Calcite 的大数据引擎中,一般到 SQL 查询优化即结束,由各个平台结合 Calcite SQL 代码生成和平台实现的代码生成,将优化后的物理执行计划组合成可执行的代码,然后在内存中编译执行。

86.Flink SQL 处理流程说一下?

下面举个例子,详细描述一下 Flink SQL 的处理流程,如下所示:

SET table.sql-dialect=default;
CREATE TABLE log_kafka (
	user_id STRING,|
	order_amount DOUBLE,
	log_ts TIMESTAMP(3),
	WATERMARK FOR log_ts AS log_ts - INTERVAL '5' SECOND
) WITH (
	'connector'='kafka',
	'property-version' = 'universal',
	'topic' = 'test',
	'properties.bootstrap.servers'= 'hlink163:9092',
	'scan.startup.mode' = 'earliest-offset',
	'format' = 'json',
	'json.fail-on-missing-field' = 'false',
	'json.ignore-parse-errors' = 'true',
	'properties.group.id' = 'flink1'
);

我们写一张 Source 表,来源为 Kafka,当执行 create table log_kafka 之后 Flink SQL 将做如下操作:

在这里插入图片描述

  • 首先,Flink SQL 底层使用的是 Apache Calcite 引擎来处理 SQL 语句,Calcite 会使用 JavaCC 做 SQL 解析,JavaCC 根据 Calcite 中定义的 Parser.jj 文件,生成一系列的 Java 代码,生成的 Java 代码会 把 SQL 转换成 AST 抽象语法树(即 SqlNode 类型)。
  • 生成的 SqlNode 抽象语法树,它是一个未经验证的抽象语法树,这时,SQL Validator 会获取 Flink Catalog 中的元数据信息来验证 SQL 语法,元数据信息检查包括表名,字段名,函数名,数据类型等检查。然后生成一个校验后的 SqlNode
  • 到达这步后,只是将 SQL 解析到 Java 数据结构的固定节点上,并没有给出相关节点之间的关联关系以及每个节点的类型信息。所以,还 需要将 SqlNode 转换为逻辑计划,也就是 LogicalPlan,在转换过程中,会使用 SqlToOperationConverter 类,来将 SqlNode 转换为 Operation,Operation 会根据 SQL 语法来执行创建表或者删除表等操作,同时 FlinkPlannerImpl.rel() 方法会将 SqlNode 转换成 RelNode 树,并返回 RelRoot。
  • 第 4 步将执行 Optimize 操作,按照预定义的优化规则 RelOptRule 优化逻辑计划。Calcite 中的优化器 RelOptPlanner 有两种,一是基于规则优化(RBO)的 HepPlanner,二是基于代价优化(CBO)的 VolcanoPlanner。然后得到优化后的 RelNode, 再基于 Flink 里面的 rules 将优化后的逻辑计划转换成物理计划。
  • 第 5 步,执行 Execute 操作,会通过代码生成 transformation,然后递归遍历各节点,将 DataStreamRelNode 转换成 DataStream,在这期间,会依次递归调用 DataStreamUnionDataStreamCalcDataStreamScan 类中重写的 translateToPlan 方法。递归调用各节点的 translateToPlan,实际是利用 CodeGen 元编成 Flink 的各种算子,相当于直接利用 Flink 的 DataSet 或者 DataStream 开发程序。
  • 最后进一步编译成可执行的 JobGraph 提交运行。

87.Flink SQL 包含哪些优化规则?

下图为执行流程图:
在这里插入图片描述
总结就是:

  • 先解析,然后验证,将 SqlNode 转化为 Operation 来创建表,然后调用 rel 方法将 SqlNode 变成逻辑计划(RelNodeTree),紧接着对逻辑计划进行优化。
  • 优化之前,会根据 Calcite 中的优化器中的基于规则优化的 HepPlanner 针对四种规则进行预处理,处理完之后得到 Logic RelNode,紧接着使用代价优化的 VolcanoPlanner 使用 Logical_Opt_Rules(逻辑计划优化)找到最优的执行 Planner,并转换为 Flink Logical RelNode。
  • 最后运用 Flink 包含的优化规则,如 DataStream_Opt_Rules(流式计算优化)、DataStream_Deco_Rules(装饰流式计算优化),将优化后的逻辑计划转换为物理计划。

优化规则包含如下:

  • 子查询优化Table_subquery_rules
  • 扩展计划优化Expand_plan_rules
  • 扩展计划优化Post_expand_clean_up_rules
  • 正常化流处理Datastream_norm_rules
  • 逻辑计划优化Logical_Opt_Rules
  • 流式计算优化DataStream_Opt_Rules
  • 装饰流式计算优化DataStream_Deco_Rules

88.Flink SQL 中涉及到哪些 Operation?

先介绍一下什么是 Operation:在 Flink SQL 中,涉及的 DDL,DML,DQL 操作都是 Operation,在 Flink 内部表示,Operation 可以和 SqlNode 对应起来。

Operation 执行在优化前,执行的函数为 executeQperation,如下图所示,为执行的所有 Operation。

在这里插入图片描述

89.Flink Hive 有没有使用过?

Flink 社区在 Flink 1.11 版本进行了重大改变,如下图所示:
在这里插入图片描述

90.Flink 与 Hive 集成时都做了哪些操作?

如下所示为 Flink 与 Hive 进行连接时的执行图:
在这里插入图片描述

  • Flink 1.1 新引入了 Hive 方言,所以在 Flink SQL 中可以编写 Hive 语法,即 Hive Dialect。
  • 编写 Hive SQL 后,FlinkSQL Planner 会将 SQL 进行解析,验证,转换成逻辑计划,物理计划,最终变成 Jobgraph。
  • HiveCatalog 作为 Flink 和 Hive 的表元素持久化介质,会将不同会话的 Flink 元数据存储到 Hive Metastore 中。用户利用 HiveCatalog 可以将 Hive 表或者 Kafka 表存储到 Hive Metastore 中。

BlinkPlanner 是在 Flink 1.9 版本新引入的机制,Blink 的查询处理器则实现流批作业接口的统一,底层的 API 都是 Transformation。真正实现流 & 批的统一处理,替代原 FlinkPlanner 将流 & 批区分处理的方式。在 1.11 版本后已经默认为 Blink Planner。

91.HiveCatalog 类包含哪些方法?

重点方法如下:
在这里插入图片描述
HiveCatalog 主要是持久化元数据,所以一般的创建类型都包含,如 databaseTableViewFunctionPartition,还有 is_Generic 字段判断等。

92.Flink SQL 1.11 新增了实时数仓功能,介绍一下?

Flink 1.11 版本新增的一大功能是实时数仓,可以实时的将 Kafka 中的数据插入 Hive 中,传统的实时数仓基于 Kafka + Flink Streaming,定义全流程的流计算作业,有着秒级甚至毫秒的实时性,但实时数仓的一个问题是历史数据只有 3 − 15 3-15 315 天,无法在其上做 Ad-hoc 的查询。

针对这个特点,Flink 1.11 版本将 FlieSystemStreaming Sink 重新修改,增加了分区提交和滚动策略机制,让 HiveStreaming Sink 重新使用文件系统流接收器。

Flink 1.11 的 Table / SQL API 中,FileSystemConnector 是靠增强版 StreamingFileSink 组件实现,在源码中名为 StreamingFileWriter。

只有在 Checkpoint 成功时,StreamingFileSink 写入的文件才会由 Pending 状态变成 Finished 状态,从而能够安全地被下游读取。所以,我们一定要打开 Checkpointing,并设定合理的间隔。

93.Flink - Hive 实时写数据介绍下?

StreamingWrite,从 Kafka 中实时拿到数据,使用分区提交将数据从 Kafka 写入 Hive 表中,并运行批处理查询以读取该数据。

93.1 Flink-SQL 写法

  • Source 源

在这里插入图片描述

  • Sink 目的

在这里插入图片描述

  • Insert 插入

在这里插入图片描述

93.2 Flink-Table 写法

  • Source 源

在这里插入图片描述

  • Sink 目的

在这里插入图片描述

  • Insert 插入

在这里插入图片描述

94.Flink - Hive 实时读数据介绍下?

在这里插入图片描述
Flink 源码中在对 Hive 进行读取操作时,会经历以下几个步骤:

  • Flink 都是基于 Calcite 先解析 SQL,确定表来源于 Hive,如果是 Hive 表,将会在 HiveCatalog 中创建 HiveTableFactory。
  • HiveTableFactory 会基于配置文件创建 HiveTableSource,然后 HiveTableSource 在真正执行时,会调用 getDataStream 方法,通过 getDataStream 方法来确定查询匹配的分区信息,然后创建表对应的 InputFormat,然后确定并行度,根据并行度确定 slot 分发 HiveMapredSplitReader 任务。
  • 在 TaskManager 端的 slot 中,Split 会确定读取的内容,基于 Hive 中定义的序列化工具,InputFormat 执行读取反序列化,得到 value 值。
  • 最后循环执行 reader.next 获取 value,将其解析成 Row。

95.Flink - Hive 实时写数据时,如何保证已经写入分区的数据何时才能对下游可见呢?

如下图所示:

在这里插入图片描述

首先可以看一下,在实时的将数据存储到 Hive 数仓中,FileSystemConnector 为了与 Flink-Hive 集成的大环境适配,最大的改变就是分区提交,可以看一下左下图,官方文档给出的,分区可以采取 日期 + 小时 的策略,或者 时分秒 的策略。

那如何保证已经写入分区的数据何时才能对下游可见呢? 这就和 触发机制 有关, 触发机制包含 process-timepartition-time 以及时延。

partition-time 指的是根据事件时间中提取的分区触发。当 'watermark' > 'partition-time' + 'delay',选择 partition-time 的数据才能提交成功,

process-time 指根据系统处理时间触发,当加上时延后,要想让分区进行提交,当 'currentprocessing time' > 'partition creation time' + 'delay' 选择 process-time 的数据可以提交成功。

但选择 process-time 触发机制会有缺陷,就是当数据迟到或者程序失败重启时,数据不能按照事件时间被归入正确分区。所以一般会选择 partition-time

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/329692.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java+SSM+MYSQL的助农特色农产品销售系统详细设计和实现【附源码】

基于JavaSSM助农特色农产品销售系统详细设计和实现【附源码】 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定…

笔试面试题——继承和多态

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、什么是多态?二、什么是重载、重写(覆盖)、重定义(隐藏)?三、 inli…

使用 Python 创造你自己的计算机游戏(游戏编程快速上手)第四版:第十九章到第二十一章

十九、碰撞检测 原文:inventwithpython.com/invent4thed/chapter19.html 译者:飞龙 协议:CC BY-NC-SA 4.0 碰撞检测涉及确定屏幕上的两个物体何时相互接触(即发生碰撞)。碰撞检测对于游戏非常有用。例如,如…

《动手学深度学习》学习笔记 第9章 现代循环神经网络

本系列为《动手学深度学习》学习笔记 书籍链接:动手学深度学习 笔记是从第四章开始,前面三章为基础知识,有需要的可以自己去看看 关于本系列笔记: 书里为了让读者更好的理解,有大篇幅的描述性的文字,内容很…

成功 BOM 流程的五个基本要素

您应该以确保 BOM 流程的方式实现和启用它们: 准确的 当前的 完全的 清除 可行的 追求准确性 为下游提供准确数据 制造商使用其 BOM 来通知下游操作他们需要执行什么。不言而喻,向其他团队和员工提供准确的信息至关重要;否则&…

transbigdata笔记:栅格参数优化

在transbigdata中,栅格参数有如下几个 params(lonStart,latStart,deltaLon,deltaLat,theta) 如何选择合适的栅格参数是很重要的事情,这会对最终的分析结果产生很大的影响。 怎么选择参数,和数据以及分析的目的息息相关,transbi…

25考研英语复习计划

Hello各位小伙伴大家好,今天要给大家分享的是英语备考计划,大家可以作为参考,制定适合自己的备考计划。 【英一/二】 英语分为英一、英二,一般学硕英一,专硕英二。 英一要比英二难度大。 【复习计划】 1-2月&#xf…

383. 观光(dp思想运用,Dijkstra)

383. 观光 - AcWing题库 “您的个人假期”旅行社组织了一次比荷卢经济联盟的巴士之旅。 比荷卢经济联盟有很多公交线路。 每天公共汽车都会从一座城市开往另一座城市。 沿途汽车可能会在一些城市(零或更多)停靠。 旅行社计划旅途从 S 城市出发&…

1.C语言基础知识

这里写目录标题 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…

信管网2023年上半年信息系统项目管理师论文真题

链接 信息系统项目管理师真题题库 - 信管网 上午综合知识、下午案例分析和下午论文三部分 可以单个试题查看 可以在线考试 在线考试又分&#xff1a;考试模式、练习模式和机考模式

黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(6)解散部门

指路&#xff08;1&#xff09;&#xff08;2&#xff09;&#xff08;3&#xff09;&#xff08;4&#xff09;&#xff08;5&#xff09;&#x1f447; 黑马程序员JavaWeb开发|案例&#xff1a;tlias智能学习辅助系统&#xff08;1&#xff09;准备工作、部门管理_tlias智能…

【Qt】Qt配置

需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、Qt SDK下载 二、配置环境变量 三、新建工程(QWidget) 四、QWidg…

今年第一个互联网医疗IPO,健康之路靠医药零售“再上一层楼”?

提起互联网医疗&#xff0c;大家最先想到的或许是阿里健康、京东健康、丁香医生等“名号响亮”的公司。事实上&#xff0c;健康之路开辟互联网医疗之路的时间比这些巨头们更早。据悉&#xff0c;2001年&#xff0c;健康之路就将互联网和医院资源结合&#xff0c;是第一批开展线…

Halcon基于灰度值的模板匹配

Halcon基于灰度值的模板匹配 基于灰度值的模板匹配是最经典的模板匹配算法&#xff0c;也是最早提出来的模板匹配算法。这种算法的根本思想是&#xff0c;计算模板图像与检测图像之间的像素灰度差值的绝对值总和&#xff08;SAD方法&#xff09;或者平方差总和&#xff08;SSD…

【C语言基础考研向】04整型进制转换

整型常量的不同进制表示 计算机中只能存储二进制数&#xff0c;即0和1&#xff0c;(而在对应的物理硬件上则是高、低电平。为了更方便地观察内存中的二进制数情况&#xff0c;除我们正常使用的十进制数外&#xff0c;计算机还提供了十六进制数和八进制数。 下面介绍不同进制数的…

【从0上手cornerstone3D】如何加载nifti格式的文件

在线演示 支持加载的文件格式 .nii .nii.gz 代码实现 npm install cornerstonejs/nifti-volume-loader// ------------- 核心代码 Start------------------- // 注册一个nifti格式的加载器 volumeLoader.registerVolumeLoader("nifti",cornerstoneNiftiImageVolu…

集合框架(二)

List集合 特点、特有方法 List集合因为支持索引&#xff0c;所以多了很多于索引相关的方法&#xff0c;当然&#xff0c;Collection的功能List也都继承了。 方法名称说明void add&#xff08;int index&#xff0c;E element&#xff09;在此集合中的指定位置插入指定的元素…

HTML---Jquery选择器

文章目录 目录 文章目录 本章目标 一.Jquery选择器概述 二.Jquery选择器分类 基本选择器 层次选择器 属性选择器 三.基本过滤选择器 练习 本章目标 会使用基本选择器获取元素会使用层次选择器获取元素会使用属性选择器获取元素会使用过滤选择器获取元素 …

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-16 Robust Controller非线性鲁棒控制器

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-16 Robust Controller非线性鲁棒控制器 1. Slide Control 滑膜控制2 High Gain High Frequency3. 三种鲁棒控制器的比较如何分析控制器 Robust Control : tp achieve rob…

云服务器基于Centos创建个人云盘实践经验分享

文章目录 安装运行Cloudreve安装ossfscentos更换yum源 配置ossfs挂载oss存储配置开机启动 配置cloudreve推荐阅读 安装运行Cloudreve 执行如下命令&#xff0c;下载cloudreve安装包。 wget https://labfileapp.oss-cn-hangzhou.aliyuncs.com/cloudreve_3.3.1_linux_amd64.tar…