У меня возникает ошибка 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%) байтов.
Не знаю, что с этим делать.