【问题标题】:Flink Window and State MaintenanceFlink 窗口和状态维护
【发布时间】:2016-09-22 23:58:03
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


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

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

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

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

    【讨论】:

    • 非常感谢您的回答。我只是有几个后续问题。
    • 如果操作员状态不是全局的,那么可以说我是否想维护子任务本地的先前计算状态,那么有没有办法确保下一个数据进入同一用户id 去同一个子任务?如果不是,那么您是否认为我应该使用集中式缓存来实现这一点,而不是在 flink 中维护状态?
    • 另外我正在尝试找到一种将外部配置更改发送到 flink 的方法。例如,对于每个计算,需要考虑的参数很少。假设添加了一个新参数并且必须考虑新的计算,那么有没有办法将此更改发送到 flink 并具有类似的集中配置状态?
    • 关于你的第一个问题:如果你做keyBy(user),Flink 会对你的数据进行分区,并确保同一个用户的所有记录都去同一个子任务。您应该更喜欢键值状态而不是 Checkpointed 接口。我会在new SO question you opened回答你的第二个问题。
    • 如果我做一个keyBy然后应用一个窗口然后做各种操作,所有的转换都会在同一个子任务上进行吗?此外,如果节点出现故障并且另一个节点之一拾取此数据进行处理,会发生什么情况?只是想更好地了解内部结构。感谢并感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多