我正在尝试在Spark框架上的scala中运行以下代码,但是我得到了一个非常大的任务大小(8MB)
tidRDD:RDD[ItemSet]
mh:MineHelper
x:ItemSet
broadcast_tid:Broadcast[Array[ItemSet]]
count:Int
tidRDD.flatMap(x => mh.mineFreqSets(x, broadcast_tid.value, count)).collect()
我添加MinerHelper
类的原因是为了使其可序列化,并且它只包含给定的方法。 ItemSet
是一个有3个私有成员和一些getter / setter方法的类,没有什么不同寻常的。我觉得这是解决这个问题的正确方法,但Spark认为不然。我是否会出现一些差距错误,或者这是一个小错误的错误?
这是警告:
WARN TaskSetManager: Stage 1 contains a task of very large size (8301 KB). The maximum recommended task size is 100 KB.
答案 0 :(得分:1)
你可能会关闭this
,迫使整个封闭对象被序列化。
您可能会遇到以下情况:
class Foo {
val outer = ???
def f(rdd: RDD[ItemSet]): RDD[ItemSet] = {
rdd.map(x => outer.g(x))
}
}
在这种情况下,在序列化任务期间,Spark将需要封闭Foo
的实例。实际上,当您引用outer
时,您的意思是this.outer
。
一个简单的解决方法是将外部变量放在本地变量中:
class Foo {
val outer = ???
def f(rdd: RDD[ItemSet]): RDD[ItemSet] = {
val _outer = outer // local variable
rdd.map(x => _outer.g(x)) // no reference to `this`
}
}