为什么当RDD上的相同进程完成时,Spark DataFrame会耗尽内存?

时间:2016-05-04 18:12:06

标签: apache-spark spark-dataframe

我正在使用相当大量的数据(几TB)。当我使用数据的一个子集时,我发现Spark数据帧非常适合使用。但是,当我在我的完整数据集上尝试计算时,相同的代码返回了一个可怕的“java.lang.OutOfMemoryError:超出了GC开销限制”。让我感到惊讶的是,使用RDD完成同样的过程可以很好地完成这个过程。我认为数据帧应该有更好的优化。这是我的方法中的错误还是数据帧的限制?

例如,这是一个简单的任务,使用数据框,可以完整地为我的数据子集和扼流圈完成:

val records = sqlContext.read.avro(datafile)
val uniqueIDs = records.select("device_id").dropDuplicates(Array("device_id"))
val uniqueIDsCount = uniqueIDs.count().toDouble
val sampleIDs = uniqueIDs.sample(withReplacement = false, 100000/uniqueIDsCount)

sampleIDs.write.format("com.databricks.spark.csv").option("delimiter", "|").save(outputfile)

在这种情况下,它甚至会在计数上窒息。

然而,当我以下列方式使用RDD尝试同样的事情时,它计算得很好(而且非常快)。

val rawinput = sc.hadoopFile[AvroWrapper[Observation],NullWritable,
             AvroInputFormat[Observation]](rawinputfile).map(x=> x._1.datum)
val tfdistinct = rawinput.map(x => x.getDeviceId).distinct
val distinctCount = tfdistinct.count().toDouble
tfdistinct.sample(false, 100000/distinctCount.toDouble).saveAsTextFile(outputfile)

我希望将来继续使用数据框,我是否接近这个错误?

0 个答案:

没有答案