【问题标题】:Spark save files distributedlySpark 分布式保存文件
【发布时间】:2015-04-13 07:48:01
【问题描述】:

根据Spark documentation

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

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

到目前为止,我一直在使用这种方法;然而,由于它是一个动作(如上所述)而不是一个转换,Spark 需要将数据从每个分区发送到驱动节点,从而减慢了相当多的保存过程。

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

【问题讨论】:

  • 为什么你认为懒惰会影响数据输出?您是否有机会在 shell 中工作?

标签: performance apache-spark distributed-computing


【解决方案1】:

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

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

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

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

【讨论】:

  • 确实,在这种情况下,我一定是误解了懒惰这个词。我理解它是如何工作的 - 如你的例子 - collect(),我认为所有数据都被带回驱动程序(就像调用collect()时发生的那样),而不仅仅是行动。但是,我必须假设大多数操作确实将数据发送回驱动程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 2016-11-11
  • 1970-01-01
  • 2019-06-28
  • 2017-09-29
  • 1970-01-01
  • 2020-09-15
相关资源
最近更新 更多