Раздел 26 · Data Engineering

RDD: неизменяемость, lineage и отказоустойчивость

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

На кластере из сотни машин что-нибудь ломается каждый день: диск, сеть, память. Если исполнитель умер посреди задания, его партиции пропали. Как Spark продолжает работу, не начиная всё заново и не храня копию каждого куска данных? Ответ в структуре, с которой Spark начинался: RDD. Сегодня с ней редко работают напрямую, но на ней стоит всё остальное, и её идеи объясняют поведение DataFrame.

Рецепт вместо запасного блюда

Повар готовит торт: замесить тесто, испечь коржи, промазать кремом. Торт упал на пол. Можно было заранее испечь запасной торт, но это вдвое больше работы и места в холодильнике. А можно просто держать рецепт: если торт упал, его готовят заново по шагам.

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

Что такое RDD

RDD расшифровывается как Resilient Distributed Dataset, устойчивый распределённый набор данных. Каждое слово важно:

  • Dataset: это коллекция объектов Python, например чисел, строк или кортежей.
  • Distributed: коллекция разбита на партиции, и партиции лежат на разных исполнителях.
  • Resilient: устойчивый. Потерянную партицию можно восстановить.

Самый простой способ получить RDD это раздать на кластер список из драйвера: sc.parallelize(список, число_партиций). Метод glom() превращает каждую партицию в список, и через collect() видно, как Spark разложил данные.

Неизменяемость

RDD нельзя изменить. prices.filter(...) не удаляет строки из prices, а возвращает новый RDD, у которого prices записан родителем. Это и есть неизменяемость.

Зачем она нужна? Если бы партиции можно было менять на месте, рецепт перестал бы работать: повторное выполнение шагов дало бы другой результат. Неизменяемые родители гарантируют, что пересчёт партиции даст ровно те же данные.

урок из курса

Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.