如何在 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 执行器的计算机上的 stdoutstderr

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

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

因此,我建议您改用由步骤生成的日志并使用日志。要查看 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 中抑制输出?

Python学习Jupyter解决单个变量输出问题

结合 Jupyter 丰富的显示和 matplotlib 图表

如何使用pyspark在jupyter笔记本中显示我的csv数据文件

在 jupyter notebook 中使用 joblib 时不显示打印输出