Performance Spark分布式保存文件

Performance Spark分布式保存文件,performance,apache-spark,distributed-computing,Performance,Apache Spark,Distributed Computing,据报道, Spark中的所有转换都是惰性的,因为它们不会立即计算结果。相反,他们只记得应用于某些基本数据集(例如文件)的转换。仅当操作需要将结果返回到驱动程序时,才会计算转换 我目前正在处理一个大型数据集,该数据集一经处理,输出的数据量甚至更大,需要存储在文本文件中,就像使用命令saveAsTextFile(path)所做的那样 到目前为止,我一直在使用这种方法;但是,由于它是一个操作(如上所述),而不是一个转换,Spark需要将数据从每个分区发送到驱动程序节点,从而大大降低了保存过程的速度 我

据报道,

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

我目前正在处理一个大型数据集,该数据集一经处理,输出的数据量甚至更大,需要存储在文本文件中,就像使用命令
saveAsTextFile(path)
所做的那样

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


我想知道Spark上是否存在任何分布式文件保存方法(类似于
saveAsTextFile()
),使每个执行器都能够自己存储自己的分区。

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

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

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


如果您设置了Spark UI,它可以让您更好地了解数据在保存过程中发生了什么(如果您还没有这样做)。

为什么您认为懒惰会影响数据输出?你是不是碰巧在壳牌工作?事实上,在这种情况下,我一定是误解了懒惰这个词。我理解它在以下情况下是如何工作的-如您的示例中-
collect()
,我认为所有数据都被带回驱动程序(就像调用
collect()
)时发生的情况),而不仅仅是操作的结果。但是,我必须假设大多数操作确实会将数据发送回驱动程序。