有没有办法改变 Spark 中 RDD 的复制因子?

Is there a way to change the replication factor of RDDs in Spark?

据我了解,集群中的RDD中的数据存在多份副本,这样在某个节点出现故障时,程序可以恢复。然而,在失败的可能性可以忽略不计的情况下,在 RDD 中拥有多个数据副本在内存方面的成本很高。那么,我的问题是,Spark中是否有一个参数可以用来降低RDD的复制因子?

首先,请注意 Spark 不会自动缓存所有 RDD,因为应用程序可能会创建许多 RDD,并且并非所有这些都会被重用。您必须对它们调用 .persist().cache()

您可以设置要保留 RDD 的存储级别 myRDD.persist(StorageLevel.MEMORY_AND_DISK).cache().persist(StorageLevel.MEMORY_ONLY) 的 shorthand。

persist 的默认存储级别对于 Java 或 Scala 中的 RDD 确实是 StorageLevel.MEMORY_ONLY – 但如果您正在创建 DStream(请参阅您的 DStream 构造函数 API 文档)。如果您使用 Python,则为 StorageLevel.MEMORY_ONLY_SER

doc details a number of storage levels and what they mean, but they're fundamentally a configuration shorthand to point Spark to an object which extends the StorageLevel class。因此,您可以定义自己的复制因子高达 40。

请注意,在各种预定义的存储级别中,有些只保留 RDD 的单个副本。事实上,所有那些名称后缀没有 _2 的都是如此(NONE 除外):

  • DISK_ONLY
  • MEMORY_ONLY
  • MEMORY_ONLY_SER
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_SER
  • OFF_HEAP

这是他们使用的每个介质一个副本,当然,如果你想要一个整体的副本,你必须选择一个单一的介质存储级别。

正如 huitseeker 所说,除非你特别要求 Spark 持久化一个 RDD 并指定一个使用复制的 StorageLevel,否则它不会有一个 RDD 分区的多个副本。

spark 所做的是保留如何计算特定数据的沿袭,以便 when/if 节点失败时它只会重复处理到达丢失的 RDD 分区所需的相关数据 -根据我的经验,这主要是可行的,尽管有时重新启动作业然后让它恢复会更快