如何进一步减少Apache Spark任务大小

时间:2015-05-26 13:02:17

标签: scala apache-spark task rdd

我正在尝试在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.

1 个答案:

答案 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`
  }
}