2016-01-22 115 views
16

當我與1點GB的數據集它完成沒有任何錯誤運行分析代碼。但是,當我試圖數據的25 GB的時候,我得到下面的錯誤。我想了解如何避免以下失敗。很高興聽到任何建議或想法。FetchFailedException或MetadataFetchFailedException當處理大數據集

不同的充錯誤,

org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 0 

org.apache.spark.shuffle.FetchFailedException: Failed to connect to ip-xxxxxxxx 

org.apache.spark.shuffle.FetchFailedException: Error in opening FileSegmentManagedBuffer{file=/mnt/yarn/nm/usercache/xxxx/appcache/application_1450751731124_8446/blockmgr-8a7b17b8-f4c3-45e7-aea8-8b0a7481be55/08/shuffle_0_224_0.data, offset=12329181, length=2104094} 

羣集詳細說明:

紗線:8個節點
核心總數:64
內存:500 GB
火花版本:1.5

星火提交聲明:

spark-submit --master yarn-cluster \ 
         --conf spark.dynamicAllocation.enabled=true \ 
         --conf spark.shuffle.service.enabled=true \ 
         --executor-memory 4g \ 
         --driver-memory 16g \ 
         --num-executors 50 \ 
         --deploy-mode cluster \ 
         --executor-cores 1 \ 
         --class my.parser \ 
         myparser.jar \ 
         -input xxx \ 
         -output xxxx \ 

一個堆棧跟蹤:

at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$2.apply(MapOutputTracker.scala:460) 
at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$2.apply(MapOutputTracker.scala:456) 
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) 
at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:771) 
at org.apache.spark.MapOutputTracker$.org$apache$spark$MapOutputTracker$$convertMapStatuses(MapOutputTracker.scala:456) 
at org.apache.spark.MapOutputTracker.getMapSizesByExecutorId(MapOutputTracker.scala:183) 
at org.apache.spark.shuffle.hash.HashShuffleReader.read(HashShuffleReader.scala:47) 
at org.apache.spark.rdd.ShuffledRDD.compute(ShuffledRDD.scala:90) 
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297) 
at org.apache.spark.rdd.RDD.iterator(RDD.scala:264) 
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297) 
at org.apache.spark.rdd.RDD.iterator(RDD.scala:264) 
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66) 
at org.apache.spark.scheduler.Task.run(Task.scala:88) 
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

回答

48

這個錯誤幾乎肯定會被記憶的問題在你的遺囑執行人造成的。我能想到幾種方法來解決這些類型的問題。

1)你可以嘗試運行更多的分區(在你的dataframe上做一個repartition)。存儲器問題通常出現在一個或多個分區包含比將適合存儲器更多的數據。

2)我注意到你沒有明確設置spark.yarn.executor.memoryOverhead,所以它會默認爲max(386, 0.10* executorMemory),在你的情況下它將是400MB。這對我來說聽起來很低。我會嘗試將其增加到1GB(注意,如果將memoryOverhead增加到1GB,則需要將--executor-memory降至3GB)

3)查找發生故障的節點上的日誌文件。你想尋找文字「殺死容器」。如果你看到文本「運行超出物理內存限制」,增加memoryOverhead會 - 在我的經驗 - 解決問題。

+0

是否是數字2)也以獨立模式計數。如果是的話,我們如何設置它。我無法在獨立模式下找到類似的變量。 – Laeeq

3

我也有一些好的結果,將Spark timeout spark.network.timeout增加到800這樣的較大值。默認的120秒會導致很多執行程序在重負載時超時。