Flink窗口和状态维护

时间:2016-09-22 23:58:04

标签: apache-flink flink-streaming flink-cep

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

  1. 如果您在user上键入您的流,Flink将在内部对用户进行分区。因此,用户分布在一组并行子任务中。窗口操作符的并行性控制每个并行子任务的负载。如果您分配足够的计算机并正确配置程序的并行性,那么处理1000万用户应该没问题。

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

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

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

相关问题