火花-范围,数据框架和内存管理



我很好奇scope是如何与Data Frame和Spark一起工作的。在下面的例子中,我有一个文件列表,每个文件独立加载在一个数据帧中,执行一些操作,然后,我们将dfOutput写入磁盘。

val files = getListOfFiles("outputs/emailsSplit")
for (file <- files){
   val df = sqlContext.read
      .format("com.databricks.spark.csv")
      .option("delimiter","t")          // Delimiter is tab
      .option("parserLib", "UNIVOCITY")  // Parser, which deals better with the email formatting
      .schema(customSchema)              // Schema of the table
      .load(file.toString)                        // Input file

   val dfOutput = df.[stuff happens]
    dfOutput.write.format("com.databricks.spark.csv").mode("overwrite").option("header", "true").save("outputs/sentSplit/sentiment"+file.toString+".csv") 
}
  1. 当循环完成时,for loop中的每个数据帧是否被丢弃,或者它们是否留在内存中?
  2. 如果它们没有被丢弃,在这一点上做内存管理的更好方法是什么?

DataFrame对象很小。但是,它们可以引用Spark执行器上缓存中的数据,也可以引用Spark执行器上的shuffle文件。当DataFrame被垃圾收集时,还会导致在执行器上删除缓存和shuffle文件。

在你的代码中,循环之后没有对dataframe的引用。所以他们是合格的垃圾回收者。垃圾收集通常是对内存压力的响应。如果您担心shuffle文件会填满磁盘,那么触发显式GC来确保删除不再是引用的dataframe的shuffle文件可能是有意义的。

根据您对DataFrame ([stuff happens])的处理,可能没有数据存储在内存中。这是Spark的默认操作模式。如果您只想读取一些数据,转换数据,然后将其写出来,那么这一切都将逐行进行,不会将任何数据存储在内存中。(缓存只在显式请求时发生)

综上所述,我建议您在遇到问题之前不要担心内存管理。

相关内容

  • 没有找到相关文章

最新更新