具有过期事件时间的消息导致Java堆空间OutOfMemory错误

时间:2017-10-02 18:04:33

标签: java apache-flink

我正在运行一个具有正常翻滚事件时间窗口(窗口大小为1小时)的作业。运行足够长时间后,它会抛出一个关于java堆空间不足的错误。现在关于正在处理的数据的事情是,今天中午会发生一条消息,接下来的15k左右将是一周之前(这不是数据预期的总是如何,但它应该以任何一种方式处理)。因此,水印远远超过了下一个15k消息的事件时间,即使有允许的延迟,所以应该丢弃延迟消息。或者至少这是我的想法,因为他们不再在那个窗口。

所以我的问题是这个。 Flink是否维护过期的消息,即使它们没有被窗口使用?或者它只是为了他们的翻滚窗口,还有其他东西或某些属性我应该设置以确保过期的数据不会占用内存?

感谢您的帮助!

修改

DataStream<OutputObject> outputStream = sourceData
    .assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<Record>(Time.minutes(1)) {
        @Override
        public long extractTimestamp(Record record) {
            long eventTimeFromRecord = record.eventTimestamp;

            return eventTimeFromRecord;
        }
    })
    .keyBy("fieldToKeyBy")
    .window(TumblingEventTimeWindows.of(Time.hours(1)))
    .apply(new ApplyFunction());

1 个答案:

答案 0 :(得分:2)

当源具有n的并行性时,则存在n个水印 - 每个并行子任务一个。在Flink作业今天中午收到一条时间戳的消息,然后是一周前的许多事件的情况下,一条消息只会提升其中一个并行任务的水印,而其他n-1个任务仍然会有长.min_value作为他们的水印。因此,那些“迟到”事件只会在其中一个并行窗口运算符中被识别为迟到,而其他n-1个窗口将继续处理这些“迟到”事件。

请注意,如果刚从检查点或保存点恢复,也可能发生这种情况,因为水印未保存在检查点或保存点中。这意味着您不能依赖先前作业的消息流量来使水印更新。