Spark: rdd.count() и rdd.write() выполняют преобразования дважды

#apache-spark #rdd

#apache-spark #rdd

Вопрос:

Я использую Apache Spark для извлечения записей из базы данных и после некоторых преобразований записываю их в AWS S3. Теперь я также хочу подсчитать количество записей, которые я записываю в S3, и для этого я делаю

 rdd.count() and then
rdd.write()
 

Таким образом, все преобразования выполняются дважды и создают проблемы с производительностью.
Можно ли каким-либо образом этого добиться, пока выполнение преобразований больше не будет выполняться?

Ответ №1:

Два действия — подсчет и запись означают 2 набора чтения.

Предполагая что-то вроде этого:

 val rdd = sc.parallelize(collectedData, 4)
 

затем, добавив .cache :

 val rdd = sc.parallelize(collectedData, 4).cache
 

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

Визуализация DAG в пользовательском интерфейсе Spark покажет зеленый сегмент или точку, что означает, что было применено кэширование.