【发布时间】:2017-01-20 05:14:10
【问题描述】:
我们使用带有自定义 KeyedCombineFn 的 Combine.PerKey 对几个 PCollection 执行连接。在 AfterProcessingTime.pastFirstElementInPane 上使用 Repeatedly.forever 触发器将 PCollections 分配给 GlobalWindow。
PCollections 包含大约 1M 个键,但对于给定的键只有几百个元素。 KeyedCombineFn 在其累加器中保留大约几 KB(有时高达 5 MB)的数据。
现在我们已经增加了在管道中处理的数据量,我们看到了 java.lang.OutOfMemoryError: Java heap space error。该管道在 Google Cloud Dataflow 上的 n1-highmem-4 机器上运行。
我们的假设是,Dataflow 工作人员独立管理每个键的状态,并根据可用 RAM 的大小,采用启发式方法将其写入/加载到磁盘或从磁盘加载。因此,目标是让单个状态适合一个工人的记忆。
这个假设正确吗?如果是这样,为什么我们会看到 OOM 错误?如果没有,您介意详细说明 Dataflow 工作人员如何管理内存中的状态吗?
【问题讨论】: