Apache flink 如何配置Apache Flink';s StreamingFileSink是否使用水印滚动进行中的文件?

Apache flink 如何配置Apache Flink';s StreamingFileSink是否使用水印滚动进行中的文件?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我有一个卡夫卡主题,里面有很多不同的事件。每个事件都有一个eventType和eventTs。我正在实现一个Flink作业,它从Kafka读取这些事件,并将它们作为/eventType=XXX/hour=XXX/foo.json.snappy文件存储在S3中。为了做到这一点,我使用了StreamingFileSink,如果归档文件的大小超过128M,则根据创建文件和上次活动以来的处理时间来滚动文件 class BatchingCheckpointRollingPolicy[IN,BucketID

我有一个卡夫卡主题,里面有很多不同的事件。每个事件都有一个
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 MaxIntervalenceBucketCreationMills:Long)
扩展CheckpointRollingPolicy[IN,BucketID]{
重写def shouldRollOnEvent(partFileState:PartFileInfo[BucketID],元素:IN):布尔={
partFileState.getSize>=maxSizeBytes
}
override def shouldRollOnProcessingTime(partFileState:PartFileInfo[BucketID],currentTime:Long):布尔={
(currentTime-partFileState.getLastUpdateTime>=不活动BucketCheckInterval)||
currentTime-PartFilesState.getCreationTime>=MaxIntervalenceBucketCreationMills
}
}
当我想使用此作业从Kafka回填数据(例如,过去7天)或从最早的偏移量开始作业时,就会出现问题-因为
StreamingFileSink
中的触发器基于处理时间而不是事件时间,我打开了许多存储桶(Flink处理记录的速度比刷新记录的速度快)这会导致OOM错误。每个存储桶都有一个
压缩流
,用直接内存中的256K缓冲区打开


我错过了什么?如何正确设置管道,以便在回填过程中正确冲洗桶?

如果您知道数据来自Kafka,且事件时间顺序不断增加,您能否修改
shouldrollnovent()
,以便在收到新时间桶中的事件时也进行滚动?@kkrugler我该怎么做?下一小时的事件将到达另一个存储桶(下一小时的存储桶),事件吞吐量是多少?例如,如果事件以递增的时间顺序出现,并且您确信每秒都有一个事件,那么您可能会将inactiveBucketCheckInterval减少到大约几秒钟,从而确保存储桶将在本次事件中最后一个事件发生后的几秒钟内关闭。通过这种方式,您可能不会打开太多打开的存储桶。@Mikalailushcytski我同意这可能是一个很好的解决方案,但我的目标是让文件尽可能接近100M,因为我将数据存储在S3中,并在以后将其用于Spark处理。我每小时有约20G的原始输入。@bu99ycr0c0d11e,请指定您有多少RAM,以及内存管理设置是什么?如果您知道数据来自Kafka,并且事件时间顺序在增加,您不能修改
shouldRollonnevent()
当你得到一个新的时间段内的事件时,也可以滚动吗?@kkrugler我该怎么做?下一小时的事件将到达另一个存储桶(下一小时的存储桶),事件吞吐量是多少?例如,如果事件以递增的时间顺序出现,并且您确信每秒都有一个事件,那么您可能会将inactiveBucketCheckInterval减少到大约几秒钟,从而确保存储桶将在本次事件中最后一个事件发生后的几秒钟内关闭。通过这种方式,您可能不会打开太多打开的存储桶。@Mikalailushcytski我同意这可能是一个很好的解决方案,但我的目标是让文件尽可能接近100M,因为我将数据存储在S3中,并在以后将其用于Spark处理。我每小时有约20G的原始输入。@bu99ycr0c0d11e,请指定您有多少RAM,以及内存管理设置是什么?