pyspark textFileStreaming在textFile工作时无法检测到txt文件

时间:2019-06-18 06:49:25

标签: apache-spark pyspark spark-streaming

要解释我的问题是不同的:此问题与标记的问题不同。首先,输入参数已经是目录(正确,但是标记的问题是错误的)。其次,我在流式运行期间将txt文件复制到目录中,以模拟新的txt文件到达(因此,将生成新文件,而不是此目录中存在的相同文件)

我的问题在下面


我有一个目录和txt文件/tmp/a.txt,文件中的内容是

aaa
bbb

我使用pyspark并连续不断地手动将此文件复制到同一目录中(在流式运行的同时创建文件)

def count(x):
    if x.isEmpty:
        print("empty")
        return
    print(x.count())

sc = SparkContext()
ssc = StreamingContext(sc, 3)
ssc.textFileStream("/tmp/").foreachRDD(count)

输出显示RDD为空

但是我使用

c = sc.textFile("/tmp/").count()
print(c)

它显示c为2(与txt文件的内容一致)

为什么流媒体不起作用?

2 个答案:

答案 0 :(得分:0)

您是要获取附加到/tmp/a.txt文件的新行还是要获取新文件添加到tmp目录的文件?

如果是后者,请尝试以此替换您的最后一行

ssc.textFileStream("/tmp/*").foreachRDD(count)

答案 1 :(得分:0)

我在scala中找到了解决方案(仍然无法在python中拾取新文件)

首先,sc.textFilesc.textFileStream具有相同的参数,这是目录名称。所以上面的代码是正确的。

但是,区别在于,如果目录存在({目录必须存在,否则目录sc.textFile必须存在),InvalidInputException可以拾取文件,但是以流模式{{1} }(本地文件系统),它要求该目录不存在并由流式程序创建,否则无法拾取新文件(似乎是一个错误,仅存在于本地文件系统中,在HDFS中似乎运行良好根据其他经验)。

此外,从其他一些经验中,他们说如果删除目录并重新运行该程序,则还必须清空回收站。


但是,在python中,此问题仍然存在,并且在目录中不存在文件的情况下,scala程序只会打印sc.textFileStream,而python程序会发出

的警告。
0

这是我在python和scala中的代码,编写新文件的方式是相同的,因此我不在此发布

Python代码:

WARN FileInputDStream:87 - Error finding new files 
java.lang.NullPointerException

标码:

if __name__ == "__main__":
    sc = SparkContext()    
    ssc = StreamingContext(sc, 3)
    ssc.textFileStream(path).foreachRDD(lambda x: print(x.count()))
    ssc.start()
    ssc.awaitTermination()