Apache Flink-s3文件夹监视-缺少许多文件

时间:2018-07-23 07:38:10

标签: amazon-s3 apache-flink

大家好,

我有一个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中进行模拟。

请有人帮忙。 非常感谢。

1 个答案:

答案 0 :(得分:1)

Amazon S3最终为列出目录提供了一致性(请参阅this question)。

监视源在目录中列出文件,并通过记住它们的最大修改时间戳来跟踪处理的文件。由于不能保证S3列表立即一致,因此最大修改时间戳可能会提前,并且可能会丢失时间戳较小的文件。

我认为不能通过增加监视间隔来完全解决问题。取而代之的是,我们需要一个附加参数,以向最大时间戳添加偏移量。如果您可以通过mailing list或打开Jira ticket与Flink社区建立联系,那就太好了。

============更新============

我已按照Fabian的建议实施了更改。就功能而言,它已完成并正在运行。需要花费更多时间来编写适当的单元测试/文档。 My implementation is here