由于assert语句,SPARK任务不可序列化

时间:2017-08-16 07:50:40

标签: scala apache-spark serialization

我得到"任务不可序列化"由于RDD上的foreach方法中的assert语句导致的错误。是否有任何解决方法为RDD的每个元素编写断言?

class myTest extends Funsuite {

  //some code to create spark context(sc)

  var arrRDD = sc.parallelize(Array(1,1,1,1,1))

  test("custom test"){
     arrRDD.foreach{
        x => {
           //commenting out this assert removes the error
           assert(x == 1)
        } 
     }
  }

}

2 个答案:

答案 0 :(得分:0)

RDD(弹性分布式数据集)是一个集群,它分布在集群中的节点上。当我们工作时,我们只看到单个机器中的集合,这是由于抽象。

当您运行RDD.map或任何其他转换,例如mapfilter等时,会将其序列化并移至群集上的其他节点并在这些节点上执行。

"Task not serializable"中的错误是由于序列化的转换arrRDD.foreach引起的,但"assert"中的方法未被序列化,因此无法将其移动到其他节点。< / p>

如果您只想assert collect这个值,只需array它就可以将数据作为assertarrRDD.collect().foreach{ x => assert (x == 1) } 传递给驱动程序节点

{{1}}

但我不认为这仍然是一个好方法!

希望这对你有所帮助:)

答案 1 :(得分:0)

如果要测试这个小用例,可以将其收集到实际的scala集合中,然后使用断言。就像尚卡尔说的那样。

如果您想要更广泛的单元测试,可以使用unit testing framework