2016-09-22 69 views
2

我正在处理数据流的apache flink,我有几个问题。任何帮助是极大的赞赏。谢谢。Flink窗口和状态维护

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

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

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

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

回答

2
  1. 如果keyBy您的user流,弗林克将在内部用户划分流。因此,用户分布在一组平行的子任务中。窗口操作符的并行性控制每个并行子任务的负载。如果分配足够的机器并适当配置程序的并行性,处理1000万用户应该没有问题。

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

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

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

+0

非常感谢您的回答。我只是有一些后续问题。 – Neoster

+0

如果运算符状态不是全局的,那么可以说,如果我想维护一个子任务本地的以前的计算状态,那么有没有办法确保下一个数据进入同一个用户id进入同一个子任务?如果没有,那么你是否应该使用集中式缓存来实现这一目标,而不是维护flink中的状态? – Neoster

+0

另外我试图找到一种方法将外部配置更改发送到flink。例如,对于每个计算,都有很少的参数需要考虑。比方说,一个新的参数被添加,必须考虑新的计算,那么有没有办法将这个改变发送到flink并且具有集中配置状态? – Neoster