2016-01-14 2 views
0

Я использую Apache Spark для обработки огромного количества данных. Мне нужно выполнить многие действия Spark на том же RDD. Мой код выглядит следующим образом:Действия на одном и том же Apache Spark RDD вызывают повторное выполнение всех операторов

val rdd = /* Get the rdd using the SparkContext */ 
val map1 = rdd.map(/* Some transformation */) 
val map2 = map1.map(/* Some other transformation */) 
map2.count 
val map3 = map2.map(/* More transformation */) 
map3.count 

Проблема заключается в том, что вызов второго действия map3.count вынуждает повторное выполнение преобразований rdd.map и map1.map.

Что, черт возьми, происходит? Я думаю, что DAG, созданный Spark, несет ответственность за это поведение.

+2

У вас есть минимальный рабочий пример для воспроизведения этого поведения? Я попытался сделать что-то очевидное с помощью 'println' в' map', чтобы показать, какая операция выполняется, но когда я вызываю 'collect' на втором, я получаю только второй, а не первый. –

+0

Я исправил свой вопрос, это было не так точно. Завтра я смогу привести рабочий пример. Спасибо за вашу помощь. –

ответ

2

Это ожидаемое поведение. Если один из предков не может быть извлечен из кеша (обычно это означает, что он был явно или неявно сохранен во время перетасовки), каждое действие будет перекомпоновно целой линии.

Вычисление может быть также инициировано, если RDD сохранено, но данные были потеряны/удалены из кеша или объем доступного пространства - с низким, чтобы сохранить все записи.

В данном конкретном случае вы должны cache в следующем порядке

... 
val map2 = map1.map(/* Some other transformation */) 
map2.cache 
map2.count 
val map3 = map2.map(/* More transformation */) 
... 

, если вы хотите, чтобы избежать повторного оценки rdd, map1 и map2.

+0

Я столкнулся с той же проблемой с моей искрой, но в моем случае данные огромны, поэтому кэширование, вероятно, невозможно. Есть ли другой вариант, чтобы я мог избежать перетасовки данных. Спасибо в Advance –

+0

@Atul Перетасованные данные будут повторно использовать файлы в случайном порядке. См. [Что означает «Пропущенный этап» в веб-интерфейсе Apache Spark?] (Https://stackoverflow.com/q/34580662/1560062) и другие вопросы, связанные с ним. Также возможно вообще кэширование с памятью и диском. – zero323