如何在 jupyter 中显示完整输出不仅是最后一个结果 - 对于 aws emr pyspark
Posted
技术标签:
【中文标题】如何在 jupyter 中显示完整输出不仅是最后一个结果 - 对于 aws emr pyspark【英文标题】:how to display full output in jupyter not only last result - for aws emr pyspark 【发布时间】:2020-08-30 02:36:22 【问题描述】:我希望有与此问题中提到的相同的选项:How to display full output in Jupyter, not only last result?,但适用于 AWS EMR 的 jupyterhub 的 pyspark 内核(Spark 2.4.4)。它适用于 python3 (python3.6) 内核。
如果我使用打印语句,它可以工作,但在这种情况下,如果最后一步失败,它就不起作用,那么它只会显示失败步骤的结果,如下图所示。
另外,需要注意的是,不确定它是否相关,但是,下面的代码不会同步运行,即 print wait print wait....,但是,它只是在最后一次打印所有内容。
import time
for i in range(0,10):
print(i)
time.sleep(2)
只要从被推荐的帖子中添加问题,如果被推荐的问题/帖子被删除或更改。
我希望 Jupyter 打印所有交互式输出而不使用打印,而不仅仅是最后一个结果。怎么办?
例子:
a=3
a
a+1
我想显示
3
4
【问题讨论】:
【参考方案1】:打印语句输出到运行 spark 执行器的计算机上的 stdout
或 stderr
。
考虑到你有一个有 n 个 worker 的大集群(每个存储分区是一个 RDD 或 DataFrame)。很难期望作业中的有序输出(例如地图)。这也可以被认为是 spark 本身的一种设计选择。这些数据将在哪里打印出来?既然节点是并行运行代码的,那么先打印哪一个?
因此,我们在作业中没有交互式打印语句。这些整件事还可以提醒您为什么我们有 accumulators
和 broadcast
变量。
因此,我建议您改用由步骤生成的日志并使用日志。要查看 Amazon S3 中的日志,必须启用集群日志记录(这是新集群的默认设置)。查看Log Files Archived to Amazon S3。
关于sleep()
和print
的第二个问题,python 是行缓冲的,这迫使它在打印到stdout
之前等待换行符。如果输出不是控制台,那么即使换行也不会触发刷新。
您可以强制行为为
import time
for i in range(0,10):
print(i,flush=True)
time.sleep(2)
【讨论】:
在 pyspark 内核中,flush 是如何为您工作的?它是一次打印 1 行还是一次全部打印。对我来说,它一次打印出来。对于第一部分,我知道日志是我们的选择,我们将其用于生产,但对于开发人员来说变得乏味,尤其是在故障排除时,有时您想查看数据并且日志不适合它。我知道 Hue 确实可以正确打印它我们需要的方式,但是,它的 GUI 不如 Jupyter 好,而且当我们忙于打字时它会不断刷新,而且很多时候会丢失更改。附:我会再等一段时间,如果我得到任何其他回复,我会接受这个答案。以上是关于如何在 jupyter 中显示完整输出不仅是最后一个结果 - 对于 aws emr pyspark的主要内容,如果未能解决你的问题,请参考以下文章
在 Jupyter Python Notebook 中显示所有数据框列
如何在运行 IPython 的 Jupyter 中抑制输出?
结合 Jupyter 丰富的显示和 matplotlib 图表