据我所知,群集中的RDD中有多个数据副本,因此如果节点出现故障,程序可以恢复。但是,如果失败的可能性可以忽略不计,那么在RDD中拥有多个数据副本将是昂贵的内存方式。所以,我的问题是,Spark中是否有一个参数,可以用来减少RDD的复制因子?
答案 0 :(得分:6)
首先,请注意Spark不会自动缓存您的所有RDD
,因为应用程序可能会创建许多RDD
,并且并非所有这些都可以重复使用。您必须在其上致电.persist()
或.cache()
。
您可以设置要保留RDD
的存储级别
myRDD.persist(StorageLevel.MEMORY_AND_DISK)
。 .cache()
是.persist(StorageLevel.MEMORY_ONLY)
的缩写。
对于Java或Scala中的persist
,StorageLevel.MEMORY_ONLY
的默认存储级别确实为RDD
- 但如果您要创建DStream
,则通常会有所不同(请参阅您的{ {1}}构造函数API doc)。如果你正在使用Python,那就是DStream
。
doc详细说明了许多存储级别及其含义,但它们基本上是将Spark指向扩展StorageLevel
class的对象的配置速记。因此,您可以使用最多40个复制因子来定义自己的。
请注意,在各种预定义存储级别中,有些会保留StorageLevel.MEMORY_ONLY_SER
的单个副本。事实上,所有那些名字都不加RDD
后缀的人都是如此(_2
除外):
他们使用的每种媒体只有一份副本,当然,如果你想要一个整体的副本,你必须选择一个中等的存储级别。
答案 1 :(得分:1)
正如huitseeker所说,除非您明确要求Spark持久保存RDD并指定使用复制的StorageLevel,否则它将不会有RDD分区的多个副本。
火花的作用是保持一个特定数据的计算方式,以便当节点失败时它只重复处理丢失的RDD分区所需的相关数据 - 根据我的经验虽然有时候工作很快就重新开始工作然后让它恢复