我正在尝试执行spark流应用程序来处理文件数据流以执行字数统计。 我正在阅读的目录来自Windows。如图所示,我使用本地目录,例如" Users / Name / Desktop / Stream"。它不是HDFS。 我创建了一个文件夹作为" Stream"在桌面上。 我启动了Spark Streaming应用程序,之后我将一些文本文件添加到文件夹' Stream'中。但是我的spark应用程序无法读取文件。它始终给出空的结果。 这是我的代码。
//args(0) = local[2]
object WordCount {
def main(args: Array[String]) {
val ssc = new StreamingContext(args(0), "word_count",Seconds(5))
val lines = ssc.textFileStream("Users/name/Desktop/Stream")
val words = lines.flatMap(_.split(" "))
val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)
wordCounts.print()
ssc.start()
ssc.awaitTermination()
}
}
输出:每5秒获取一次空数据
17/05/18 07:35:00 INFO Executor: Running task 0.0 in stage 71.0 (TID 35)
-------------------------------------------
Time: 1495107300000 ms
-------------------------------------------
我尝试将路径设为C:/Users/name/Desktop/Stream
- 仍然是相同的问题和应用程序无法读取文件。
如果我提供错误的目录路径,有人可以指导吗?
答案 0 :(得分:0)
您的代码很好,因此仅问题是使用正确的目录路径。请使用file://
前缀表示将提供file://C:/Users/name/Desktop/Stream
的本地文件系统。
请一步一步确认我们的理解是在同一水平。
执行Spark Streaming应用程序时,请创建目录,使其位于启动应用程序的同一目录中,例如Stream
。一旦您确认应用程序与本地目录一起正常工作,我们将全局修复它以从Windows上的任何目录读取(如果仍然需要)。
请确保您"移动"您的文件作为在受监视目录中创建文件的操作必须是原子的(部分写入会将文件标记为已处理 - 请参阅StreamingContext)。
必须通过"移动"将文件写入受监控的目录。它们来自同一文件系统中的其他位置。
正如您在code中所看到的那样,directory
路径最终会被包裹起来"使用Hadoop的File所以问题在于说服它接受你的路径:
if (_path == null) _path = new Path(directory)