Doit -FlinkSQL
Flink SQL。
**核心工作原理**:
将源数据 流 数据集 绑定元数据schema后 注册成catalog 中的表。table view。
然后用户通过tableAPI 或SQL表达计算逻辑。
table-planner对SQL语义 绑定元数据得到逻辑执行计划。
再用Optimizer 优化后 得到物理执行计划。
物理执行计划经过代码生成器生成代码 得到Transformation Tree
Transformation Tree 转成JobGraph 提交到 flink 集群执行。
Node{
name.
age
parent Node 含有父亲引用
}
常量折叠。 谓词下推。投影下推。基于规则 的优化:
基于代价成本的优化。-物理计划优化。
算子 有自己对应的代码模版。
动态表 和Changelog 流
动态表:
核心抽象 是无界的数据流:
changeMode 模式 -U -I -D
AppendOnly Stream. Retract Stream Upsert Stream
Row 类型 可以装任何东西。
Row代表一行。rowKind 表示。changeMode类型。
table-api-java-bridge 依赖添加。
持续计算 持续输出。
+I -D -U +U
Flink-SQL编程:
创建编程入口。
将数据源定义成表 视图。 映射成表。
执行SQL语义的查询 sql语法或者table-api
将查询结果输出到目标表。
fromTableDescriptor~。
流表 混合编程。
环境创建 先创建流 在创建表环境
表的标识结构:
catalog name. db name. table name
数据源标识。
view 基于表 创建 代表一个或多个表的计算逻辑。
临时 与永久:
默认是在内存catalog中。不同的Session之间互相 不可见。 同一个Session 重启之后也发生了变化。
Table 对象各种创建方式:
1. Table 对象获取 方式解析:
从已经注册的表
从Table Descriptor。连接器 /format/shema/option
从DataStream
从Table 对象上的查询API生成
从测试数据。
tableEnv.fromDataStream~. 可以传入Schema 。
把流中的。数据转换为JavaBean 可以识别Schema 表结构。
fromValues:
做测试 用 DataTypes 传入 类型。
拿到表对象。或者表 名称。 view 依托于 物理数据上。dataStream/view
Catalog 理解:
内存元数据Catalog GenericInMemoryCatalog
catalog 存在 一个LinkedHashMap中。
临时表放在 一个额外的 TemporaryTables 里面。额外的hashMap。不在任何一个Catalog中 而在Catalog Manager的一个HashMap中。
同名的表。 优先选 临时空间中的 表路径相同。
写入Kafka流 如果有Upsert的操作需要用Upsert Kafka 。 需要指定主键。-U被吞掉 不会在屏幕显示。
三种类型的字段 定义
physical column
computed columns 表达式字段。
metadata columns
元数据信息: 相关的Topic 分区号 偏移量 Headers leaderEpoch 命令行输入的没有Key
Connector 会暴露一部分元数据的信息。可以通过字段形式得到。
普通Kafka 连接器 不支持定义主键Key。 Upsert-Kafka 支持主键 changelog流。
Descriptor ————>>>> columnByMetaData column columnByExpression
format 概述。
Json形式
filesystem: source 里面不支持 元数据。1.14 不支持 1.15 支持。
结构体中取字段。xxxx.XX
嵌套Json中取值 xxx[‘xx’] 类似Struct 。
array index 是从1 开始 。
csv format:
Flink-SQL 时间属性。Watermark
bigInt 类型 不允许定义为事件时间属性。 必须是 timestamp 或者timestamp_ltz 类型。
如果是bigInt类型 需要用TO_TIMESTAMP(numeric , precision)先转为 timestamp 形式。
✳️。‼️。 字段声明为 事件时间属性。根据这个属性产生WaterMark
流转表 时 无论源流是否定义了WaterMark 都不会自动传递WM。如需进行时间运算。需要转换定义中显式声明WM策略。
可以新生成。也可以沿用原来的WM
表转流
WaterMark 会自动传入进来。
Kafka 连接器:
P140
Key 和value 中有相同的数据时:
最细的kafka。建表:
tenv.executeSql(
" CREATE TABLE t_kafka_connector ( "
+ " guid int, "
+ " eventId string, "
+ " eventTime bigint, "
+ " pageId string, "
+ " k1 int, "
+ " k2 int, "
+ " rec_ts timestamp(3) metadata from 'timestamp' , "
+ " `offset` bigint metadata , "
+ " headers map<string,bytes> metadata, "
+ " rt as to_timestamp_ltz(eventTime,3) , "
+ " watermark for rt as rt - interval '0.001' second "
+ " ) WITH ( "
+ " 'connector' = 'kafka', "
+ " 'topic' = 'doit30-kafka', "
+ " 'properties.bootstrap.servers' = 'doitedu:9092', "
+ " 'properties.group.id' = 'testGroup', "
+ " 'scan.startup.mode' = 'earliest-offset', "
+ " 'key.format'='json', "
+ " 'key.json.ignore-parse-errors' = 'true', "
+ " 'key.fields'='k1;k2', "
/* + " 'key.fields-prefix'='', " */
+ " 'value.format'='json', "
+ " 'value.json.fail-on-missing-field'='false', "
+ " 'value.fields-include' = 'EXCEPT_KEY' "
+ " ) "
);
Upsert -Kafka
-U 没有写入Kafka中。只写入+U
group by只会产生 -U +U 和+I
-D 在Join中 体现。
- D在 Kafka中 的体现是一个Null。 看见Null之后再往下面读一行。
JDBC 连接器
1> 可以作为Scan Source 底层产生Bounded Stream
2> 可以作为lookUpSource 底层事件驱动 式查询
3> 可以作为Batch模式 下的 Sink
4> 可以作为Stream 模式下的append Sink 和Upsert Sink
处理方式:
永远插入 把-U 吞掉。 利用 insert on duplicate key 更新。
Scan 模式不会持续读取。
需要表中定义主键 才可以进行。Upsert 操作。
FileSystem Connector
数据库文件 不存在format 文件需要添 format
分区字段 需要是 表定义中的字段 与Hive 不同 Hive 分区的字段不可以出现在表定义的字段中。
tenv.executeSql(
"CREATE TABLE fs_table (\n" +
" user_id STRING,\n" +
" order_amount DOUBLE,\n" +
" dt STRING,\n" +
" `hour` STRING\n" +
") PARTITIONED BY (dt, `hour`) WITH (\n" +
" 'connector'='filesystem',\n" +
" 'path'='file:///d:/filetable/',\n" +
" 'format'='json',\n" +
" 'sink.partition-commit.delay'='1 h',\n" +
" 'sink.partition-commit.policy.kind'='success-file',\n" +
" 'sink.rolling-policy.file-size' = '8M',\n" +
" 'sink.rolling-policy.rollover-interval'='30 min',\n" +
" 'sink.rolling-policy.check-interval'='10 second'\n" +
")"
);
flink-sql 建表完整语法
CDC 连接器
需要。添加ckpt 结合 changelog 流。
flink-sql-cdc 连接器 动态变化表复杂逻辑测试。
UPDATE_BEFORE -U
UPDATE_AFTER. +U
复杂逻辑 在flink-sql里面做 会有不支持的情况。
Flink -sql 查询: – P156
多维高阶聚合语法。
withRollUp~
flink中:
group by cube
group by groupingsets() 组合~。
group by rollUp()
时间窗口计算 TVF。 函数。
Window Table Value Function。函数产生一个表。TVF 内置window Start windowEnd 。
滚动: tumble
滑动 HOP。
Flink -SQL 中没有会话窗口
累积窗口: cumulate. 截止当前。 window start 不变 window最大长度。
单独的表值函数不支持。必须和 group by 聚合一起。
表值函数的约束:::
1.在窗口上做分组聚合。必须带上window_start 和wondow_end
2.窗口上做TopN计算 也必须带上 ~
3. Join 条件必须带上~。两个表的window_start 和window_end 等值条件。
表值函数 TopN~
窗口Join
常规Join:
Regular Join: 没有窗口的Join。 设置状态TTL 使状态 量不至于过大。 背压风险。
lookUp Join:
左表。
右表是维表。mysql表。 只支持 处理时间 语义来输出。
lookUp。 缓存是否开启?
单流 点查。
Interval Join
曝光 流和播放流。interval join 。
temporal Join 时态Join
左边数据 总是Join 右边数据的 那一时刻的 最新版本
汇率变化。
over 聚合:
Flink-SQL 支持rows between 和range between
函数
自定义函数------>>>>
Scalar 函数。
标量 单行函数。
继承scalar function。实现。eval 方法~/
分组聚合函数:
Aggregate function:
继承Aggregate Function~。
实现 create Accumulator。 accumulate。 getValue 方法。
Java 中重载 是参数列表 不同 而不是返回值区分。
table function:
表生成函数
需要加注解 @FuntionHint
table aggregate function:
表聚合函数:
分组 TopN~。
定义几个。值 one two 。。。
table api中。flatAggregate 方法。
sql-client 的使用:
flink 整合Hive:
sql-client
只能写 纯sql。流表 互转不可以。 需要依赖Jar包。
metric 基本度量
监控指标。
prometheus。 grafana
node manager。push gateway===Flink 。
企业级监控套装
722

被折叠的 条评论
为什么被折叠?



