首页 文章

Flink窗口和状态维护

提问于
浏览
3

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

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

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

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

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

1 回答

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

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

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

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

相关问题