【发布时间】:2019-01-04 22:03:56
【问题描述】:
我正在阅读有关如何在 Spark 中打印 RDD(我正在使用 Java)的信息,似乎大多数人只是 collect()(如果 RDD 足够小)并使用 forall(println) 或类似的东西.不能并行打印吗?为什么我们必须将数据收集到驱动节点上才能打印?
我在想也许是因为我们不能并行使用 System.out,但我觉得不是这样。此外,就代码而言,我不太确定如何分配数据并并行打印。我想到的一种方法是做一个 mappartitions,它在映射方面没有做任何有用的事情,但它会遍历分区并打印其内容。
【问题讨论】:
-
这是关于你想在哪里看到输出。您可以在工作人员上打印,但这会将输出留在工作人员上(可能在日志文件中)。但您通常希望在驱动程序机器上查看输出。
-
啊,我明白了,这是有道理的。如果我想以分布式方式进行(所以在工作日志中打印),是否只需遍历 RDD 并打印就足够了?我问这个是因为我想做一些有类似动机的事情;我试图在我的每个工作节点内(因此在分区内)将我的 RDD 的元素一起批处理,不太确定如何处理这个问题。
-
嗨@ernest_k 我想知道它是否只是关于打印,因为如果是这样,那么如何在笔记本中看到 select() 的输出,
select()是否在内部调用collect()? -
@AnkitAgrawal 我相信笔记本会隐式打印。在这种情况下,他们确实会向司机收集数据。我猜测是因为我没有使用打印数据的笔记本(而不是数据框或 rdd 对象的字符串)。关键是
print可以在具有本地数据的工作人员或具有收集数据的驱动程序上运行,具体取决于调用方式/位置。而在笔记本运行select后显示数据的情况下,数据会被收集到驱动程序中。 -
@ernest_k
And in the case of the notebook showing data after running select, the data is collected to the driver.所以你的意思是select()确实在内部调用collect()或者对于worker 上的任何其他语句都是如此?
标签: java apache-spark parallel-processing rdd