如何强制Spark执行代码?

Met*_*est 28 java hadoop scala apache-spark

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

我试图把cache()地图调用,但仍然没有做到这一点.我的map方法实际上将结果上传到HDFS.所以,它并非无用,但Spark认为它是.

eli*_*sah 33

简短回答:

要强制Spark执行转换,您需要获得结果.有时一个简单的count动作就足够了.

TL; DR:

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

RDD支持两种类型的操作:

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

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

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

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

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

结论

要强制Spark执行对map的调用,您需要获得结果.有时一个count动作就足够了.

参考

  • 对于“cache”,您仅使用默认存储级别 MEMORY_ONLY。使用“persist”,您可以指定所需的存储级别。如果您想为 RDD 分配除 MEMORY_ONLY 之外的其他存储级别,请使用“persist” (2认同)
  • 如何使用“take”来触发persist?我用 1.6.1 版做了一个实验,“count”需要比“take”多一个阶段(由shuffle和aggregate组成)。所以我认为使用“采取”行动更有效。 (2认同)
  • @rsmith54 https://spark.apache.org/docs/2.1.1/programming-guide.html#actions 给出了最常见的,并且应该有一个指向文档的链接,以获得您使用的任何语言的详尽列表 (2认同)

zer*_*323 14

Spark 变换只描述了必须要做的事情.要触发执行,您需要执行操作.

在你的情况下,有一个更深层次的问题.如果目标是创建某种副作用,比如在HDFS上存储数据,则使用正确的方法是foreach.它既是一个动作又具有干净的语义.同样重要的是map,它并不意味着参考透明度.