.parallelize(...)在Apache Spark中是一个懒惰的操作吗?

时间:2015-12-27 11:45:16

标签: scala apache-spark

并行化(和其他加载操作)是仅在执行Spark操作时执行还是在遇到它时立即执行?

请参阅spark code

中的 def parallelize

请注意.textFile(...)的不同后果:延迟评估意味着虽然最初可能会保存一些内存,但每次执行操作时都必须读取文本文件并进行更改在文本文件中会影响更改后的所有操作。

4 个答案:

答案 0 :(得分:3)

parallelize被懒散地执行:请参阅引用代码的L726,并且#34; @note Parallelize懒惰地行动。"

只有在您调用操作时才会触发Spark中的执行,例如collectcount

总而言之,Spark:

  1. 转换链由用户API(您)设置,例如parallelize,map,reduce,...
  2. 一旦调用动作,转换链就会被放置"进入Catalyst优化器,进行优化然后执行。

答案 1 :(得分:2)

  

...(以及其他加载操作)

parallelize是懒惰的(正如Martin SenneChandan所述),与SparkContext上定义的标准数据加载操作相同,如textFile。< / p>

DataFrameReader.load和相关方法通常只是部分懒惰。根据上下文,它可能需要元数据访问(JDBC源,Cassandra)甚至完整数据扫描(带模式推断的CSV)。

答案 2 :(得分:1)

  

请注意,这里我们刚刚定义了RDD,数据仍未加载。这意味着如果您去访问此RDD中的数据,它可能会失败。在RDD中创建数据的计算仅在引用数据时完成;例如,它是通过缓存或写出RDD来创建的。

引自link

答案 3 :(得分:1)

不仅parallelize(),所有transformations都是懒惰的。

RDD支持两种类型的操作:transformations,它从现有数据集创建一个新数据集,actions,它在对数据集运行计算后将值返回给驱动程序。

  

Spark中的所有转换都是懒惰的,因为它们不会立即计算结果。相反,他们只记得应用于某些基础数据集(例如文件)的转换。 The transformations are only computed when an action requires a result to be returned to the driver program

请查看此article以了解Scala中的所有transformations

有关详细信息,请查看此documentation