Я запускаю довольно небольшую программу Spark с несколькими операциями map и reduceByKey по очень маленькому набору данных менее 400 МБ.
В какой-то момент у меня есть RDD кортежей, которые я хочу сортировать, и я называю sortByKey. Это самая медленная часть моей программы. Все остальное, кажется, работает почти мгновенно, но это занимает до 20 секунд.
Проблема в том, что она занимает 20 секунд на моем ноутбуке, а также в кластере машин AWS m3.large. Я пробовал с 1, 2 и 3 подчиненными, и различия во времени выполнения очень малы. Ganglia и искровой веб-консоль показывают, что CPU и память используются для максимальной емкости во всех ведомых устройствах, поэтому я думаю, что конфигурация в порядке.
Я также нашел проблему выполнения, прежде чем я ожидал, но затем прочитал этот поток, что указывает на открытую проблему в Spark. Я не думаю, что это было полностью связано.
Является ли sortByKey неотвратимо медленным, и неважно, сколько узлов я добавляю, он будет определять минимальное время выполнения моей программы? Надеюсь, нет, и есть что-то, что я делаю неправильно и могу быть исправлено.
ИЗМЕНИТЬ
Оказывается, что то, что я видел, было связано с той ссылкой, которую я опубликовал. sortByKey просто оказался первым действием (задокументированным как преобразование), и казалось, что программа медленная при сортировке, но на самом деле сортировка выполняется довольно быстро. Проблема заключается в предыдущей операции join.
Все, что я сказал, применяется, изменяя сортировку с соединением. Почему время выполнения не уменьшается, когда я добавляю больше узлов (или numTask к функции соединения), и почему это не лучше, чем простое соединение SQL? Я обнаружил кто-то еще, столкнувшийся с этой проблемой, но ответа нет, кроме предложения сериализации настройки, что я действительно не думаю, что это мой случай.