我有一个涉及一系列不同事件的Kafka主题。每个事件都有一个eventType
和eventTs
。我正在实现一个Flink作业,该作业从Kafka读取这些事件并将它们作为/eventType=XXX/hour=XXX/foo.json.snappy
文件存储在S3中。为此,我使用StreamingFileSink
如果档案的大小超过128M并根据自文件创建以来和上一次活动以来的处理时间滚动文件。
class BatchingCheckpointRollingPolicy[IN, BucketID](val maxSizeBytes: Long,
val inactiveBucketCheckInterval: Long,
val maxIntervalSinceBucketCreationMillis: Long)
extends CheckpointRollingPolicy[IN, BucketID] {
override def shouldRollOnEvent(partFileState: PartFileInfo[BucketID], element: IN): Boolean = {
partFileState.getSize >= maxSizeBytes
}
override def shouldRollOnProcessingTime(partFileState: PartFileInfo[BucketID], currentTime: Long): Boolean = {
(currentTime - partFileState.getLastUpdateTime >= inactiveBucketCheckInterval) ||
currentTime - partFileState.getCreationTime >= maxIntervalSinceBucketCreationMillis
}
}
当我想使用此作业从Kafka中回填数据时(例如,最近7天),或者我从最早的偏移开始作业时,就会出现问题,因为StreamingFileSink
中的触发器基于处理时间,不是事件时间,我打开了很多存储桶(Flink进程记录的速度比刷新速度要快),这会导致OOM错误。每个存储区都有一个CompressionStream
,其中有直接存储中的256K缓冲区。
我在这里想念什么?如何正确设置管道,以便在回填期间正确冲洗桶?