如何理解Flink中的流表?

问题描述

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

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

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

基于它们构建的动态表是什么样的? Flink将它们全部消耗掉并存储在某个地方(内存,本地文件,hdfs等),然后映射到表?一旦“变形金刚”完成对这5个事件的处理,然后清除数据并用5个新事件重新填充“表”?

感谢您的帮助...

解决方法

这些动态表不一定存在于任何地方,它只是一种抽象,根据所执行查询的需求,该抽象可能会实现,也可能不会实现。例如,执行简单投影的查询

/extracted-data/{id}

只需通过无状态Flink管道流式传输每个记录即可执行。

此外,Flink不能在迷你批次上运行-它一次处理一个事件。因此,任何地方都没有物理“表”或部分表。

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

SELECT a,b FROM events

只需要一个计数器,而

SELECT count(*) FROM events

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

就像“正常”一样,SQL接受一个或多个表作为输入,并产生一个表作为输出,流SQL接受一个或多个表作为输入,并产生一个流作为输出。例如,SELECT key,count(*) FROM events GROUP BY key将产生流SELECT count(*) FROM events作为结果。

在YouTube上有一些关于Flink SQL的不错的介绍:https://www.google.com/search?q=flink+sql+hueske+walther,在github上有带有幻灯片和练习的培训材料:https://github.com/ververica/sql-training