Apache flink 弗林克窗口与状态维护

Apache flink 弗林克窗口与状态维护,apache-flink,flink-streaming,flink-cep,Apache Flink,Flink Streaming,Flink Cep,我正在为数据流开发ApacheFlink,我没有什么问题。非常感谢您的帮助。谢谢 1) 创建翻滚窗口是否有任何限制。例如,如果我想为每个用户id创建一个翻滚窗口,持续2秒,假设我的用户id超过1000万,这将是一个问题。(我正在使用keyBy用户id,然后创建一个2秒的时间窗口)?这些窗口在flink内部是如何维护的 2) 我研究了循环分区的再平衡。假设我设置了一个集群,如果我的源代码的并行度为1,并且如果我进行了重新平衡,我的数据是否会在不同的机器之间进行洗牌以提高性能?如果有,是否有特定的端

我正在为数据流开发ApacheFlink,我没有什么问题。非常感谢您的帮助。谢谢

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

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

3) 州维护是否有任何限制?我计划维护一些与用户id相关的数据,这些数据可能会变得非常庞大。我读到弗林克用岩石数据库来维持这个状态。只是想检查在维护多少数据方面是否存在任何限制

4) 此外,如果数据量较少,状态在哪里保持?(我猜是在JVM内存中)如果集群上有多台机器,每个节点都能获得当前状态版本吗

  • 如果您在
    user
    上键入流,Flink将按用户对流进行内部分区。因此,用户分布在一组并行子任务中。窗口操作符的并行性控制每个并行子任务上的负载。如果您分配了足够的机器并适当地配置了程序的并行性,那么处理1000万用户应该不会有问题

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

  • 状态大小限制取决于配置的。对于RocksDB状态后端,限制是本地文件系统的大小,即RocksDB将数据溢出到磁盘。如果达到此限制,则可以提高并行性,因为每个工作进程通常处理多个键中的键

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


  • 谢谢你的回答。我只是有几个后续问题。如果运算符状态不是全局的,那么让我们说,如果我想保持子任务本地的上一个计算状态,那么有没有办法确保相同用户id的下一个数据进入相同的子任务?如果不是的话,你认为我应该使用一个集中式缓存来实现这一点,而不是在flink中维护状态吗?同时,我正在试图找到一种方法来向flink发送外部配置更改。例如,对于每次计算,需要考虑的参数很少。假设添加了一个新的参数,并且必须考虑新的计算,那么有没有办法将此更改发送给flink并具有类似集中式的配置状态?关于您的第一个问题:如果您执行
    keyBy(user)
    ,flink将对您的数据进行分区,并确保同一用户的所有记录都转到同一个子任务。与检查点接口相比,您应该更喜欢键值状态。我将回答关于的第二个问题。如果我执行一个keyBy,然后应用一个窗口,然后执行各种操作,那么所有转换是否都将在同一个子任务上执行?另外,如果该节点发生故障,而另一个节点中的一个拿起该数据进行处理,会发生什么情况?只是想更好地理解内部结构。谢谢你的帮助。