Хиты задания PySpark: [java.lang.OutOfMemoryError: размер запрошенного массива превышает ограничение виртуальной машины] при чтении BLOB-объектов из файлов последовательности - PullRequest
0 голосов
/ 07 сентября 2018

У меня возникает ошибка OOM при запуске заданий Spark (версия 1.6). Мы читаем большие двоичные данные размером ~ 350 КБ (самый большой - 200 МБ), которые хранятся в файлах последовательности размером ~ 1 ГБ. Запрос не выполняет никаких groupBy или других случайных операций, просто необработанное чтение. Это приведет к тому, что исполнители попадут в ООМ:

sc.sequenceFile("/path/to/myfiles").map(lambda data: len(data[1])).max()

В конечном итоге это ошибка:

ERROR util.Utils: Uncaught exception in thread stdout writer for /opt/anaconda/bin/python
java.lang.OutOfMemoryError: Requested array size exceeds VM limit
    at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:300)
    at java.lang.StringCoding.encode(StringCoding.java:344)
    at java.lang.String.getBytes(String.java:916)
    at net.razorvine.pickle.Pickler.put_string(Pickler.java:626)
    at net.razorvine.pickle.Pickler.put_arrayOfPrimitives(Pickler.java:543)
    at net.razorvine.pickle.Pickler.dispatch(Pickler.java:203)
    at net.razorvine.pickle.Pickler.save(Pickler.java:137)
    at net.razorvine.pickle.Pickler.put_arrayOfObjects(Pickler.java:499)
    at net.razorvine.pickle.Pickler.dispatch(Pickler.java:205)
    at net.razorvine.pickle.Pickler.save(Pickler.java:137)
    at net.razorvine.pickle.Pickler.put_arrayOfObjects(Pickler.java:513)
    at net.razorvine.pickle.Pickler.dispatch(Pickler.java:205)
    at net.razorvine.pickle.Pickler.save(Pickler.java:137)
    at net.razorvine.pickle.Pickler.dump(Pickler.java:107)
    at net.razorvine.pickle.Pickler.dumps(Pickler.java:92)
    at org.apache.spark.api.python.SerDeUtil$AutoBatchedPickler.next(SerDeUtil.scala:121)
    at org.apache.spark.api.python.SerDeUtil$AutoBatchedPickler.next(SerDeUtil.scala:110)
    at scala.collection.Iterator$class.foreach(Iterator.scala:727)
    at org.apache.spark.api.python.SerDeUtil$AutoBatchedPickler.foreach(SerDeUtil.scala:110)
    at org.apache.spark.api.python.PythonRDD$.writeIteratorToStream(PythonRDD.scala:452)
    at org.apache.spark.api.python.PythonRunner$WriterThread$$anonfun$run$3.apply(PythonRDD.scala:280)
    at org.apache.spark.util.Utils$.logUncaughtExceptions(Utils.scala:1819)
    at org.apache.spark.api.python.PythonRunner$WriterThread.run(PythonRDD.scala:239)

Моя команда spark-submit:

spark-submit --master yarn --jars SomeJar.jar --conf spark.dynamicAllocation.enabled=true 
--conf spark.dynamicAllocation.minExecutors=1 --conf spark.dynamicAllocation.maxExecutors=200 
--conf spark.shuffle.service.enabled=true --conf \"spark.executorEnv.PYTHON_EGG_CACHE=/tmp/.python-eggs\" 
--conf spark.port.maxRetries=64 --conf spark.yarn.executor.memoryOverhead=8072 
--executor-memory 20G --executor-cores 5 
--conf spark.yarn.driver.memoryOverhead=8072 
--driver-memory 20G --driver-cores 5 
--conf spark.network.timeout=240 --conf spark.core.connection.ack.wait.timeout=120 
--conf spark.driver.extraJavaOptions='-XX:+UseCompressedOops -XX:MaxPermSize=20G -XX:PermSize=1G' 
--conf spark.executor.extraJavaOptions='-XX:MaxPermSize=20G -XX:PermSize=1G' 
--conf spark.driver.maxResultSize=10G --conf spark.serializer=org.apache.spark.serializer.KryoSerializer 
--conf spark.kryoserializer.buffer.max=2000  --conf spark.rpc.message.maxSize=2000 

Я посмотрел тонну других ответов:

Я попытался настроить память исполнителя / драйвера (до максимума нашего узла в 120 ГБ), несколько вариантов Java из этих ответов (MaxPermSize) и другие параметры конфигурации Spark (spark.memory.offHeap.size).

Кто-нибудь знает, в чем проблема?

Заранее спасибо!

[ОБНОВЛЕНО] Я взял дамп памяти и открыл его в Eclipse Memory Analyzer. Это вызвало две вещи:

  • Поток org.apache.spark.api.python.PythonRunner $ WriterThread @ 0x9c44cb58 stdout Writer для / opt / anaconda / bin / python хранит байты локальных переменных (36,68%). Память накапливается в одном экземпляре "byte []", загруженном "".
  • 30 экземпляров «io.netty.buffer.PoolChunk», загруженных «sun.misc.Launcher $ AppClassLoader @ 0x95555068» (52,01%) байтов.

Не знаю, что с этим делать.

...