如何配置Apache Flink的StreamingFileSink以使用水印滚动正在进行的文件?

时间:2020-10-19 12:29:22

标签: apache-flink flink-streaming

我有一个涉及一系列不同事件的Kafka主题。每个事件都有一个eventTypeeventTs。我正在实现一个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缓冲区。

我在这里想念什么?如何正确设置管道,以便在回填期间正确冲洗桶?

0 个答案:

没有答案