Открыть сервис

Устойчивый распределённый набор данных

Устойчивый распределённый набор данных (англ. Decentralized/Resilient Distributed Dataset; RDD) — это фундаментальная абстракция данных в платформе Apache Spark, представляющая собой неизменяемую (иммутабельную) коллекцию объектов, распределённую по узлам вычислительного кластера, над которой можно выполнять параллельные операции. RDD обеспечивает отказоустойчивость за счёт отслеживания цепочки трансформаций (линеажа), позволяя автоматически восстанавливать утерянные данные при сбоях узлов без репликации.

Основные свойства

История и происхождение

Концепция RDD была предложена в 2011 году исследователями Калифорнийского университета в Беркли (Мэтви Захария, Моше Ринцель и др.) в рамках проекта Spark. Идея возникла в ответ на ограничения существовавших на тот момент распределённых вычислительных систем (MapReduce/Hadoop), которые плохо подходили для интерактивной аналитики и итеративных алгоритмов машинного обучения из-за необходимости многократного чтения данных с диска. RDD позволил эффективно реализовать повторные вычисления и отказоустойчивость за счёт линеажа, устранив основную причину медлительности — репликацию данных.

Первая версия Spark (0.5) с поддержкой RDD была выпущена в 2012 году. В 2013 году Spark стал частью проекта Apache Software Foundation, а RDD остаётся ядром системы, несмотря на появление более высокоуровневых API (DataFrame, Dataset), основанных на оптимизированном исполнении через Catalyst и Tungsten.

Устройство и архитектура

Партиции и расположение

RDD делится на партиции — минимальные логические единицы параллелизма. Каждая партиция обрабатывается одним заданием (task) на одном ядре процессора. Spark стремится разместить задание на узле, где физически находятся данные (data locality), чтобы минимизировать сетевые пересылки. Пользователь может задать количество партиций, но Spark чаще выбирает его на основе размера кластера и источника данных (например, количество блоков HDFS).

Линеаж (Lineage)

При каждой трансформации Spark записывает, как новый RDD был порождён из предыдущего (например, map(func) или filter(cond)). Эта информация формирует ациклический граф. При потере партиции Spark просматривает граф от потерянного RDD до начального источника (HDFS, локальная файловая система) и повторно выполняет все необходимые трансформации. Такой подход является главным преимуществом RDD: вместо репликации данных на нескольких узлах (как в Cassandra или HDFS) перевычисляется только утерянная часть, что экономит память и полосу пропускания.

Широкие и узкие зависимости

Эластичность и представление

RDD может быть сохранён (persisted) в памяти (кэширование) или на диске. Кэширование ускоряет повторные операции (например, в итеративных алгоритмах машинного обучения). Spark предлагает стратегии кэширования: MEMORY_ONLY, MEMORY_AND_DISK, DISK_ONLY. Эластичность означает, что набор данных может масштабироваться путём добавления партиций, изменяя количество исполнителей.

Операции над RDD

Операции делятся на два типа:

Трансформации (Transformations)

Создают новый RDD из исходного. Типичные примеры:

Действия (Actions)

Запускают вычисления и возвращают результат (или отправляют его в внешнее хранилище). Примеры:

Применение

RDD исторически был основным API Spark для:

С появлением Spark 2.0 (2016 год) разработчики рекомендуют использовать DataFrame/Dataset как основной API, поскольку они предоставляют оптимизированное выполнение через Catalyst и Tungsten. Тем не менее, RDD остаётся доступен для низкоуровневых сценариев, где требуется полный контроль над распределением и линеажем. Многие внутренние компоненты Spark (в частности, MLlib до версии 2.0, GraphX) работают поверх RDD.

Критика и ограничения

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →