Spark Streaming - textFileStream:Tmp文件错误

时间:2015-12-23 07:29:27

标签: scala file filesystems spark-streaming temporary-files

我有一个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}}和进程忽略这些文件。是否还有其他方法可以过滤掉这些文件并等待它们在处理之前完成?

环境规范

  • Windows 8.1文件系统上的目录,最终将是类似Unix的机器
  • Spark 1.5 for Hadoop 2.6

1 个答案:

答案 0 :(得分:0)

实际上,.filter(!_.endsWith("tmp"))会过滤c:\foo内的文件内容,这意味着数据默认是逐行的。如果找到以tmp结尾的行(不是文件名),则将其从流中删除。