Flink Window 和状态维护

Flink Window and State Maintenance

我正在研究用于数据流的 apache flink,我有几个问题。任何帮助是极大的赞赏。谢谢

1)创建翻滚有什么限制windows。例如,如果我想为每个用户 ID 创建一个 2 秒的翻滚 window,假设我有超过 1000 万个用户 ID,那将是一个问题。 (我正在使用 keyBy 用户 ID,然后创建一个 2 秒的 timeWindow)?这些 windows 在 flink 内部是如何维护的?

2) 我查看了循环分区的重新平衡。假设我设置了一个集群,如果我的源并行度为 1,并且如果我进行重新平衡,我的数据是否会跨机器洗牌以提高性能?如果有,是否有特定的端口用于将数据传输到集群中的其他节点?

3)状态维护有什么限制吗?我打算维护一些可能会变得非常大的用户 ID 相关数据。我阅读了有关使用 rocks db 维护状态的 flink。只是想检查是否对可以维护的数据量有任何限制?

4) 另外,如果数据量少,状态在哪里维护? (我猜在 JVM 内存中)如果我的集群上有几台机器,每个节点都可以获得当前状态版本吗?

  1. 如果你在 user 上 keyBy 你的流,Flink 将在内部按用户对流进行分区。因此,用户分布在一组并行的子任务中。 window 运算符的并行度控制每个并行子任务的负载。如果分配足够的机器并适当配置程序的并行性,处理 1000 万用户应该没有问题。

  2. 是的,如果您的作业在多台机器上运行,rebalance() 将通过网络随机播放。使用默认配置,会自动选择数据端口。如果你需要一个固定的端口,你可以使用taskmanager.data.port键来configure它。

  3. 状态大小限制取决于配置的 state backend。对于 RocksDB 状态后端,限制是本地文件系统的大小,即 RocksDB 将数据溢出到磁盘。如果您达到此限制,您可以增加并行度,因为每个工作人员通常处理多个密钥的密钥。

  4. 这取决于持久化状态的状态后端(磁盘或内存)的实现。我假设写入磁盘的 RocksDB 状态后端也会在内存中缓存一些数据。请注意,算子状态不是全局可访问的,即一个算子的每个并行子任务只能访问其自己的本地状态,不能读取或写入同一算子的另一个子任务的状态。