apache-flink - Flink 窗口和状态维护

标签 apache-flink flink-streaming flink-cep

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

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

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

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

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

最佳答案

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

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

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

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

关于apache-flink - Flink 窗口和状态维护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39650585/

相关文章:

apache-flink - Flink 窗口状态大小和状态管理

apache-flink - Apache 弗林克 : How to query a relational database with the Table API?

hadoop - Apache Flink- “BuckeingSink”类的用法

apache-flink - 是否可以在 KeyedStream (Apache Flink) 中为每个键生成水印?

apache-flink - Flink CsvTableSource 流

java - 如何将 Scala 数据集传递给 Apache Flink 中的 Java 类

google-cloud-platform - 使用 Dataproc 将 Google Pub/Sub 与 Flink Streaming 结合使用的正确方法是什么?

java - Flink Scala - 比较方法违反了它的通用契约

streaming - 为我们的流事件构建实时规则引擎的最佳方法

apache-flink - 动态限制 flink kafka 源