OOM火花处理VAR

时间:2019-04-05 12:49:09

标签: scala apache-spark

我有一个创建为全局变量(可变)的数据框。

var output

此变量通过不同的联接在不同的函数中多次更新。

def func1 = {
// some code
output = output.join(temp1, Seq("id"))
}

def func2 = {
// some code
output = output.join(temp2, Seq("id"))
}

在上述几个函数调用之后,output被传递到另一个函数performCalculation,在其中执行一些计算。我的问题是,根据在代码中调用func1和func2的次数,我在org.apache.spark.memory.SparkOutOfMemoryError: Unable to acquire 36 bytes of memory, got 0中遇到了OOM错误(performCalculation)。

但是,如果我在将输出传递到performCalculation之前编写输出,然后将其读回另一个变量,然后将第二个变量发送到performCalculation,则可以正常工作。

ouput.write.csv(path)
val newOutput = spark.read.csv(path)
performCalculation(newOutput)

很明显,spark不喜欢使用可变变量,因此我不得不重写该部分。但是,我尝试清除缓存并每次都在outputfunc1内重新缓存func2 output已更新,但似乎无济于事。

output.unpersist()
output = output.join(temp2, Seq("id"))
output.cache()

我做错了什么,我可以做些什么来改善这一点。

0 个答案:

没有答案