Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么在持久化操作之后触发重复转换?_Scala_Apache Spark_Directed Acyclic Graphs_Persist - Fatal编程技术网

Scala 为什么在持久化操作之后触发重复转换?

Scala 为什么在持久化操作之后触发重复转换?,scala,apache-spark,directed-acyclic-graphs,persist,Scala,Apache Spark,Directed Acyclic Graphs,Persist,我有下一个密码。我正在进行计数以执行持久化操作并修复上面的转换。但我注意到两个不同计数作业调用的DAG和stage第一次持续两次(当我期望在第二次计数调用中调用第二个persist方法时) 以下是整个场景 持久化和缓存也是Spark中的转换。在应用了上述任何一种转换之后,应该使用任何操作将RDD或DF缓存到内存中 其次,缓存或持久化的单位是“分区”。当执行cache或persist时,它将只保存那些可以保存在内存中的分区。无法保存在内存上的剩余分区-一旦遇到任何新操作,将再次执行整个DAG。以

我有下一个密码。我正在进行计数以执行持久化操作并修复上面的转换。但我注意到两个不同计数作业调用的DAG和stage第一次持续两次(当我期望在第二次计数调用中调用第二个persist方法时)


以下是整个场景

持久化和缓存也是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)