如何理解 Flink 中的流 table?

How to understand streaming table in Flink?

我很难理解 Flink 中的流 table。我可以理解 Hive,将一个固定的静态数据文件映射到一个“table”,但是如何体现一个基于流数据的 table?

例如,每 1 秒向 Kafka 流发送 5 个具有相同结构的事件:

{"num":1, "value": "a"} 
{"num":2, "value": "b"}
....

建立在它们之上的动态 table 是什么样子的? Flink 将它们全部消费并存储在某个地方(内存、本地文件、hdfs 等),然后映射到 table?一旦“transformer”完成处理这 5 个事件,然后清除数据并用 5 个新事件重新填充“table”?

感谢任何帮助...

这些 动态 tables 不一定存在于任何地方——它只是一个抽象,可能会或可能不会具体化,具体取决于正在执行的查询。例如,一个正在做简单投影的查询

SELECT a, b FROM events

可以通过无状态 Flink 管道简单地流式传输每条记录来执行。

此外,Flink 不会对 mini-batches 进行操作——它一次处理一个事件。因此,任何地方都没有物理“table”或部分 table。

但有些查询确实需要一些状态,也许很少,例如

SELECT count(*) FROM events

只需要一个计数器,而像

SELECT key, count(*) FROM events GROUP BY key

将使用 Flink 的 key-partitioned 状态(分片 key-value 存储)为每个键保留当前计数器。集群中的不同节点将负责处理不同键的事件。

正如“普通”SQL 将一个或多个 table 作为输入,并产生一个 table 作为输出,流 SQL 将一个或多个流作为输入,并产生一个流作为输出。例如,SELECT count(*) FROM events 将生成流 1 2 3 4 5 ... 作为其结果。

YouTube 上有一些很好的 Flink SQL 介绍:https://www.google.com/search?q=flink+sql+hueske+walther, and there are training materials on github with slides and exercises: https://github.com/ververica/sql-training