我正在使用基于文件的Streaming和Spark,我想从磁盘中删除旧文件。
我的Spark应用程序非常简单,只需读取文本文件,count()和pprint()。它工作正常。没有窗口或任何东西。
但是,如果批量间隔为5秒,如果我删除文件后说,5分钟后Spark会抱怨丢失文件。
是否与垃圾收集有关?源文件是否需要在DStream中的RDD生命周期内存在?我可以在一定时间间隔后强制我的DStream丢弃RDD。
我应该提到我不使用HDFS,只使用文件系统(已安装NFS)。
答案 0 :(得分:0)
删除文件可能会以两种方式产生问题: -
首先,DStream.clearMetadata(..)
(以及派生类上的方法)负责删除旧的RDD。
DStream
会考虑rememberDuration
- 这是在批处理间隔,minRememberDuration
等计算的。
仅删除相关RDD不再存在的文件似乎是明智的。
其次,在查找新文件的过程中,FileInputDStream
将首先获取目录列表,然后依次查询每个文件的最后修改时间(在findNewFiles(..)
中),以决定是否文件是新的。因此,如果在这两个步骤之间删除文件,即使是旧的 - 第二次检查也会失败 - 因为文件不再存在。
删除旧文件可能会有一段时间 - 但迟早会失败。如果列出新文件所需的时间接近批处理间隔,则失败的可能性越来越大。
作为一种解决方法,可以指定自定义文件过滤器并使用它来根据时间戳拒绝文件 - 但处理文件丢失的情况。 (在文件修改时间的第二次检查之前检查自定义过滤器。)