我正在使用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没有抱怨..
我不确定我能做些什么..
答案 0 :(得分:-1)
就像你的错误日志表明有两种方法可以做到这一点
通过增加spark.akka.frameSize
,默认大小为128MB。
您可以参考Network Configuration Documentation或者如果您使用独立shell,可以通过参数--driver-java-options "-Dspark.akka.frameSize=128"
或者使用broadcast variables获取较大的值。