如何强制 Spark 执行代码?

2022-09-01 07:34:08

我如何强制Spark执行对map的调用,即使它认为由于延迟评估而不需要执行?

我试图放地图调用,但这仍然没有解决问题。我的地图方法实际上将结果上传到HDFS。所以,它不是无用的,但Spark认为它是。cache()


答案 1

简短的回答:

若要强制 Spark 执行转换,需要需要一个结果。有时,简单的操作就足够了。count

TL;DR:

好的,让我们回顾一下RDD操作

RDDs 支持两种类型的操作:

  • 转换 - 从现有数据集创建新数据集。
  • actions - 在对数据集运行计算后向驱动程序返回值。

例如,是一种转换,它通过函数传递每个数据集元素,并返回表示结果的新 RDD。另一方面,是一个使用某些函数聚合RDD的所有元素并将最终结果返回给驱动程序的操作(尽管还有一个并行返回分布式数据集)。mapreducereduceByKey

Spark中的所有转换都是懒惰的,因为它们不会立即计算结果

相反,它们只记得应用于某些基本数据集(例如文件)的转换。仅当操作需要将结果返回到驱动程序时,才会计算转换。这种设计使Spark能够更有效地运行 - 例如,我们可以意识到通过map创建的数据集将用于reduce,并且仅将reduce的结果返回给驱动程序,而不是更大的map数据集。

默认情况下,每次对其运行操作时,都可以重新计算每个转换后的内容。但是,您也可以使用 (or ) 方法将 内存中保留,在这种情况下,Spark 会将元素保留在集群上,以便在您下次查询它时更快地访问它。还支持将 s 保留在磁盘上,或跨多个节点复制。RDDRDDpersistcacheRDD

结论

若要强制 Spark 执行对映射的调用,需要一个结果。有时一个动作就足够了。count

参考


答案 2

Spark转换仅描述必须执行的操作。要触发执行,您需要一个操作

在你的情况下,有一个更深层次的问题。如果目标是产生某种副作用,例如在HDFS上存储数据,那么正确的方法是 。它既是一个动作,又具有干净的语义。同样重要的是,与 不同,它并不意味着参照的透明度。foreachmap


推荐