使用基于文件的流媒体时何时删除文件是否安全?

时间:2018-04-27 08:35:14

标签: apache-spark spark-streaming

我正在使用基于文件的Streaming和Spark,我想从磁盘中删除旧文件。

我的Spark应用程序非常简单,只需读取文本文件,count()和pprint()。它工作正常。没有窗口或任何东西。

但是,如果批量间隔为5秒,如果我删除文件后说,5分钟后Spark会抱怨丢失文件。

是否与垃圾收集有关?源文件是否需要在DStream中的RDD生命周期内存在?我可以在一定时间间隔后强制我的DStream丢弃RDD。

我应该提到我不使用HDFS,只使用文件系统(已安装NFS)。

1 个答案:

答案 0 :(得分:0)

删除文件可能会以两种方式产生问题: -

首先,DStream.clearMetadata(..)(以及派生类上的方法)负责删除旧的RDD。

DStream会考虑rememberDuration - 这是在批处理间隔,minRememberDuration等计算的。

仅删除相关RDD不再存在的文件似乎是明智的。

其次,在查找新文件的过程中,FileInputDStream将首先获取目录列表,然后依次查询每个文件的最后修改时间(在findNewFiles(..)中),以决定是否文件是新的。因此,如果在这两个步骤之间删除文件,即使是旧的 - 第二次检查也会失败 - 因为文件不再存在。

删除旧文件可能会有一段时间 - 但迟早会失败。如果列出新文件所需的时间接近批处理间隔,则失败的可能性越来越大。

作为一种解决方法,可以指定自定义文件过滤器并使用它来根据时间戳拒绝文件 - 但处理文件丢失的情况。 (在文件修改时间的第二次检查之前检查自定义过滤器。)