Объяснение для предупреждения Spark Stage xx содержит задачу с очень большим размером [дублировать]

Я боролся с этой проблемой полдня, наконец, я пришел к этому решению:

  • Тестирование на реальном устройстве не имеет большого смысла в целом, поскольку вам нужно пройти через чтобы заставить его работать. Единственный логичный способ добиться реального тестирования - сделать ваш телефон подключенным к сотовой сети низкого качества, например, EDGE, если ваша телефонная компания предоставляет ее. Вы можете попытаться сделать это, набрав [phone] * # * # 4636 # * # * в приложении телефона
  • Оригинальный эмулятор Android слишком медленный для тестирования и не достигает больше, чем решение выше.

Лучший способ сделать это - использовать Genymotion .

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

Запустите прокси-сервер на хост-машине, который имитирует плохие сетевые условия, например Crapify или Toxiproxy (я тестировал только первый), и вам хорошо идти.

Обновление:

Я только понял, что вы можете выбрать тот же самый стратегия с реальными устройствами тоже. Я чувствую себя идиотом за то, что не понял этого раньше. Просто запустите прокси-сервер Crapify на своем компьютере, установите прокси-сервер телефона на локальный адрес вашего компьютера и вуаля, у вас на вашем телефоне есть дрянной интернет.

19
задан Daniel Darabos 24 April 2015 в 21:22
поделиться

3 ответа

Расширение комментария @ leo9r: рассмотрите использование не python range, а sc.range https://spark.apache.org/docs/1.6.0/api/python/pyspark.html#pyspark. SparkContext.range .

Таким образом, вы избегаете передачи огромного списка из своего драйвера исполнителям.

Конечно, такие RDD обычно используются только для тестирования, поэтому вы не хотят, чтобы их транслировали.

3
ответ дан Timofey Chernousov 15 August 2018 в 17:17
поделиться
  • 1
    используя sc.range вместо range, работает в примере с игрушкой, но пропускает более общую проблему (как данные передаются между python и java) – Jealie 15 August 2017 в 20:16

Общая идея заключается в том, что PySpark создает столько java-процессов, сколько есть исполнителей, а затем отправляет данные в каждый процесс. Если слишком мало процессов, узкое место памяти происходит в области кучи java.

В вашем случае особая ошибка заключается в том, что RDD, созданный с помощью sc.parallelize([...]), не указывал количество разделов ( аргумент numSlices, см. docs ). И RDD по умолчанию имеет несколько разделов, которые слишком малы (возможно, он состоит из одного раздела).

Чтобы решить эту проблему, просто укажите количество желаемых разделов:

a = sc.parallelize([...], numSlices=1000)   # and likewise for b

. Когда вы указываете большее и большее количество срезов, вы увидите уменьшение размера, указанного в предупреждение. Увеличьте количество срезов, пока не получите больше предупреждающего сообщения. Например, получение

Stage 0 contains a task of very large size (696 KB). The maximum recommended task size is 100 KB

означает, что вам нужно указать больше фрагментов.


Еще один совет, который может быть полезен при решении проблем памяти (но это не связано с предупреждение): по умолчанию память, доступная каждому исполнителю, составляет 1 ГБ или около того. Вы можете указать большие суммы через командную строку, например, с помощью --executor-memory 64G.

3
ответ дан Jealie 15 August 2018 в 17:17
поделиться

Искры отправляет копию каждой переменной во время доставки задачи. Для больших размеров таких переменных вы можете использовать Broadcast Variables

Если вы все еще сталкиваетесь с проблемами размера, то, возможно, эти данные должны быть сами по себе RDD

изменить: обновить ссылку

7
ответ дан rest_day 15 August 2018 в 17:17
поделиться
  • 1
    Привет @Hitesh Dharamdasani, есть ли способ изменить конфигурационные файлы SPARK, чтобы максимизировать размер задачи.? – sara 13 January 2016 в 05:09
  • 2
    Извините за опоздание. spark.apache.org/docs/1.2.0/tuning.html содержит некоторые рекомендации в разделе «Сериализация данных». раздел. но его вообще не рекомендуется. У меня был некоторый успех с сериализатором кира, но не с чем похвастаться. Широковещательные переменные лучше – Hitesh Dharamdasani 29 January 2016 в 11:36
  • 3
    что делать, если переменная не является сериализуемой (и, следовательно, вам придется использовать такие операторы, как mapPartitions)? Я не думаю, что это может быть обернуто внутри широковещательной переменной. – bachr 17 May 2016 в 10:04
  • 4
    Просто уточнить этот ответ немного больше. Переменная, которая превышает 100 Кбайт в приведенном примере, - [i for i in range(1, 100000)] – leo9r 1 October 2016 в 06:48
Другие вопросы по тегам:

Похожие вопросы: