如何强制spark执行代码?

6yoyoihd  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(387)

我如何强制spark执行对map的调用,即使它认为由于其懒惰的求值而不需要执行它呢?
我试着 cache() 但这仍然不起作用。我的map方法实际上是将结果上传到hdfs。所以,它不是无用的,但spark认为它是无用的。

b0zn9rqh

b0zn9rqh1#

简短回答:
要强制spark执行转换,您需要一个结果。有时一个简单的 count 行动就足够了。
热释光;博士:
好的,让我们回顾一下 RDD 操作。 RDD s支持两种类型的操作:
转换-从现有数据集创建新数据集。
操作—在数据集上运行计算后,向驱动程序返回值。
例如, map 是一种转换,它通过一个函数传递每个数据集元素,并返回一个表示结果的新rdd。另一方面, reduce 是一个操作,它使用某个函数聚合rdd的所有元素,并将最终结果返回给驱动程序(尽管也有一个并行的 reduceByKey 返回一个分布式数据集)。
spark中的所有转换都是懒惰的,因为它们不会立即计算结果。
相反,他们只记得应用于一些基本数据集(例如文件)的转换。仅当操作需要将结果返回到驱动程序时,才计算转换。这种设计使spark能够更有效地运行–例如,我们可以意识到通过map创建的数据集将用于reduce,并且只将reduce的结果返回给驱动程序,而不是更大的Map数据集。
默认情况下,每个 RDD 每次对其运行操作时都可能重新计算。但是,你也可以坚持 RDD 在内存中使用 persist (或 cache )方法,在这种情况下,spark将保留集群中的元素,以便下次查询时更快地访问它。还有对持久化的支持 RDD 或跨多个节点复制。

结论

要强制spark执行对map的调用,您需要一个结果。有时 count 行动就足够了。

参考

spark编程指南。

gev0vcfq

gev0vcfq2#

spark变换只描述了必须做的事情。要触发执行,你需要一个动作。
你的情况有一个更深层次的问题。如果目标是产生某种副作用,比如在hdfs上存储数据,那么正确的方法是 foreach . 它既是一个动作,又有清晰的语义。什么也是重要的,不像 map ,这并不意味着引用透明。

相关问题