2016-09-06 2 views
0

У меня есть «превышение верхнего предела GC» на Spark 1.5.2 (воспроизводится каждые ~ 20 часов) У меня нет утечки памяти в MY-коде. Это может быть ошибка Спарка? Начиная с Spark 1.6.0, они меняют управление памятью, устранит ли эта проблема?У меня есть превышение верхнего предела GC на Spark 1.5.2 (воспроизводится каждые ~ 20 часов)

2016-09-05 19:40:56,714 WARN TaskSetManager: Lost task 11.0 in stage 13155.0 (TID 47982, datanode004.current.rec.mapreduce.m1.p.fti.net): java.lang.OutOfMemoryError: GC overhead limit exceeded 
    at java.util.IdentityHashMap.resize(IdentityHashMap.java:471) 
    at java.util.IdentityHashMap.put(IdentityHashMap.java:440) 
    at org.apache.spark.util.SizeEstimator$SearchState.enqueue(SizeEstimator.scala:159) 
    at org.apache.spark.util.SizeEstimator$$anonfun$visitSingleObject$1.apply(SizeEstimator.scala:203) 
    at org.apache.spark.util.SizeEstimator$$anonfun$visitSingleObject$1.apply(SizeEstimator.scala:202) 
    at scala.collection.immutable.List.foreach(List.scala:318) 
    at org.apache.spark.util.SizeEstimator$.visitSingleObject(SizeEstimator.scala:202) 
    at org.apache.spark.util.SizeEstimator$.org$apache$spark$util$SizeEstimator$$estimate(SizeEstimator.scala:186) 
    at org.apache.spark.util.SizeEstimator$.estimate(SizeEstimator.scala:54) 
    at org.apache.spark.util.collection.SizeTracker$class.takeSample(SizeTracker.scala:78) 
    at org.apache.spark.util.collection.SizeTracker$class.afterUpdate(SizeTracker.scala:70) 
    at org.apache.spark.util.collection.SizeTrackingVector.$plus$eq(SizeTrackingVector.scala:31) 
    at org.apache.spark.storage.MemoryStore.unrollSafely(MemoryStore.scala:278) 
    at org.apache.spark.CacheManager.putInBlockManager(CacheManager.scala:171) 
    at org.apache.spark.CacheManager.getOrCompute(CacheManager.scala:78) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:262) 
    at org.apache.spark.rdd.UnionRDD.compute(UnionRDD.scala:87) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:300) 
    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:300) 
    at org.apache.spark.CacheManager.getOrCompute(CacheManager.scala:69) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:262) 
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:300) 
    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:300) 
    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:300) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:264) 

2016-09-05 19:40:56,725 WARN TaskSetManager: Lost task 7.0 in stage 13155.0 (TID 47978, datanode004.current.rec.mapreduce.m1.p.fti.net): java.io.FileNotFoundException: /var/opt/hosting/data/disk1/hadoop/yarn/usercache/nlevert/appcache/application_1472802379984_2249/blockmgr-f71761be-e12b-4bbc-bf38-9e6f7ddbb3a2/14/shuffle_2171_7_0.data (No such file or directory) 
    at java.io.FileOutputStream.open0(Native Method) 
    at java.io.FileOutputStream.open(FileOutputStream.java:270) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213) 
    at org.apache.spark.storage.DiskBlockObjectWriter.open(DiskBlockObjectWriter.scala:88) 
    at org.apache.spark.storage.DiskBlockObjectWriter.write(DiskBlockObjectWriter.scala:177) 
    at org.apache.spark.util.collection.WritablePartitionedPairCollection$$anon$1.writeNext(WritablePartitionedPairCollection.scala:55) 
    at org.apache.spark.util.collection.ExternalSorter.writePartitionedFile(ExternalSorter.scala:681) 
    at org.apache.spark.shuffle.sort.SortShuffleWriter.write(SortShuffleWriter.scala:80) 
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:73) 
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41) 
    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) 

Memory consumption

+0

У вашей библиотеки может быть утечка памяти в библиотеке, которую вы используете, я бы отслеживал потребление памяти чтобы узнать, сохраняется ли больше памяти после полного GC. –

+0

Я сделал дамп памяти непосредственно перед сбоем GC (см. Снимок экрана о потреблении памяти). У меня есть много объектов String, сохраненных в памяти (содержится в RDD). Я уверен, что у меня нет утечки в моем коде, поскольку я ничего не храню в памяти. Я просто использую искровое окно (60 секунд) ... Я полагаю, что Спарк должен сам удалить старые/бесполезные RDD? – user2459075

+1

Дамп потока (который не совпадает с дампом памяти) указывает на то, что у вас закончилась нехватка памяти при выполнении операции с кешем. Я ожидаю, что размер кеша слишком велик для объема памяти. Установите максимальную память достаточно высокой, и вы можете обнаружить, что она не растет, или вы можете попытаться уменьшить размер кеша. –

ответ

0

Другой вариант заключается в том, что данные должны поддерживаться в искровом режиме в текстовом формате. Попробуйте использовать серилизацию и сжатие для данных, которые искры сохраняются в памяти. попробуйте это:.

вал конф = новый SparkConf() setAppName ("Test-App") conf.set ("spark.serialization", "org.apache.spark.serializer.KyroSerializer") конф .set ("spark.io.compression.codec", "org.apache.spark.io.SnappyCompressionCodec")

0

В подобных случаях я столкнулся, увеличивая память решить эту проблему. Попробуйте следующее:

Либо для spark-submit или spark-shell добавить следующие аргументы:

executor.memory=6G установить память рабочих
driver.memory=6G установить память водителя

В вашем случае, первый, вероятно, help

+1

Спасибо Ирландский, Я уже увеличиваю память (от 2г до 4г), но есть еще утечка, так как она будет разбита позже. – user2459075

Смежные вопросы