Spark流不会读取从HDFS移动到HDFS的文件

时间:2015-10-28 06:27:48

标签: scala apache-spark spark-streaming

我正在运行一个简单的WordCount程序。 Spark Streaming正在HDFS中查看新文件中的目录,并应在它们进入时对其进行处理。

我开始我的流媒体工作,我将一堆小文件添加到 tmp HDFS目录,然后我将这些文件移动到监视的HDFS目录(所有这些都使用简单的shell命令, - MV )。但我的流媒体作业并没有将这些文件识别为新文件,因此没有对它们进行处理(我检查过文件移动得很好)。

目前我正在使用textFileStream,但我愿意使用fileStream。我正在使用1.3.1或1.4.0 Spark版本。 我想提一下,使用1.0.x版本的spark,一切都很好(它会检测到新的文件)!

代码是:

//files are moved from /user/share/jobs-data/gstream/tmp to /user/share/jobs-data/gstream/streams, both directories are on HDFS.

val sparkConf = new SparkConf().setAppName(this.getClass().getName())
sparkConf.setMaster(master)
val sc = new SparkContext(sparkConf)
val ssc = new StreamingContext(sc, Milliseconds(1000))
val data = ssc.textFileStream(args(1)) //args(1) == /user/share/jobs-data/gstream/streams
val words = data.flatMap(.split(" "))
val wordCounts = words.map(word => (word, 1)).reduceByKey( + _)
wordCounts.print()
ssc.start()
ssc.awaitTermination()

有人可以提出一些想法,谢谢?

3 个答案:

答案 0 :(得分:0)

我认为原因是FileInputDStream使用修改时间来查找新文件。但是如果文件被移动到目录中,它的修改时间就不会改变,因此FileInputDStream无法检测到这些文件。

解决此问题的一种方法是,您可以使用某种方式来更改修改时间,例如使用“复制”代替“移动”。

答案 1 :(得分:0)

您需要修改代码:

5,   word

答案 2 :(得分:0)

我刚遇到类似的问题。

在我的情况下,问题是我在启动StreamingContext之前复制了文件,但它只选择了启动后创建的文件。

尝试在启动StreamingContext后将文件复制到不同的文件夹中,然后将其移动到您扫描的文件夹中。