Scala 为什么在持久化操作之后触发重复转换?
我有下一个密码。我正在进行计数以执行持久化操作并修复上面的转换。但我注意到两个不同计数作业调用的DAG和stage第一次持续两次(当我期望在第二次计数调用中调用第二个persist方法时)Scala 为什么在持久化操作之后触发重复转换?,scala,apache-spark,directed-acyclic-graphs,persist,Scala,Apache Spark,Directed Acyclic Graphs,Persist,我有下一个密码。我正在进行计数以执行持久化操作并修复上面的转换。但我注意到两个不同计数作业调用的DAG和stage第一次持续两次(当我期望在第二次计数调用中调用第二个persist方法时) 以下是整个场景 持久化和缓存也是Spark中的转换。在应用了上述任何一种转换之后,应该使用任何操作将RDD或DF缓存到内存中 其次,缓存或持久化的单位是“分区”。当执行cache或persist时,它将只保存那些可以保存在内存中的分区。无法保存在内存上的剩余分区-一旦遇到任何新操作,将再次执行整个DAG。以
以下是整个场景 持久化和缓存也是Spark中的转换。在应用了上述任何一种转换之后,应该使用任何操作将RDD或DF缓存到内存中
其次,缓存或持久化的单位是“分区”。当执行cache或persist时,它将只保存那些可以保存在内存中的分区。无法保存在内存上的剩余分区-一旦遇到任何新操作,将再次执行整个DAG。以下是整个场景 持久化和缓存也是Spark中的转换。在应用了上述任何一种转换之后,应该使用任何操作将RDD或DF缓存到内存中
其次,缓存或持久化的单位是“分区”。当执行cache或persist时,它将只保存那些可以保存在内存中的分区。无法保存在内存上的剩余分区-一旦遇到任何新操作,将再次执行整个DAG。当您说StorageLevel.memory\u和\u DISK spark时,它会尝试将所有数据放入内存,如果不适合,则会溢出到磁盘 现在您正在这里执行多个持久化操作。在spark中,内存缓存是LRU,因此后者将覆盖先前缓存的数据 即使您指定了
StorageLevel.MEMORY\u和\u DISK
,当数据被另一个缓存数据从缓存中移出时,spark也不会将其溢出到磁盘。因此,当您进行下一次计数时,需要重新评估DAG,以便它能够检索缓存中不存在的分区
我建议您使用StorageLevel.DISK\u只是为了避免这种重新计算。当您说StorageLevel.MEMORY\u和\u DISK spark时,会尝试将所有数据放入内存,如果不适合,则会溢出到磁盘 现在您正在这里执行多个持久化操作。在spark中,内存缓存是LRU,因此后者将覆盖先前缓存的数据 即使您指定了
StorageLevel.MEMORY\u和\u DISK
,当数据被另一个缓存数据从缓存中移出时,spark也不会将其溢出到磁盘。因此,当您进行下一次计数时,需要重新评估DAG,以便它能够检索缓存中不存在的分区
我建议您使用StorageLevel.DISK\u只是为了避免这种重新计算。试试看
val df = sparkSession.read
.parquet(bigData)
.filter(row => dateRange(row.getLong(5), lowerTimeBound, upperTimeBound))
.as[SafegraphRawData]
// So repartition here to be able perform shuffle operations later
// another transformations and minor filtration
.repartition(nrInputPartitions)
// Firstly persist here since objects not fit in memory (Persist 67)
df.persist(StorageLevel.MEMORY_AND_DISK)
试一试
拥有StorageLevel.MEMORY\u和磁盘并不意味着SPARK可以持久化所有内容(内存中和不适合磁盘的内容?)。那么,在这种特殊情况下,我们为什么期望重新执行DAG?在这里,我还使用action Count执行持久化。所以这就是为什么我不明白为什么要执行两次。存储空间和操作这两个点都需要满足。我错在哪里?拥有StorageLevel.MEMORY\u和\u磁盘并不能让SPARK持久化所有内容(在内存中以及不适合磁盘的内容?)。那么,在这种特殊情况下,我们为什么期望重新执行DAG?在这里,我还使用action Count执行持久化。所以这就是为什么我不明白为什么要执行两次。存储空间和操作这两个点都需要满足。我错在哪里?谢谢,顺便问一下,只有磁盘和只有磁盘的区别是什么?磁盘只在磁盘上保留缓存数据的一个副本。DISK_ONLY_2将数据复制两次,这样即使其中一个副本丢失,也可以从另一个副本中提取数据。DISK_ONLY_2有点贵,所以除非您绝对需要,否则我建议不要使用它谢谢,顺便问一下,DISK_ONLY和DISK_ONLY_2之间有什么区别?DISK_只在磁盘上保留缓存数据的一个副本。DISK_ONLY_2将数据复制两次,这样即使其中一个副本丢失,也可以从另一个副本中提取数据。仅磁盘__2有点贵,所以除非您绝对需要,否则我建议不要在没有任何解释的情况下使用它,这几乎没有什么帮助。堆栈溢出是关于学习,而不是提供盲目复制和粘贴的代码片段。请编辑您的问题并解释它如何回答所问的特定问题。请参阅。没有任何解释的代码很少有帮助。堆栈溢出是关于学习,而不是提供盲目复制和粘贴的代码片段。请编辑您的问题并解释它如何回答所问的特定问题。看见
val df = sparkSession.read
.parquet(bigData)
.filter(row => dateRange(row.getLong(5), lowerTimeBound, upperTimeBound))
.as[SafegraphRawData]
// So repartition here to be able perform shuffle operations later
// another transformations and minor filtration
.repartition(nrInputPartitions)
// Firstly persist here since objects not fit in memory (Persist 67)
df.persist(StorageLevel.MEMORY_AND_DISK)