首页 > 解决方案 > 如何在 jupyter 中显示完整输出不仅是最后一个结果 - 对于 aws emr pyspark

问题描述

我希望有与此问题中提到的相同的选项:如何在 Jupyter 中显示完整输出,而不仅仅是最后一个结果?但是对于 AWS EMR 的 jupyterhub 的 pyspark 内核(Spark 2.4.4)。它适用于 python3 (python3.6) 内核。

如果我使用打印语句,它可以工作,但在这种情况下,如果最后一步失败,它就不起作用,那么它只会显示失败步骤的结果,如下图所示。

pyspark 和 python 内核在同一个 jupyterhub 上的比较

另外,需要注意的是,不确定它是否相关,但是,下面的代码不会同步运行,即打印等待打印等待....,但是,它只是在最后一次打印所有内容。

import time
for i in range(0,10):
    print(i)
    time.sleep(2)

如果引用的问题/帖子被删除或更改,只需从引用的帖子中添加问题。

我希望 Jupyter 打印所有交互式输出而不使用打印,而不仅仅是最后一个结果。怎么做?

例子 :

a=3
a
a+1

我想显示

3
4

标签: amazon-web-servicespysparkipythonjupyteramazon-emr

解决方案


打印语句输出到运行 spark executor 的计算机上stdoutstderr

考虑到您有一个有 n 个工作人员的大集群(RDD 或 DataFrame 的每个存储分区)。很难期望作业中的有序输出(例如地图)。这也可以被认为是 spark 本身的设计选择。这些数据将在哪里打印出来?由于节点是并行运行代码的,它们中的哪一个将首先打印?

因此,我们在作业中没有交互式打印语句。这些整件事也可以提醒你为什么我们有accumulatorsbroadcast变量。

因此,我建议您改用由步骤生成的日志并使用日志。要查看 Amazon S3 中的日志,必须启用集群日志记录(这是新集群的默认设置)。查看存档到 Amazon S3 的日志文件

对于关于sleep()and的第二个问题print,python 是行缓冲的,这迫使它在打印到之前等待换行符stdout。如果输出不是控制台,那么即使换行也不会触发刷新。

您可以强制行为为

import time
for i in range(0,10):
    print(i,flush=True)
    time.sleep(2)

推荐阅读