FlinkSQL篇,SQL实操、FlinkHive、CEP、CDC、GateWay Flink源码篇,作业提交流程、作业调度流程、作业内部转换流程图
Flink核⼼篇,四⼤基⽯、容错机制、⼴播、反压、序列化、内存管理、资源管理
Flink基础篇,基本概念、设计理念、架构模型、编程模型、常⽤算⼦
1、Flink SQL有没有使⽤过?
2、Flink被称作流批⼀体,从哪个版本开始,真正实现流批⼀体的?
3、Flink SQL 使⽤哪种解析器?
4、Calcite主要功能包含哪些?
5、Flink SQL 处理流程说⼀下?
6、Flink SQL包含哪些优化规则?
7、Flink SQL中涉及到哪些operation?
8、Flink Hive有没有使⽤过?
9、Flink与Hive集成时都做了哪些操作?
10、HiveCatalog类包含哪些⽅法?
11、Flink SQL 1.11 新增了实时数仓功能,介绍⼀下?
12、Flink-Hive实时写数据介绍下?
13、Flink-Hive实时读数据介绍下?
14、Flink-Hive实时写数据时,如何保证已经写⼊分区的数据何时才能对下游可见呢?
15、源码中分区提交的PartitionCommitTrigger介绍⼀下?
16、PartitionTimeCommitTigger 是如何知道该提交哪些分区的呢?(源码分析)
17、如何保证已经写⼊分区的数据对下游可见的标志问题(源码分析)
18、Flink SQL CEP有没有接触过?
19、Flink SQL CEP了解的参数介绍⼀下?
20、编写⼀个CEP SQL案例,如银⾏卡盗刷
21、Flink CDC了解吗?什么是 Flink SQL CDC Connectors?
22、Flink CDC原理介绍⼀下
23、通过CDC设计⼀种Flink SQL 采集+计算+传输(ETL)⼀体化的实时数仓
24、Flink SQL CDC如何实现⼀致性保障(源码分析)
25、Flink SQL GateWay了解吗?
26、Flink SQL GateWay创建会话讲解⼀下?
27、Flink SQL GateWay如何处理并发请求?多个提交怎么处理?
28、如何维护多个SQL之间的关联性?
29、SQL字符串如何提交到集成为代码?
1、Flink SQL有没有使⽤过?
在Flink中,⼀共有四种级别的抽象,⽽Flink SQL作为最上层,是Flink API的⼀等公民
在标准SQL中,SQL语句包含四种类型
DML(Data Manipulation Language):数据操作语⾔,⽤来定义数据库记录(数据)。
DCL(Data Control Language):数据控制语⾔,⽤来定义访问权限和安全级别。
DQL(Data Query Language):数据查询语⾔,⽤来查询记录(数据)。
DDL(Data Definition Language):数据定义语⾔,⽤来定义数据库对象(库,表,列等)。
Flink SQL包含 DML 数据操作语⾔、 DDL 数据语⾔, DQL 数据查询语⾔,不包含DCL语⾔。
2、Flink被称作流批⼀体,从哪个版本开始,真正实现流批⼀体的?
从1.9.0版本开始,引⼊了阿⾥巴巴的 Blink ,对 FIink TabIe & SQL 模块做了重⼤的重构,保留了 Flink Planner 的同时,引⼊了 Blink PIanner,没引⼊以前,Flink 没考虑流批作业统⼀,针对流批作业,底层实现两套代码,引⼊后,基于流批⼀体理念,重新设计算⼦,以流为核⼼,流作业和批作业最终都会被转为 transformation。
3、Flink SQL 使⽤哪种解析器?
Flink SQL使⽤ Apache Calcite 作为解析器和优化器。
Calcite ⼀种动态数据管理框架,它具备很多典型数据库管理系统的功能如SQL 解析、 SQL 校验、 SQL 查询优化、SQL ⽣成以及数据连接查询等,但是⼜省略了⼀些关键的功能,如 Calcite并不存储相关的元数据和基本数据,不完全包含相关处理数据的算法等。
4、Calcite主要功能包含哪些?
Calcite 主要包含以下五个部分:
1、SQL 解析(Parser)
Calcite SQL 解析是通过 JavaCC 实现的,使⽤ JavaCC 编写 SQL 语法描述⽂件,将 SQL 解析成未经校验的 AST 语法树。
2、SQL 校验(Validato)
2、SQL 校验(Validato)
校验分两部分
⽆状态的校验:即验证 SQL 语句是否符合规范。
有状态的校验:即通过与元数据结合验证 SQL 中的 Schema、Field、 Function 是否存在,输⼊输出类型是否匹配等。
3、SQL 查询优化
对上个步骤的输出(RelNode ,逻辑计划树)进⾏优化,得到优化后的物理执⾏计划,优化有两种:基于规则的优化和基于代价的优化,后⾯会详细介绍。
4、SQL ⽣成
将物理执⾏计划⽣成为在特定平台/引擎的可执⾏程序,如⽣成符合 MySQL 或 Oracle 等不同平台规则的 SQL 查询语句等。
5、数据连接与执⾏
通过各个执⾏平台执⾏查询,得到输出结果。
在Flink 或者其他使⽤ Calcite 的⼤数据引擎中,⼀般到 SQL 查询优化即结束,由各个平台结合 Calcite SQL 代码⽣成和平台实现的代码⽣成,将优化后的物理执⾏计划组合成可执⾏的代码,然后在内存中编译执⾏。
5、Flink SQL 处理流程说⼀下?
下⾯举个例⼦,详细描述⼀下Flink Sql的处理流程,如下图所⽰:
我们写⼀张source表,来源为kafka,当执⾏create table log_kafka之后 Flink SQL将做如下操作:
(1)⾸先,FlinkSQL 底层使⽤的是 apache Calcite 引擎来处理SQL语句,Calcite会使⽤ javaCC 做SQL解
析,javaCC根据Calcite中定义的 Parser.jj ⽂件,⽣成⼀系列的java代码,⽣成的java代码会把SQL转换成AST抽象语法树(即SQLNode类型)。
(2)⽣成的 SqlNode 抽象语法树,他是⼀个未经验证的抽象语法树,这时 SQL Validator 会获取 Flink Catalog 中的元数据信息来验证 sql 语法,元数据信息检查包括表名,字段名,函数名,数据类型等检查。然后⽣成⼀个校验后的SqlNode。
(3)到达这步后,只是将 SQL 解析到 java 数据结构的固定节点上,并没有给出相关节点之间的关联关系以及每个节点的类型信息。
所以,还需要将 SqlNode 转换为逻辑计划,也就是LogicalPlan,在转换过程中,会使⽤ SqlToOperationConverter 类,来将 SqlNode 转换为 Operation,Operation 会根据SQL语法来执⾏创建表或者删除表等操作,同时l⽅法会将SQLNode转换成RelNode树,并返回RelRoot。
(4)第4步将执⾏ Optimize 操作,按照预定义的优化规则 RelOptRule 优化逻辑计划。
Calcite 中的优化器RelOptPlanner有两种,⼀是基于规则优化(RBO)的HepPlanner,⼆是基于代价优化(CBO)的VolcanoPlanner。然后得到优化后的RelNode, 再基于Flink⾥⾯的rules将优化后的逻辑计划转换成物理计划。
(5)第5步执⾏ execute 操作,会通过代码⽣成 transformation,然后递归遍历各节点,将DataStreamRelNode 转换成DataStream,在这期间,会依次递归调⽤DataStreamUnion、DataStreamCalc、DataStreamScan类中重写的translateToPlan⽅法。递归调⽤各节点的translateToPlan,实际是利⽤CodeGen元编成Flink的各种算⼦,相当于直接
translateToPlan⽅法。递归调⽤各节点的translateToPlan,实际是利⽤CodeGen元编成Flink的各种算⼦,相当于直接利⽤Flink的DataSet或者DataStream开发程序。
(6)最后进⼀步编译成可执⾏的 JobGraph 提交运⾏。
6、Flink SQL包含哪些优化规则?
如下图为执⾏流程图sql语句实现的四种功能
总结:
先解析,然后验证,将SqlNode转化为Operation来创建表,然后调⽤rel⽅法将sqlNode变成逻辑计划(RelNodeTree)紧接着对逻辑计划进⾏优化;
优化之前,会根据Calcite中的优化器中的基于规则优化的HepPlanner针对四种规则进⾏预处理,处理完之后得到Logic RelNode,紧接着使⽤代价优化的VolcanoPlanner使⽤ Logical_Opt_Rules(逻辑计划优化)到最优的执⾏Planner,并转换为FlinkLogical 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:装饰流式计算优化
7、Flink SQL中涉及到哪些operation?
先介绍⼀下什么是Operation
在Flink SQL中,涉及的DDL,DML,DQL操作都是Operation,在 Flink内部表⽰,Operation可以和SqlNode对应起来。
Operation执⾏在优化前,执⾏的函数为executeQperation,如下图所⽰,为执⾏的所有Operation。
8、Flink Hive有没有使⽤过?
Flink社区在Flink1.11版本进⾏了重⼤改变,如下图所⽰:
9、Flink与Hive集成时都做了哪些操作?
如下所⽰为Flink与HIve进⾏连接时的执⾏图:
(1)Flink1.1新引⼊了Hive⽅⾔,所以在Flink SQL中可以编写HIve语法,即Hive Dialect。
(2)编写HIve SQL后,FlinkSQL Planner 会将SQL进⾏解析,验证,转换成逻辑计划,物理计划,最终变成Jobgraph。
(3)HiveCatalog作为Flink和Hive的表元素持久化介质,会将不同会话的Flink元数据存储到Hive Metastore中。⽤户利⽤HiveCatalog可以将hive表或者 Kafka表存储到Hive Metastore中。
BlinkPlanner 是在Flink1.9版本新引⼊的机制,Blink 的查询处理器则实现流批作业接⼝的统⼀,底层的 API 都是Transformation。真正实现流 &批的统⼀处理,替代原Flink Planner将流&批区分处理的⽅式。在1.11版本后已经默认为Blink Planner。
10、HiveCatalog类包含哪些⽅法?
重点⽅法如下:
HiveCatalog主要是持久化元数据,所以⼀般的创建类型都包含,如 database、Table、View、Function、Partition,还有is_Generic字段判断等。
11、Flink SQL 1.11 新增了实时数仓功能,介绍⼀下?
Flink1.11 版本新增的⼀⼤功能是实时数仓,可以实时的将kafka中的数据插⼊Hive中,传统的实时数仓基于 Kafka+ Flinkstreaming,定义全流程的流计算作业,有着秒级甚⾄毫秒的实时性,但实时数仓的⼀个问题是历史数据只有 3-15天,⽆法在其上做 Ad-hoc的查询。
针对这个特点,Flink1.11 版本将 FlieSystemStreaming Sink 重新修改,增加了分区提交和滚动策略机制,让HiveStreaming sink 重新使⽤⽂件系统流接收器。
Flink 1.11 的 Table/SQL API 中,FileSystemConnector 是靠增强版 StreamingFileSink组件实现,在源码中名为StreamingFileWriter。只有在Checkpoint 成功时,StreamingFileSink写⼊的⽂件才会由 Pending状态变成 Finished状态,从⽽能够安全地被下游读取。所以,我们⼀定要打开 Checkpointing,并设定合理的间隔。
12、Flink-Hive实时写数据介绍下?
StreamingWrite,从kafka 中实时拿到数据,使⽤分区提交将数据从Kafka写⼊Hive表中,并运⾏批处理查询以读取该数据。
Flink -SQL 写法:
Flink-table写法:
13、Flink-Hive实时读数据介绍下?
如下图所⽰:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论