2015-06-25 93 views
2

我在處理大約55個hdfs文件和總共1B個記錄的簡單計數操作時遇到了很多麻煩。 OOM錯誤導致spark-shell和PySpark都失敗。我使用紗線,MapR,Spark 1.3.1和hdfs 2.4.1。 (它在本地模式下也失敗了。)我試着按照調整和配置建議,向執行者投擲越來越多的內存。我的配置是簡單rdd.count()操作的java.lang.OutOfMemoryError

conf = (SparkConf() 
     .setMaster("yarn-client") 
     .setAppName("pyspark-testing") 
     .set("spark.executor.memory", "6g") 
     .set("spark.driver.memory", "6g") 
     .set("spark.executor.instances", 20) 
     .set("spark.yarn.executor.memoryOverhead", "1024") 
     .set("spark.yarn.driver.memoryOverhead", "1024") 
     .set("spark.yarn.am.memoryOverhead", "1024") 
     ) 
sc = SparkContext(conf=conf) 
sc.textFile('/data/on/hdfs/*.csv').count() # fails every time 

的工作會分成893個任務後約50任務成功完成,很多創業失敗。我在應用程序的stderr中看到ExecutorLostFailure。當通過執行日誌挖掘,我看到這樣的錯誤如下:

15/06/24 16:54:07 ERROR util.Utils: Uncaught exception in thread stdout writer for /work/analytics2/analytics/python/envs/santon/bin/python 
java.lang.OutOfMemoryError: Java heap space 
    at java.nio.HeapCharBuffer.<init>(HeapCharBuffer.java:57) 
    at java.nio.CharBuffer.allocate(CharBuffer.java:331) 
    at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:792) 
    at org.apache.hadoop.io.Text.decode(Text.java:406) 
    at org.apache.hadoop.io.Text.decode(Text.java:383) 
    at org.apache.hadoop.io.Text.toString(Text.java:281) 
    at org.apache.spark.SparkContext$$anonfun$textFile$1.apply(SparkContext.scala:558) 
    at org.apache.spark.SparkContext$$anonfun$textFile$1.apply(SparkContext.scala:558) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
    at org.apache.spark.api.python.PythonRDD$.writeIteratorToStream(PythonRDD.scala:379) 
    at org.apache.spark.api.python.PythonRDD$WriterThread$$anonfun$run$1.apply$mcV$sp(PythonRDD.scala:242) 
    at org.apache.spark.api.python.PythonRDD$WriterThread$$anonfun$run$1.apply(PythonRDD.scala:204) 
    at org.apache.spark.api.python.PythonRDD$WriterThread$$anonfun$run$1.apply(PythonRDD.scala:204) 
    at org.apache.spark.util.Utils$.logUncaughtExceptions(Utils.scala:1550) 
    at org.apache.spark.api.python.PythonRDD$WriterThread.run(PythonRDD.scala:203) 
15/06/24 16:54:07 ERROR util.SparkUncaughtExceptionHandler: Uncaught exception in thread Thread[stdout writer for /work/analytics2/analytics/python/envs/santon/bin/python,5,main] 
java.lang.OutOfMemoryError: Java heap space 
    at java.nio.HeapCharBuffer.<init>(HeapCharBuffer.java:57) 
    at java.nio.CharBuffer.allocate(CharBuffer.java:331) 
    at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:792) 
    at org.apache.hadoop.io.Text.decode(Text.java:406) 
    at org.apache.hadoop.io.Text.decode(Text.java:383) 
    at org.apache.hadoop.io.Text.toString(Text.java:281) 
    at org.apache.spark.SparkContext$$anonfun$textFile$1.apply(SparkContext.scala:558) 
    at org.apache.spark.SparkContext$$anonfun$textFile$1.apply(SparkContext.scala:558) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
    at org.apache.spark.api.python.PythonRDD$.writeIteratorToStream(PythonRDD.scala:379) 
    at org.apache.spark.api.python.PythonRDD$WriterThread$$anonfun$run$1.apply$mcV$sp(PythonRDD.scala:242) 
    at org.apache.spark.api.python.PythonRDD$WriterThread$$anonfun$run$1.apply(PythonRDD.scala:204) 
    at org.apache.spark.api.python.PythonRDD$WriterThread$$anonfun$run$1.apply(PythonRDD.scala:204) 
    at org.apache.spark.util.Utils$.logUncaughtExceptions(Utils.scala:1550) 
    at org.apache.spark.api.python.PythonRDD$WriterThread.run(PythonRDD.scala:203) 
15/06/24 16:54:07 ERROR executor.CoarseGrainedExecutorBackend: RECEIVED SIGNAL 15: SIGTERM 

stdout

# java.lang.OutOfMemoryError: Java heap space 
# -XX:OnOutOfMemoryError="kill %p" 
# Executing /bin/sh -c "kill 16490"... 

一般情況下,我想我明白了OOM錯誤和問題排查,但我被困概念上在這裏。這只是一個簡單的計數。我不明白當執行者擁有3G堆棧時,Java堆可能會如何溢出。有沒有人遇到過這個或有任何指針?有沒有什麼事情可以揭示這個問題?

更新:

我也注意到,通過指定並行性(例如sc.textFile(..., 1000))相同數量的任務(893),然後創建的作業有920個任務,除了最後這完整的沒有錯誤。然後最後一項任務無限期地結束。這似乎非常奇怪!

+0

嗨,我只是遇到了同樣的問題,我有一個dafarame和調用計數()在它導致一個執行與OOME崩潰 – Honza

回答

0

試着增加Java堆大小控制檯

export JAVA_OPTS="-Xms512m -Xmx5g" 

在如下您可以根據您的數據和內存大小的更改值,-Xms意味着最小內存和-Xmx指最大尺寸。希望它會幫助你。

+0

請給它一個嘗試,然後問我如果有任何問題。 –

+0

再次感謝提示。我剛剛嘗試過,並且以同樣的方式失敗。任何其他想法? – santon

+0

在spark中設置「export JAVA_OPTS =」 - Xms512m -Xmx5g「的位置?無論是在」Spark-defaults.conf「文件還是其他文件中。 – sara

1

事實證明,我遇到的問題實際上與單個損壞的文件有關。在文件上運行簡單的catwc -l會導致終端掛起。