大家好,
我有一个Flink作业,其中有一个S3文件夹作为源,我们一直将数千个小文件(每个文件约1KB)放入该文件夹中,每分钟的速度约为5000个文件。 这是我在Scala中创建该源代码的方式:
val my_input_format = new TextInputFormat(
new org.apache.flink.core.fs.Path(my_path))
my_input_format.setFilesFilter(FilePathFilter.createDefaultFilter())
my_input_format.setNestedFileEnumeration(true)
val my_raw_stream = streamEnv
.readFile(my_input_format,
my_path,
FileProcessingMode.PROCESS_CONTINUOUSLY,
1000)
问题是,如上的1,000ms监视间隔,大约20%的文件丢失了。在Apache Flink仪表板中,在随后的操作员处,我只能看到记录的文件总数的80%(“记录已发送”列)。
如果增加监视间隔,则丢失文件的数量将减少。在5,000ms时,大约占10%,而在30,000ms时,仅丢失约2%。
但是没有记录警告/错误。
由于无法在集群中达到如此高的文件写入速度,因此无法在HDFS中进行模拟。
请有人帮忙。 非常感谢。
答案 0 :(得分:1)
Amazon S3最终为列出目录提供了一致性(请参阅this question)。
监视源在目录中列出文件,并通过记住它们的最大修改时间戳来跟踪处理的文件。由于不能保证S3列表立即一致,因此最大修改时间戳可能会提前,并且可能会丢失时间戳较小的文件。
我认为不能通过增加监视间隔来完全解决问题。取而代之的是,我们需要一个附加参数,以向最大时间戳添加偏移量。如果您可以通过mailing list或打开Jira ticket与Flink社区建立联系,那就太好了。
============更新============
我已按照Fabian的建议实施了更改。就功能而言,它已完成并正在运行。需要花费更多时间来编写适当的单元测试/文档。 My implementation is here