根据Spark documentation


Spark中的所有转换都是惰性的,因为它们不会立即计算出结果。取而代之的是,他们只记得应用于某些基本数据集(例如文件)的转换。仅当动作要求将结果返回给驱动程序时才计算转换。


我目前正在处理一个大型数据集,该数据集一旦处理,就会输出更大的数据量,这些数据需要存储在文本文件中,就像使用命令saveAsTextFile(path)一样。

到目前为止,我一直在使用这种方法。但是,由于这是一个操作(如上所述),而不是转换,因此Spark需要将数据从每个分区发送到驱动程序节点,从而大大降低了保存过程。

我想知道Spark上是否存在任何分布式文件保存方法(类似于saveAsTextFile()),从而使每个执行程序可以自己存储自己的分区。

最佳答案

我认为您误解了将结果发送给驱动程序的含义。 saveAsTextFile不会将数据发送回驱动程序。相反,一旦完成,它将保存的结果发送回驱动程序。即,saveAsTextFile是分布式的。唯一不分发的情况是,只有一个分区,或者在调用saveAsTextFile之前将RDD合并回一个分区。

该文档所指的是将saveAsTextFile(或任何其他“动作”)的结果发送回驱动程序。如果您调用collect(),它将确实将数据发送到驱动程序,但是saveAsTextFile仅在完成后才将成功/失败消息发送回驱动程序。保存本身仍在群集中的许多节点上完成,这就是为什么您最终会得到许多文件的原因-每个分区一个。

IO总是很昂贵。但有时正是由于该摘录中描述的惰性行为,似乎saveAsTextFile甚至更加昂贵。本质上,当调用saveAsTextFile时,Spark可能会在保存之前执行许多或所有先前的操作。那就是懒惰。

如果您设置了Spark UI,则可以更好地了解保存数据的过程中发生的数据(如果尚未执行此操作)。

08-07 18:51