您好我是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
。
即使我在这个目录中添加文件,我也得到了空洞的结果:/
任何建议的解决方案? 感谢。
答案 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
有人知道这些参数是什么吗?