Я боролся с этой проблемой полдня, наконец, я пришел к этому решению:
* # * # 4636 # * # *
в приложении телефона Лучший способ сделать это - использовать Genymotion .
После того, как вы создали свое виртуальное устройство в Genymotion, , просто запустите этот учебник , чтобы установить прокси для устройства.
Запустите прокси-сервер на хост-машине, который имитирует плохие сетевые условия, например Crapify или Toxiproxy (я тестировал только первый), и вам хорошо идти.
Обновление:
Я только понял, что вы можете выбрать тот же самый стратегия с реальными устройствами тоже. Я чувствую себя идиотом за то, что не понял этого раньше. Просто запустите прокси-сервер Crapify на своем компьютере, установите прокси-сервер телефона на локальный адрес вашего компьютера и вуаля, у вас на вашем телефоне есть дрянной интернет.
Расширение комментария @ leo9r: рассмотрите использование не python range
, а sc.range
https://spark.apache.org/docs/1.6.0/api/python/pyspark.html#pyspark. SparkContext.range .
Таким образом, вы избегаете передачи огромного списка из своего драйвера исполнителям.
Конечно, такие RDD обычно используются только для тестирования, поэтому вы не хотят, чтобы их транслировали.
Общая идея заключается в том, что 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
.
Искры отправляет копию каждой переменной во время доставки задачи. Для больших размеров таких переменных вы можете использовать Broadcast Variables
Если вы все еще сталкиваетесь с проблемами размера, то, возможно, эти данные должны быть сами по себе RDD
изменить: обновить ссылку
mapPartitions
)? Я не думаю, что это может быть обернуто внутри широковещательной переменной.
– bachr
17 May 2016 в 10:04
[i for i in range(1, 100000)]
– leo9r
1 October 2016 в 06:48
sc.range
вместоrange
, работает в примере с игрушкой, но пропускает более общую проблему (как данные передаются между python и java) – Jealie 15 August 2017 в 20:16