Spark - 范围,数据框和内存管理

时间:2016-06-24 23:12:28

标签: scala apache-spark spark-dataframe

我很好奇范围如何使用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. 如果没有丢弃它们,那么此时进行内存管理的更好方法是什么?

1 个答案:

答案 0 :(得分:1)

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

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

根据您对DataFrame([stuff happens])的处理方式,可能没有数据存储在内存中。这是Spark中的默认操作模式。如果你只是想读取一些数据,转换它们,然后写出来,它将全部逐行发生,永远不会将任何数据存储在内存中。 (缓存仅在您明确要求时才会发生。)

尽管如此,我建议在遇到问题之前不要担心内存管理问题。