保存大文件超出frameLimit

时间:2016-04-24 11:29:04

标签: apache-spark word2vec

我尝试保存大约一个大文本文件。 5GB

sc.parallelize(cfile.toString()
  .split("\n"), 1)
  .saveAsTextFile(new Path(path+".cs", "data").toUri.toString)

但我一直在

java.io.IOException: Broken pipe
    at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
    at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
    at sun.nio.ch.IOUtil.write(IOUtil.java:65)
...
org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 6
    at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$2.apply(MapOutputTracker.scala:542)
    at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$2.apply(MapOutputTracker.scala:538)
    at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:772)
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)

我现在已经被困在这里多年了。有人可以帮助我解释如何将cfile保存为文本文件吗?

独立/本地/纱线群?

  • 纱线群

内存/内核设置?

  • 1,8 TB
  • 285核心

分区数量?

  • 我目前正在将分区数设置为1

用于设置分区数的相关代码行:

val model = word2vec
  .setMinCount(minCount.asInstanceOf[Int])
  .setVectorSize(arguments.getVectorSize)
  .setWindowSize(arguments.getContextWindowSize)
  .setNumPartitions(numW2vPartitions)
  .setLearningRate(learningRate)
  .setNumIterations(arguments.getNumIterations)
  .fit(wordSequence)

spark-submit 参数:

spark-submit --master yarn 
             --deploy-mode cluster 
             --driver-memory 20G 
             --num-executors 5 
             --executor-cores 8 
             --driver-java-options "-Dspark.akka.frameSize=2000" 
             --executor-memory 20G --class

1 个答案:

答案 0 :(得分:0)

独立/本地/纱线群集? 内存/核心设置? 分区数量?

您的错误可能是其中一名工人失踪的原因(OOM杀手可能已将其杀死或出现OOM错误)

我不确定你为什么要这样做:cfile.toString()。split(“\ n”) - 从这个我明白你在内存中保存所有5GB内容并尝试并行化它?显然它不是最佳的。 另一个可能相关的问题 - 如果你的驱动程序可以以某种方式保存内存中的所有5GB,但驱动程序工作者之间的所有网络层仍然不喜欢这些数据 - 所以我建议将其拆分为分区。

您可以使用sc.textFile(..)读取文件,然后将其保存到新路径中。您还可以使用sc.textFile(..)。repartition(100)控制文本文件的分区数(片段数)。