我有一个Spark Streaming应用程序,它通过textFileStream
方法扫描声明的目录。我将批量设置为10秒,我正在处理新文件并将其内容连接到更大的拼花文件中。文件直接在声明的目录中下载/创建,这导致我无法绕过的问题。
让我们以下面的场景为例:
目录在大多数时间内都是空的,然后大约100个小文件与流批处理触发器同时出现。 Spark stream创建了70个带有.json
扩展名的文件和30个带有_tmp
的文件(仍在创建/下载中)。这种情况显然会导致我的应用程序崩溃,因为进程尝试使用_tmp
文件,同时将其更改为完全创建/下载的.json
文件。
我试过用以下方法过滤出rdd:
val jsonData = ssc.textFileStream("C:\\foo").filter(!_.endsWith("tmp"))
但它仍然会导致
jsonData.foreachRDD{ rdd=>
/.../
}
处理_tmp文件并抛出no such file as *_tmp
我已经阅读了一些暂存目录,我应该在创建/下载过程完成后从中移动文件,但是复制或移动(为什么会这样?复制操作创建新文件所以......)操作不会触发{{ 1}}和进程忽略这些文件。是否还有其他方法可以过滤掉这些文件并等待它们在处理之前完成?
答案 0 :(得分:0)
实际上,.filter(!_.endsWith("tmp"))
会过滤c:\foo
内的文件内容,这意味着数据默认是逐行的。如果找到以tmp
结尾的行(不是文件名),则将其从流中删除。