有没有办法改变 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 分区所需的相关数据 -根据我的经验,这主要是可行的,尽管有时重新启动作业然后让它恢复会更快
据我了解,集群中的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 分区所需的相关数据 -根据我的经验,这主要是可行的,尽管有时重新启动作业然后让它恢复会更快