我正在运行一个简单的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()
有人可以提出一些想法,谢谢?
答案 0 :(得分:0)
我认为原因是FileInputDStream使用修改时间来查找新文件。但是如果文件被移动到目录中,它的修改时间就不会改变,因此FileInputDStream无法检测到这些文件。
解决此问题的一种方法是,您可以使用某种方式来更改修改时间,例如使用“复制”代替“移动”。
答案 1 :(得分:0)
您需要修改代码:
5, word
答案 2 :(得分:0)
我刚遇到类似的问题。
在我的情况下,问题是我在启动StreamingContext
之前复制了文件,但它只选择了在启动后创建的文件。
尝试在启动StreamingContext
后将文件复制到不同的文件夹中,然后将其移动到您扫描的文件夹中。