保存Word2VecModel时超过spark.akka.frameSize

时间:2016-04-18 11:14:43

标签: apache-spark word2vec

我正在使用Spark的Word2Vec来训练一些单词向量。培训本质上是有效的,但是在保存模型时,我得到org.apache.spark.SparkException说:

  

作业因阶段失败而中止:序列化任务1278:0为1073394582字节,超过了最大允许值:spark.akka.frameSize(134217728字节) - 保留(204800字节)。考虑增加spark.akka.frameSize或使用广播变量获取大值。

堆栈跟踪指向第190行,但我有可能更改了一些代码,我认为它实际上是第196行导致了问题:

190: val sizeGb = (model.getVectors.size * arguments.getVectorSize * 4.0)/(1024*1024*1024.0);
191: 
192: println("Final vocabulary word count: " + model.getVectors.size)
193: println("Output file size:      ~ " + f"$sizeGb%1.4f" + " GB")
154: println("Saving model to " + outputFilePath)
195:
196: model.save(sc, outputFilePath)

从我自己的输出中得到估计的模型大小

// (vocab-size * vector-size * 4)/(1024^3) = ~ 0.9767 GB
val sizeGb = (model.getVectors.size * arguments.getVectorSize * 4.0)/(1024*1024*1024.0);

接近1073394582字节。 堆栈跟踪:

org.apache.spark.SparkException: Job aborted due to stage failure: Serialized task 1278:0 was 1073394582 bytes, which exceeds max allowed: spark.akka.frameSize (134217728 bytes) - reserved (204800 bytes). Consider increasing spark.akka.frameSize or using broadcast variables for large values.
    at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1431)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1419)
    at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1418)
    ...
    at org.apache.spark.mllib.feature.Word2VecModel$SaveLoadV1_0$.save(Word2Vec.scala:617)
    at org.apache.spark.mllib.feature.Word2VecModel.save(Word2Vec.scala:489)
    at masterthesis.code.wordvectors.Word2VecOnCluster$.main(Word2VecOnCluster.scala:190)
    at masterthesis.code.wordvectors.Word2VecOnCluster.main(Word2VecOnCluster.scala)

错误信息很明确,但我不知道我能做些什么。另一方面,我已经保存了大于125MB的模型(我们的默认帧大小),Spark没有抱怨..

我不确定我能做些什么..

1 个答案:

答案 0 :(得分:-1)

就像你的错误日志表明有两种方法可以做到这一点

  • 通过增加spark.akka.frameSize,默认大小为128MB。

    您可以参考Network Configuration Documentation或者如果您使用独立shell,可以通过参数--driver-java-options "-Dspark.akka.frameSize=128"

  • 设置它
  • 或者使用broadcast variables获取较大的值。