如何理解flink中的流表?

ukqbszuj  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(644)

我很难理解flink中的流表。我可以理解hive,将一个固定的静态数据文件Map到一个“表”,但是如何体现一个基于流数据构建的表呢?
例如,每1秒,5个具有相同结构的事件被发送到Kafka流:

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

在它们上面构建的动态表是什么样子的?flink将它们全部消耗并存储在某个地方(内存、本地文件、hdfs等),然后Map到一个表?一旦“transformer”处理完这5个事件,然后清除数据并用5个新事件重新填充“表”?
感谢您的帮助。。。

avwztpqn

avwztpqn1#

这些动态表不一定存在于任何地方——它只是一个抽象,可以具体化,也可以不具体化,这取决于所执行查询的需要。例如,正在执行简单投影的查询 SELECT a, b FROM events 只需通过无状态flink管道流式传输每条记录即可执行。
另外,flink不处理小批量——它一次处理一个事件。所以在任何地方都没有物理的“表”或部分表。
但是有些查询确实需要一些状态,可能很少,例如 SELECT count(*) FROM events 只需要一个计数器 SELECT key, count(*) FROM events GROUP BY key 将使用flink的key partitioned state(切分的键值存储)来持久化每个键的当前计数器。集群中的不同节点将负责处理不同密钥的事件。
正如“普通”sql将一个或多个表作为输入,并生成一个表作为输出一样,streamsql将一个或多个流作为输入,并生成一个流作为输出。例如 SELECT count(*) FROM events 会产生水流 1 2 3 4 5 ... 结果是。
youtube上有一些关于flink sql的好介绍:https://www.google.com/search?q=flink+sql+hueske+walther,并且在github上有带幻灯片和练习的培训材料:https://github.com/ververica/sql-training.

相关问题