Можно ли предположить, что rdd1, используемый в вычислениях rdd3, все еще обрабатывается в памяти? Или мы должны кэшировать rdd1, чтобы предотвратить повторную загрузку этого?
rdd1
не кэшируется. Для его кеширования необходимо явно его кешировать и убедиться, что СДР, возвращаемый .cache()
, хранится в переменной, используемой для создания rdd2
:
rdd1 = sc.textFile("...").cache()
rdd2 = rdd1.map().groupBy().filter()
Если бы это было добавлено к вашей диаграмме, был бы другой RDD между rdd1
и rdd2
.
Можем ли мы предположить, что обе ветви вычисляются параллельно и использовать одну и ту же копию rdd1? Или драйвер Spark будет вычислять эти ветви одну за другой, потому что это два разных этапа?
То, что определяет, выполняются ли параллельно выполняемые задания, не является (ветвями) происхождением, а самими запросами заданий Предположим, вы запустили:
rdd4.count()
rdd5.count()
Это будет выполнено rdd1
-> rdd2
-> rdd4
, затем считать, , затем rdd1
-> rdd3
-> rdd5
. Это вычисление будет последовательным.
Чтобы запустить эти два графика параллельно, задания должны быть представлены параллельно (асинхронные вызовы). Есть много вопросов по этой теме. Отметьте это и это .