diff --git a/Flink_SQL/README.md b/Flink_SQL/README.md new file mode 100644 index 0000000..fed33dd --- /dev/null +++ b/Flink_SQL/README.md @@ -0,0 +1,6 @@ + +
+ +- [双流Join底层原理](./双流Join底层原理.md) + + diff --git a/Flink_SQL/flinksql_0001.png b/Flink_SQL/flinksql_0001.png new file mode 100644 index 0000000..8ba80c3 Binary files /dev/null and b/Flink_SQL/flinksql_0001.png differ diff --git a/Flink_SQL/双流Join底层原理.md b/Flink_SQL/双流Join底层原理.md new file mode 100644 index 0000000..1f9f8bd --- /dev/null +++ b/Flink_SQL/双流Join底层原理.md @@ -0,0 +1,154 @@ + + + +# 底层原理简介 + +![pic](./flinksql_0001.png) + +- LState:存储左边数据流中的数据。 +- RState:存储右边数据流中的数据。 +- 当左边数据流数据到达的时候会保存到LState,并且到RState中进行Join。将Join生成的结果数据发送到下游。 +- 右边数据流中数据到达的时候,会保存到RState当中,并且到LState中进行Join,然后将Join之嚄胡的结果数据发送到下游。 + + +为了保障左右两边流中需要Join的数据出现在相同节点,Flink SQL会利用Join中的on的关联条件进行分区,把相同关联条件 +的数据分发到同一个分区里面。 + + + +# 普通双流Join + +现有订单表A和支付表B进行关联得到汇总表C。订单表和支付表初始数据如下: + +表A:订单表数据 +| order_id | timestamp| +|---|--| +| 1001 | 2023-02-04 10:00:00 | +| 1002 | 2023-01-04 10:01:02 | + +表B:支付表数据 + +| order_id | pay_money | +|---|---| +| order_id | pay_money | +| 1001 | 80 | +| 1002 | 100 | + +## inner join + +当A表中每一条数据到达时,都会和B表中的数据进行关联: +- 当能够关联到数据时,将结果输出到结果表里面; +- 当不能关联到数据时,不会将结果输出到结果表里面; + +所以上述A表和B表的Join结果为: + +| order_id | timestamp | pay_money | +|--- |--- |--- | +| 1002 | 2023-01-04 10:01:02 | 100 | + +当表B中1001新数据到达时,新数据如下所示: + +| order_id | pay_money | +|---|---| +| order_id | pay_money | +| 1001 | 80 | + +此时结果表的数据为: + +| order_id | timestamp | pay_money | +|--- |--- |--- | +| 1002 | 2023-01-04 10:01:02 | 100 | +| 1001 | 2023-02-04 10:00:00 | 80 | + +***注意*** + +Inner Join 不会产生回撤流。 + +## left join + +当A表数据到达时会主动和B表中数据进行关联查询,没有关联到数据。也会输出结果,缺失的字段使用null进行补全。 + +B表中的数据1002到达之后且A表中的数据1001和1002已经到达,关联之后表C的数据如下: + +| order_id | timestamp | pay_money | +|--- |--- |--- | +| 1001 | 2023-02-04 10:00:00 | null | +| 1002 | 2023-01-04 10:01:02 | 100 | + +当B表中数据1001到达之后,也会主动和表A中的数据进行关联,如果表中的数据已经输出过结果了且缺失字段为null,此时 +会产生一个回撤流,将之前输出的数据会撤掉-D,在重新输出完整的数据+I。 + + +| order_id | timestamp | pay_money | / | +|--- |--- |--- |---| +| 1001 | 2023-02-04 10:00:00 | null | +I| +| 1002 | 2023-01-04 10:01:02 | 100 | +I | +| 1001 | 2023-02-04 10:00:00 | null | -D | +| 1001 | 2023-02-04 10:00:00 | 80 | +I | + +***注意*** + +left Join会产生回撤流。 + + +## Right Join + +当表B中1001到达时,A表中的数据没有到达,则还是会输出数据,缺失字段使用null代替。当表B中数据1002到达时,A表中的 +数据1002已经到达此时可以关联到数据,关联结果如下: + +| order_id | timestamp | pay_money | +|--- |--- |--- | +| 1001 | null | null | +| 1002 | 2023-01-04 10:01:02 | 100 | + +当表A中数据1001到达时,会主动到B表中进行关联,此时结果中已经输出过关于1001的数据,此时会产生一个回撤流。 + +| order_id | timestamp | pay_money | / | +|--- |--- |--- | ---| +| 1001 | null | null | +I| +| 1002 | 2023-01-04 10:01:02 | 100 | +I | +| 1001 | null | null | -D | +| 1001 | 2023-02-04 10:00:00 | 80 | +I | + +***注意*** + +Right Join会产生回撤流。 + +## Full Join + +当表B中数据1001先到达时,会主动到A表中进行关联查询,关联不到数据,还是会输出结果。 + +当表A中数据到达时,会主动和B表中的数据进行关联查询,此时B表中只有1001的数据,灌篮不到数据,还是会输出结果。 + +所以此时关联结果如下: + +| order_id | timestamp | pay_money | +|--- |--- |--- | +| 1001 | null | null | +| 1002 | 2023-01-04 10:01:02 | null | + + +当表A中的1001到达时,会和B表进行关联查询,当表B的1002到达时,会和表A进行关联查询,此时结果如下: + +| order_id | timestamp | pay_money | / | +|--- |--- |--- | ---| +| 1001 | null | null | +I | +| 1002 | 2023-01-04 10:01:02 | null | +I | +| 1001 | null | null | -D | +| 1001 | 2023-02-04 10:00:00 | 80 | +I | +| 1002 | 2023-01-04 10:01:02 | null | -D | +| 1002 | 2023-01-04 10:01:02 | 100 | +I | + +***注意*** + +Full Join 会产生回撤流。 + +# Interval Join + + + + +# 维表Join + + + diff --git a/README.md b/README.md index 9ec907e..bf6b838 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ # 内存调优 +## 目录 + - [内存等资源调优](./调优/Resource.md) - [状态和CheckPoint 调优](./调优/CheckPoint.md) - [如何分析及处理 Flink 反压](./调优/backpress.md) @@ -16,5 +18,24 @@ # 常见故障排除 +## 目录 + +- [常见问题总结](./常见问题) + + +# Flink SQL + +Flink SQL学习笔记提纲。持续更新。Hive SQL 离线Join VS Flink SQL 双流Join。 + +| 对比维度 | Hive SQL离线Join | Flink SQL双流Join | +| ---| ----|----| +| 数据源 | 有界(离线数据)| 无界(实时数据) | +| 计算次数 | 一次 | 持续计算 | +| 计算结果 | 有界(离线数据) | 无界(实时数据) | +| 计算驱动 | 单边驱动 | 双边驱动 | + +## 目录 + +- [Flink SQL双流Join底层原理](./Flink_SQL/双流Join底层原理.md)