Pyspark - FileInputDStream:找到新文件时出错

时间:2016-12-27 02:41:29

标签: apache-spark pyspark spark-streaming

您好我是Python Spark的新手,我从Spark github尝试这个示例,以便计算在给定目录中创建的新文本文件中的单词:

import sys

from pyspark import SparkContext
from pyspark.streaming import StreamingContext

if __name__ == "__main__":
if len(sys.argv) != 2:
    print("Usage: hdfs_wordcount.py <directory>", file=sys.stderr)
    exit(-1)

sc = SparkContext(appName="PythonStreamingHDFSWordCount")
ssc = StreamingContext(sc, 1)

lines = ssc.textFileStream("hdfs:///home/my-logs/")
counts = lines.flatMap(lambda line: line.split(" "))\
              .map(lambda x: (x, 1))\
              .reduceByKey(lambda a, b: a+b)
counts.pprint()

ssc.start()
ssc.awaitTermination()

这就是我得到的: a warning saying : WARN FileInputDStream: Error finding new files

警告信息:WARN FileInputDStream: Error finding new files

即使我在这个目录中添加文件,我也得到了空洞的结果:/

任何建议的解决方案? 感谢。

3 个答案:

答案 0 :(得分:1)

问题是火花流将不会从目录中读取旧文件。因为所有日志文件都在流作业开始之前存在 因此,一旦开始流式传输工作,您需要做什么,然后手动或通过脚本将输入文件放置/复制到hdfs目录中。

答案 1 :(得分:0)

我认为你指的是this例子。您是否能够在不修改的情况下运行它,因为我看到您正在将目录设置为&#34; hdfs:///&#34;在节目?您可以运行如下示例。

例如Spark位于/opt/spark-2.0.2-bin-hadoop2.7。您可以在示例目录中运行hdfs_wordcount.py,如下所示。我们使用/tmp作为目录作为参数传递给程序。

user1@user1:/opt/spark-2.0.2-bin-hadoop2.7$ bin/spark-submit examples/src/main/python/streaming/hdfs_wordcount.py /tmp

现在,当此程序运行时,打开另一个终端并将一些文件复制到/tmp文件夹

user1@user1:~$ cp test.txt /tmp

您将在第一个终端看到单词count。

答案 2 :(得分:0)

<强>解决!

问题是构建,我根据来自 github 的自述文件使用maven进行构建:

build/mvn -DskipTests clean package

我根据他们的documentation建立了这种方式:

build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests clean package

有人知道这些参数是什么吗?