3

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

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

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

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

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

4

1 回答 1

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

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

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

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

于 2016-09-24T18:23:28.680 回答