Python Spark Streaming 只运行一次
Python Spark Streaming only runs once
我一直在使用 Python 开发一些 Spark Streaming,特别是 textFileStream,我注意到一个有点奇怪的行为。我想知道是否有人可以帮我解释一下。
我目前的代码设置如下:
def fileName(data):
debug = data.toDebugString()
pattern = re.compile("file:/.*\.txt")
files = pattern.findall(debug)
return files
if __name__ == "__main__":
sc = SparkContext(appName="PythonStreamingFileNamePrinter")
ssc = StreamingContext(sc, 1)
lines = ssc.textFileStream("file:///test/input/")
files = lines.foreachRDD(fileName)
print(files)
ssc.start()
ssc.awaitTermination()
fileName 函数简单地从调试流中获取正在处理的文件的名称 ()。然而,这段代码只运行一次,只打印一次文件。当我修改函数如下:
def fileName(data):
debug = data.toDebugString()
pattern = re.compile("file:/.*\.txt")
files = pattern.findall(debug)
print(files);
它按预期每秒检查一次目录。似乎 'loops' 的唯一代码在 foreachRDD 中。
我这个假设是否正确,所有处理(包括循环、条件等)都必须在映射函数等内部发生?
谢谢,
M
一个 DStream 由许多随时间构建的 rdds 组成。
lines 是一个 DStream。
当您对行执行 foreachRDD 时,流中的每个 rdd 都会转换为字符串。所以当你打印它时,你会得到一个字符串列表,代表流中的所有 rdds。意思是,这发生了 "At the end of the stream".
当您在 fileName 函数中打印字符串时,您是在处理流中的每个 rdd 时执行此操作。所以你在流 运行.
时得到它
此外,正如我在您之前的问题中向您提到的,这里不需要foreachRDD。它不是 "The spark stream way" 满足这种特定需求,也许这就是它让您感到困惑的原因。
这里更直接的方法是在 DStream 本身上使用映射(这将影响其中的所有 rdd),然后使用 pprint。
请记住,与常规 rdd 不同,您不能只在流中收集(或任何类似的)rdd 并 return 结果,而流是 运行。您需要对该数据执行某些操作,将其保存到某个外部源(如果需要)或将其作为整个流状态的一部分进行处理。
我一直在使用 Python 开发一些 Spark Streaming,特别是 textFileStream,我注意到一个有点奇怪的行为。我想知道是否有人可以帮我解释一下。
我目前的代码设置如下:
def fileName(data):
debug = data.toDebugString()
pattern = re.compile("file:/.*\.txt")
files = pattern.findall(debug)
return files
if __name__ == "__main__":
sc = SparkContext(appName="PythonStreamingFileNamePrinter")
ssc = StreamingContext(sc, 1)
lines = ssc.textFileStream("file:///test/input/")
files = lines.foreachRDD(fileName)
print(files)
ssc.start()
ssc.awaitTermination()
fileName 函数简单地从调试流中获取正在处理的文件的名称 (
def fileName(data):
debug = data.toDebugString()
pattern = re.compile("file:/.*\.txt")
files = pattern.findall(debug)
print(files);
它按预期每秒检查一次目录。似乎 'loops' 的唯一代码在 foreachRDD 中。
我这个假设是否正确,所有处理(包括循环、条件等)都必须在映射函数等内部发生?
谢谢, M
一个 DStream 由许多随时间构建的 rdds 组成。 lines 是一个 DStream。
当您对行执行 foreachRDD 时,流中的每个 rdd 都会转换为字符串。所以当你打印它时,你会得到一个字符串列表,代表流中的所有 rdds。意思是,这发生了 "At the end of the stream".
当您在 fileName 函数中打印字符串时,您是在处理流中的每个 rdd 时执行此操作。所以你在流 运行.
时得到它此外,正如我在您之前的问题中向您提到的,这里不需要foreachRDD。它不是 "The spark stream way" 满足这种特定需求,也许这就是它让您感到困惑的原因。
这里更直接的方法是在 DStream 本身上使用映射(这将影响其中的所有 rdd),然后使用 pprint。
请记住,与常规 rdd 不同,您不能只在流中收集(或任何类似的)rdd 并 return 结果,而流是 运行。您需要对该数据执行某些操作,将其保存到某个外部源(如果需要)或将其作为整个流状态的一部分进行处理。