ошибка памяти в pyspark [дубликат]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

37
задан Jacek Laskowski 23 December 2014 в 19:22
поделиться

4 ответа

Настройка памяти, вероятно, является хорошим способом, как уже было предложено, потому что это дорогостоящая операция, которая масштабируется уродливо. Но, возможно, некоторые изменения кода помогут.

В вашей комбинированной функции вы можете использовать другой подход, который избегает операторов if с помощью функции combinations. Я также преобразовал бы второй элемент кортежей в двойные операции перед комбинацией:

tuples.

    // Convert to doubles only once
    map{ x=>
        (x._1, x._2.toDouble)
    }.

    // Take all pairwise combinations. Though this function
    // will not give self-pairs, which it looks like you might need
    combinations(2).

    // Your operation
    map{ x=>
        (toKey(x{0}._1, x{1}._1), x{0}._2*x{1}._2)
    }

Это даст итератор, который вы можете использовать downstream или, если хотите, преобразовать в список (или что-то) с toList.

12
ответ дан ohruunuruus 19 August 2018 в 14:47
поделиться
  • 1
    Привет @ohruunuruus, я думаю, что скольжение не обеспечивает то же поведение, что я хочу делать. Функция toKey просто объединяет две строки. – Augusto 13 December 2014 в 20:21
  • 2
    Хм, хорошо. Я должен буду взглянуть, когда у меня есть доступ к искровой оболочке. Независимо от этого, вы можете изучить другие способы выполнения операции объединения. – ohruunuruus 13 December 2014 в 20:24
  • 3
    Я вижу сейчас. Я неправильно понял, что вы делали. Вернется позже ... – ohruunuruus 13 December 2014 в 20:35
  • 4
    Привет, @ohruunuruus, это трюк, я думаю, что возвращение итератора - это то, что на самом деле делает трюк, потому что мой цикл for пытается собрать огромный массив в памяти, и он выходит из строя из-за нехватки памяти. Я знал, что мой цикл for выглядел не очень scala-like, но я начал изучать вчера, так что это то, что я мог сделать. спасибо за время! – Augusto 13 December 2014 в 22:24

Эта ошибка сборки мусора JVM произошла воспроизводимо в моем случае, когда я увеличил значение spark.memory.fraction до значений больше 0,6. Поэтому лучше оставить значение по умолчанию, чтобы избежать ошибок сбора мусора JVM. Это также рекомендуется https://forums.databricks.com/questions/2202/javalangoutofmemoryerror-gc-overhead-limit-exceede.html .

Для получения дополнительной информации о том, почему 0.6 является наилучшим значением для spark.memory.fraction, см. https://issues.apache.org/jira/browse/SPARK-15796 .

1
ответ дан asmaier 19 August 2018 в 14:47
поделиться

В документации ( http://spark.apache.org/docs/latest/running-on-yarn.html ) вы можете прочитать, как настроить исполнителей и предел памяти. Например:

--master yarn-cluster --num-executors 10 --executor-cores 3 --executor-memory 4g --driver-memory 5g  --conf spark.yarn.executor.memoryOverhead=409

MemoryOverhead должен быть 10% от памяти исполнителя.

Изменить: Исправлено 4096 - 409 (Комментарий ниже относится к этому)

9
ответ дан Ganesh Krishnan 19 August 2018 в 14:47
поделиться
  • 1
    Не должно ли 10% 4G быть около 410 (М)? – piggybox 7 September 2016 в 01:22
  • 2
    Да, это должно быть около 10%, извините. Итак: spark.yarn.executor.memoryOverhead = 409 – Carlos AG 5 December 2016 в 12:16

Добавьте следующий JVM arg при запуске spark-shell или spark-submit:

-Dspark.executor.memory=6g

Вы также можете явно указать количество рабочих при создании экземпляра SparkContext:

Распределенный кластер

Задайте имена подчиненных в conf/slaves:

val sc = new SparkContext("master", "MyApp")
13
ответ дан Jacek Laskowski 19 August 2018 в 14:47
поделиться
  • 1
    Опция памяти не помогает, к сожалению. Я все еще получаю исключение из памяти. – Augusto 13 December 2014 в 20:20
  • 2
    После того, как я добавил эту опцию и сменил минимальные разделы на 100 spark.textFile(conceptsFile, 100).cache(), кажется, что она работает намного дольше, но заканчивается окрашиванием с помощью java.lang.OutOfMemoryError: Java heap space – Augusto 13 December 2014 в 21:00
  • 3
    Если вы меняете spark.executor.memory = 12g, он работает еще дольше? Сколько у вас памяти на системах для распределения рабочих? Возможно, вы захотите добавить больше рабочих - в файл conf / slaves. – javadba 13 December 2014 в 21:17
  • 4
    hi @javadba похоже, что это был фактически факт, что я пытался собрать весь массив перестановок в памяти, который его убивал. Похоже, что функция combine возвращает итератор. Спасибо за это время! – Augusto 13 December 2014 в 22:26