Почему перетасовка свечей не проливается на диск? - PullRequest
0 голосов
/ 04 мая 2018

Простая программа wordcount в spark не проливается на диск и приводит к ошибке OOM. Короче говоря:

Окружающая среда:

Spark: 2.3.0, Scala 2.11.8
3 x Executor, each: 1 core + 512 MB RAM
Text file: 341 MB
Other configurations are default (spark.memory.fraction = 0.6)

Код:

import org.apache.spark.SparkContext

object WordCount {

    def main(args: Array[String]): Unit = {

        val inPath = args(0)

        val sc = new SparkContext("spark://master:7077", "Word Count ver3")
        val words = sc.textFile(inPath, minPartitions = 20)
                      .map(line => line.toLowerCase())
                      .flatMap(text => text.split(' '))
        val wc = words.groupBy(word => word)
                      .map({ case (groupName, groupList) => (groupName, groupList.size) })
                      .count()
    }
}

Ошибка:

2018-05-04 13:46:36 WARN  TaskSetManager:66 - Lost task 1.0 in stage 1.0 (TID 21, 192.168.10.107, executor 0): java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.lang.String.<init>(String.java:325)
at com.esotericsoftware.kryo.io.Input.readAscii(Input.java:598)
at com.esotericsoftware.kryo.io.Input.readString(Input.java:472)
at com.esotericsoftware.kryo.serializers.DefaultSerializers$StringSerializer.read(DefaultSerializers.java:195)
at com.esotericsoftware.kryo.serializers.DefaultSerializers$StringSerializer.read(DefaultSerializers.java:184)
at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:790)
at org.apache.spark.serializer.KryoDeserializationStream.readObject(KryoSerializer.scala:278)
at org.apache.spark.serializer.DeserializationStream.readKey(Serializer.scala:156)
at org.apache.spark.serializer.DeserializationStream$$anon$2.getNext(Serializer.scala:188)
at org.apache.spark.serializer.DeserializationStream$$anon$2.getNext(Serializer.scala:185)
at org.apache.spark.util.NextIterator.hasNext(NextIterator.scala:73)
at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:438)
at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:408)
at org.apache.spark.util.CompletionIterator.hasNext(CompletionIterator.scala:32)
at org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:37)
at org.apache.spark.util.collection.ExternalAppendOnlyMap.insertAll(ExternalAppendOnlyMap.scala:153)
at org.apache.spark.Aggregator.combineValuesByKey(Aggregator.scala:41)
at org.apache.spark.shuffle.BlockStoreShuffleReader.read(BlockStoreShuffleReader.scala:90)
at org.apache.spark.rdd.ShuffledRDD.compute(ShuffledRDD.scala:105)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:288)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:288)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
at org.apache.spark.scheduler.Task.run(Task.scala:109)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

heapdump:

Heap Dump

Проблемы:

  1. Размер кучи для выполнения будет (512 - 300) * 0,6 = 127 МБ (так как я не использую кэш). Почему размер ExternalAppendOnlyMap составляет более 380 МБ? Класс должен храниться в памяти кучи, и его размер не может быть больше размера кучи.
  2. ExternalAppendOnlyMap является разливаемым классом, и в этом случае он должен пролить свои данные на диск из-за нехватки памяти, но в этом случае это не приводит к ошибке OOM.
  3. Куча памяти программы подразделяется на: память выполнения Spark и память пользователя. Посмотрите в дамп кучи, какие объекты будут храниться в каком разделе памяти кучи?

Очень ценится за ваше время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...