Почему появился Apache Spark?

Ответ

Spark был создан в 2009 году в UC Berkeley как ответ на ключевое ограничение Hadoop MapReduce: низкую скорость выполнения итеративных алгоритмов (машинное обучение, графовые вычисления) и интерактивных аналитических запросов.

Основная проблема MapReduce: Каждый этап (map/reduce) записывает промежуточные данные на диск (HDFS), что создает огромные накладные расходы по вводу-выводу.

Решение Spark: Введение абстракции Resilient Distributed Datasets (RDD). RDD — это неизменяемая, отказоустойчивая коллекция данных, распределенная по кластеру, которую можно кэшировать в оперативной памяти. Это позволяет выполнять множество операций без обращения к диску.

Сравнение на примере итеративного вычисления (сумма чисел):

# PySpark пример: итеративное вычисление с кэшированием в памяти
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("Example").getOrCreate()
sc = spark.sparkContext

# Создаем RDD
numbers_rdd = sc.parallelize(range(1, 10001))

# Кэшируем в памяти для многократного использования
numbers_rdd.cache()

# Множество операций выполняются без перечитывания с диска
sum_result = numbers_rdd.sum()
count_result = numbers_rdd.count()
mean_result = sum_result / count_result

print(f"Sum: {sum_result}, Count: {count_result}, Mean: {mean_result}")
spark.stop()

Итог: Spark обеспечил скорость до 100 раз выше, чем Hadoop MapReduce для определенных задач, и предложил единую платформу (Spark SQL, Structured Streaming, MLlib, GraphX) для пакетной, потоковой обработки, машинного обучения и анализа графов.

Ответ 18+ 🔞

А, ну это же классика, ёпта! Слушай, история про Spark — это прям как про машину, которая вместо того чтобы на каждом светофоре глушить двигатель и заводить снова, просто едет, блядь. В 2009 году в Беркли сидели умные дядьки и думали: "Ну что за пиздец с этим Hadoop'ом, он же каждую промежуточную хуйню на диск пишет, как будто на дворе 2002-й год!"

Основная засада MapReduce была проще пареной репы: он жрал время, как не в себя, потому что после каждого чиха — map или reduce — бежал данные на медленный HDFS записывать. Представь: ты готовишь ужин, но после того, как почистил картошку, идешь её в гараж на полку класть. Нарезал — опять в гараж. Сварил — снова в гараж. Овердохуища просто движений, а времени — ноль.

Гениальность Spark в том, что они придумали RDD (Resilient Distributed Datasets). Это такая хитрая, блядь, штука — неизменяемая распределённая коллекция, которую можно, внимание, засунуть в оперативку и не выгружать! То есть всё вычисление происходит в памяти, как у нормальных людей. Отказоустойчивость обеспечивается не скидыванием всего на диск, а хитрым отслеживанием lineage — кто от кого произошёл, чтобы при пиздеце пересчитать.

Сравниваем на живом примере (та же сумма чисел):

Смотри, вот код, он технически точный, я его не трогаю, как и договаривались.

# PySpark пример: итеративное вычисление с кэшированием в памяти
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("Example").getOrCreate()
sc = spark.sparkContext

# Создаем RDD
numbers_rdd = sc.parallelize(range(1, 10001))

# Кэшируем в памяти для многократного использования
numbers_rdd.cache()

# Множество операций выполняются без перечитывания с диска
sum_result = numbers_rdd.sum()
count_result = numbers_rdd.count()
mean_result = sum_result / count_result

print(f"Sum: {sum_result}, Count: {count_result}, Mean: {mean_result}")
spark.stop()

Видишь магию? cache() — это и есть тот самый волшебный пинок. Без него каждый вызов sum() или count() гонял бы данные с начала. А так — раз положил в память и юзай, хоть сто раз. Скорость, блядь, вырастала в десятки раз, а для итеративных алгоритмов ML — так вообще дохуя, чувак.

Итог, ёб твою мать: Spark не просто ускорил всё в 100 раз для некоторых задач, а запилил целую империю из одной кодовой базы — SQL, стриминг, машинка, графы. Вместо зоопарка технологий — один здоровенный, но быстрый фреймворк. Вот что значит, блядь, головой думать, а не просто байтики туда-сюда гонять.