当代码运行 Pyspark 时,EMR 上的 Jupyter 笔记本不打印输出

时间:2021-05-14 15:34:55

标签: python pyspark jupyter-notebook amazon-emr

我正在 Jupyter pyspark 笔记本中运行一个非常非常简单的脚本,但它在运行时不会打印结果,它只是在完成后吐出输出。代码如下:

import time
import sys

for i in range(10):
    print(i)
    time.sleep(1)

这会等待 10 秒然后打印:

0
1
2
3
4
5
6
7
8
9

我想在结果发生时打印出来。我试图用

冲洗它们
for i in range(10):
    print(i)
    sys.stdout.flush()

print(i, flush=True) 无济于事。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

根据您在做什么,如果您正在运行 pyspark 代码并希望在工作完成之前看到结果,这可能不起作用。

您可能会遇到 spark/pyspark 如何运行代码的问题。 Spark 旨在有效地将您的任务划分为多个部分,并将这些部分分发到您的 EMR 集群的节点。

这意味着实际工作不会在运行笔记本的机器上发生。运行笔记本的主节点将任务发送到所有工作节点,然后在返回结果时收集结果,并且仅在作业完成后才显示它们。对于习惯于调试普通 Python 的人来说,这可能会很麻烦,但这是 pyspark 在处理大量数据时如此快速的重要原因。

答案 1 :(得分:0)

这是一个缓冲问题。您还可以使用 python -u 命令或设置 PYTHONUNBUFFERED envvar。如果以交互方式(在终端中)运行,python 使用行缓冲,如果输出被重定向,则使用块缓冲(例如,~4K 字节的缓冲区)