我很难理解flink中的流表。我可以理解hive,将一个固定的静态数据文件Map到一个“表”,但是如何体现一个基于流数据构建的表呢?
例如,每1秒,5个具有相同结构的事件被发送到Kafka流:
{"num":1, "value": "a"}
{"num":2, "value": "b"}
....
在它们上面构建的动态表是什么样子的?flink将它们全部消耗并存储在某个地方(内存、本地文件、hdfs等),然后Map到一个表?一旦“transformer”处理完这5个事件,然后清除数据并用5个新事件重新填充“表”?
感谢您的帮助。。。
1条答案
按热度按时间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.