Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Apache Spark
Apache Spark — это распределённая вычислительная платформа для обработки больших данных, которая работает в памяти (in-memory) и обеспечивает быстрые вычисления.
Основные характеристики
In-memory вычисления: Spark хранит данные в памяти между операциями, что делает его в 10-100 раз быстнее MapReduce.
Поддержка Python, SQL, Scala, Java, R: Можешь писать на любом языке.
Unified API:
- RDD (Resilient Distributed Dataset) — низкоуровневый API
- DataFrame/Dataset — высокоуровневый структурированный API
- SQL — через Spark SQL
- Streaming — через Spark Streaming
- MLlib — машинное обучение
- GraphX — обработка графов
Архитектура
Driver Process
- SparkContext
- Task Scheduler
Cluster Manager (YARN, Kubernetes, Standalone)
|
+-- Executor 1
+-- Executor 2
+-- Executor 3
PySpark пример
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, count, sum
spark = SparkSession.builder.appName("example").getOrCreate()
# Чтение данных
df = spark.read.csv("data.csv", header=True)
# Трансформация
df_filtered = df.filter(col("age") > 18)
# Агрегация
result = df_filtered.groupBy("city").agg(count("*").alias("count"))
# Вывод
result.show()
RDD vs DataFrame
RDD: Низкоуровневый, неструктурированные данные, медленнее
rdd = spark.sparkContext.parallelize([1, 2, 3, 4, 5])
rdd_squared = rdd.map(lambda x: x ** 2)
DataFrame: Структурированный, оптимизирован Catalyst optimizer, быстрее
df = spark.createDataFrame([(1,), (2,), (3,)], ["value"])
df_squared = df.withColumn("squared", col("value") ** 2)
Spark SQL
df.createOrReplaceTempView("users")
spark.sql("""
SELECT city, COUNT(*) as count
FROM users
WHERE age > 18
GROUP BY city
""").show()
Catalyst Optimizer
Spark SQL использует Catalyst optimizer для оптимизации запросов:
- Logical Planning — распарс SQL, логические операции
- Logical Optimization — оптимизация логики
- Physical Planning — выбор лучшего физического плана
- Code Generation — генерация Java кода
Partitioning и Parallelism
# Увеличить партиции для параллелизма
df_repartitioned = df.repartition(100)
# Оптимизировать по конкретной колонке
df_hash = df.repartition(50, "user_id")
# Узнать количество партиций
print(df.rdd.getNumPartitions())
Spark Jobs и Stages
- Job: Запуск action (show, collect, save)
- Stage: Группа трансформаций до shuffle
- Task: Единица работы на партиции
Когда использовать Spark
✅ Большие объёмы данных (> 10 GB) ✅ Нужны распределённые вычисления ✅ Быстрые итеративные алгоритмы ✅ Streaming обработка ✅ ML на больших данных
❌ Малые данные (< 1 GB) — используй pandas ❌ Одиночные строки — используй БД ❌ Очень низкая латентность (мс) — используй другие системы
Вывод
Apache Spark — индустриальный стандарт для Big Data обработки. Его универсальность, скорость и простота использования делают его выбором номер один для Data Engineer и Data Scientists.