В моей системе pyspark я запускаю приложение с картой / уменьшить поток:
sc.map(mapper).reduce(reducer)
Мой маппер выполняет тяжелые итеративные вычисления, а редуктор просто добавляет результаты.
Безусловно,из-за перегрузки системы у меня много борцов (около трети исполнителей работают значительно медленнее).
Чтобы решить эту проблему, я хочу воспользоваться тем фактом, что с моим приложением все в порядке с частичными результатами.
Я знаю, что умозрительное выполнение позволяет обрабатывать захватчики, одновременно выполняя вспомогательный преобразователь и принимаяРезультаты первого, который заканчивается. Это нормально, но мне было интересно, есть ли альтернативный подход, в котором я мог бы сделать одно из следующего:
- Заказать остальные мапперы, чтобы остановить то, что они делают, и вернуть частичные результаты, когда, например,0.5 исполнителей заканчивают.
- Если нет, то прикажите оставшимся мапперам прекратить то, что они делают, но не возвращая частичных результатов, но все же собирая результаты успешных мапперов в драйвер.
- Если нет, может быть, даже остановить мапперы без каких-либо результатов.
- Наконец, возможно ли предоставить альтернативную функцию маппера для второй попытки, чтобы я мог попробовать другой (возможно, более короткий) расчет в альтернативной реализации?