Перейти к содержанию
Learning Platform
Глоссарий Troubleshooting
Урок 14.01 · 15 мин
Средний
КонфигурацияMemoryShuffleSQLStreamingAQE

Справочник конфигурации Spark

Основные параметры конфигурации Apache Spark, организованные по категориям. Используйте этот справочник при настройке production-кластеров.


Memory

ПараметрПо умолчаниюОписание
spark.executor.memory1gHeap memory для каждого executor-а. Рекомендуется 4-8 GB для production
spark.executor.memoryOverhead10% от executor memoryOff-heap memory (JVM overhead, native библиотеки, PySpark). Для PySpark увеличьте до 20-30%
spark.memory.fraction0.6Доля heap, выделенная для execution + storage (unified memory)
spark.memory.storageFraction0.5Доля unified memory, зарезервированная для storage (cache). Execution может занять эту область
spark.driver.memory1gHeap memory для driver-а. Увеличьте при collect() больших данных
spark.driver.maxResultSize1gМаксимальный размер результата action-ов (collect, take). 0 = без ограничений
spark.memory.offHeap.enabledfalseВключить off-heap memory для Tungsten. Требует spark.memory.offHeap.size
spark.memory.offHeap.size0Размер off-heap memory в байтах. Обычно 2-4 GB

Shuffle

ПараметрПо умолчаниюОписание
spark.sql.shuffle.partitions200Число shuffle-партиций для SQL/DataFrame операций. Настройте под объём данных
spark.shuffle.compresstrueСжатие shuffle-данных. Снижает I/O за счёт CPU
spark.shuffle.spill.compresstrueСжатие spill-данных при записи на диск
spark.reducer.maxSizeInFlight48mМаксимальный размер shuffle-буфера на reducer. Увеличьте для сетей с высокой пропускной способностью
spark.shuffle.file.buffer32kРазмер буфера записи shuffle-файлов. 64k-128k для SSD
spark.shuffle.io.maxRetries3Число повторных попыток при ошибке fetch shuffle-данных
spark.shuffle.io.retryWait5sЗадержка между retry при fetch shuffle
spark.shuffle.sort.bypassMergeThreshold200Если число reducer-ов меньше этого порога, используется bypass merge sort

Spark SQL и Catalyst

ПараметрПо умолчаниюОписание
spark.sql.autoBroadcastJoinThreshold10MBТаблицы меньше этого размера автоматически broadcast-ятся. -1 = отключить
spark.sql.broadcastTimeout300sТаймаут для broadcast join. Увеличьте для больших таблиц
spark.sql.codegen.wholeStagetrueWhole-stage codegen — генерация Java-кода для цепочки операторов
spark.sql.codegen.hugeMethodLimit65535Максимальный размер метода в байткоде. При превышении codegen отключается
spark.sql.cbo.enabledfalseCost-Based Optimizer. Включите для сложных join-ов (требует ANALYZE TABLE)
spark.sql.cbo.joinReorder.enabledfalseАвтоматическая перестановка join-ов по стоимости

Adaptive Query Execution (AQE)

ПараметрПо умолчаниюОписание
spark.sql.adaptive.enabledtrue (Spark 3.2+)Включить AQE — динамическая оптимизация во время выполнения
spark.sql.adaptive.coalescePartitions.enabledtrueАвтоматическое объединение мелких shuffle-партиций
spark.sql.adaptive.coalescePartitions.minPartitionSize1MBМинимальный размер partition после coalesce
spark.sql.adaptive.advisoryPartitionSizeInBytes64MBЦелевой размер партиции при coalesce
spark.sql.adaptive.skewJoin.enabledtrueАвтоматическое разбиение skew-партиций при join
spark.sql.adaptive.skewJoin.skewedPartitionFactor5Партиция считается skewed, если в N раз больше медианы
spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes256MBМинимальный размер партиции для признания skew
spark.sql.adaptive.localShuffleReader.enabledtrueЛокальное чтение shuffle без network fetch при coalesce

Structured Streaming

ПараметрПо умолчаниюОписание
spark.sql.streaming.checkpointLocationДиректория для checkpoint-ов (обязательно для production)
spark.sql.streaming.minBatchesToRetain100Число micro-batch-ей, сохраняемых в checkpoint
spark.sql.streaming.stateStore.providerClassHDFSBackedStateStoreProviderProvider для state store. Для production рассмотрите RocksDB
spark.sql.streaming.forceDeleteTempCheckpointLocationfalseУдалять temp checkpoint при остановке query
spark.sql.streaming.kafka.maxOffsetsPerTriggerМаксимальное число offset-ов за trigger для Kafka source. Rate limiting
spark.sql.streaming.stateStore.rocksdb.compactOnCommitfalseКомпактификация RocksDB при каждом commit. Снижает размер state

Хранение и I/O

ПараметрПо умолчаниюОписание
spark.sql.parquet.compression.codecsnappyCodec сжатия Parquet: snappy, gzip, lz4, zstd
spark.sql.orc.compression.codecsnappyCodec сжатия ORC
spark.sql.files.maxPartitionBytes128MBМаксимальный размер partition при чтении файлов
spark.sql.files.openCostInBytes4MBОценочная стоимость открытия файла (для планирования partition-ов)
spark.sql.parquet.mergeSchemafalseОбъединять schema из всех Parquet-файлов при чтении
spark.hadoop.parquet.enable.summary-metadatafalseЗапись summary metadata. Отключите для ускорения записи

Использование справочника

  1. Начните с defaults — значения по умолчанию подходят для большинства сценариев
  2. Профилируйте — используйте Spark UI для выявления bottleneck-ов
  3. Меняйте по одному — изменяйте один параметр за раз и измеряйте эффект
  4. Документируйте — фиксируйте изменения конфигурации и их причины

Совет: Используйте spark.conf.get("spark.sql.shuffle.partitions") для проверки текущего значения параметра в runtime.


Migration guide: Spark 3.5 LTS → 4.0/4.1

Spark4.0

Spark 4.0 — первая major-версия за пять лет (3.0 вышел в 2020). Между 3.5 LTS и 4.0 есть набор breaking changes, которые требуют явного внимания при миграции production-нагрузок.

Breaking change 1: ANSI SQL mode включён по умолчанию

Самое большое изменение. До 4.0 spark.sql.ansi.enabled = false означало, что Spark при ошибочных операциях возвращал NULL вместо исключения. В 4.0 дефолт перевернулся: spark.sql.ansi.enabled = true.

ОперацияSpark 3.xSpark 4.0 (ANSI)
SELECT 10 / 0NULLArithmeticException: Division by zero
SELECT CAST('abc' AS INT)NULLCannot cast 'abc' to INT
SELECT CAST(2147483648 AS INT)overflow → -2147483648Overflow in cast
SELECT INT '5' + INT '2147483647'overflow silentOverflow in arithmetic
SELECT a[i] для i >= length(a)NULLArray index out of bounds
# Откатить дефолт на legacy-поведение (на время миграции)
spark.conf.set("spark.sql.ansi.enabled", "false")

# Лучшая стратегия: включить ANSI на 3.5 заранее
# и пройтись по всем pipeline для отлова latent bugs
spark = SparkSession.builder \
    .config("spark.sql.ansi.enabled", "true") \
    .getOrCreate()

Migration strategy:

  1. Включить spark.sql.ansi.enabled=true на стенде Spark 3.5
  2. Прогнать полный набор регрессионных тестов
  3. Зафиксировать каждое исключение, которое раньше “молча” возвращало NULL
  4. Решить: business-defect (исправить) или legacy-семантика (обернуть в try_cast/try_divide)
  5. Только после этого мигрировать сам кластер

Breaking change 2: новые typed-функции для безопасных операций

Spark 4.0 формализует “try*” семейство функций — версии операций, которые возвращают NULL вместо exception (как было в 3.x):

from pyspark.sql.functions import try_cast, try_divide, try_add

# До 4.0: cast возвращал NULL при ошибке
df.withColumn("amount_int", col("amount").cast("int"))

# В 4.0 ANSI: throws -> используйте try_cast
df.withColumn("amount_int", try_cast(col("amount"), "int"))

# Безопасное деление
df.withColumn("ratio", try_divide(col("a"), col("b")))  # NULL если b=0

Breaking change 3: удалённые APIs

Удалено в 4.0Замена
SQLContext (deprecated с 2.0)SparkSession
HiveContextSparkSession.builder.enableHiveSupport()
mapred-ориентированные APIsmapreduce-эквиваленты
Scala 2.12 binaryScala 2.13 (default)
Java 8Java 17 (минимум 11 для cluster, 17 рекомендуется)
Python 3.8Python 3.9+

Breaking change 4: изменения в data sources

# Spark 3.x: read.json делал schema inference по умолчанию
df = spark.read.json("path")

# Spark 4.0: всё ещё работает, но schema inference -- более строгая
# Recommendation: явно задавать схему
df = spark.read.schema(known_schema).json("path")

JSON inference в 4.0:

  • Числа без знака не приводятся к LongType автоматически (стало честное определение типа)
  • dropFieldIfAllNull сейчас работает корректно (3.5 имел бажный edge case)
  • Encoding по умолчанию — UTF-8 (раньше зависело от platform)

Breaking change 5: timestamp семантика

# Spark 3.x: TIMESTAMP без timezone был ambiguous
# Spark 4.0: TIMESTAMP_NTZ (без timezone) и TIMESTAMP_LTZ (local) -- разделены
spark.sql("SELECT CAST('2026-01-15 10:00:00' AS TIMESTAMP_NTZ)")  // 4.0

spark.sql.timestampTypeTIMESTAMP_LTZ (default) или TIMESTAMP_NTZ. Если вы храните “wall clock” события — переключитесь на TIMESTAMP_NTZ.

Compatibility flags для постепенной миграции

ФлагДефолт 4.0Назначение
spark.sql.ansi.enabledtrueОткатить на false для legacy-семантики
spark.sql.legacy.timeParserPolicyCORRECTEDLEGACY для старого парсинга дат
spark.sql.storeAssignmentPolicyANSILEGACY для silent-cast при INSERT
spark.sql.legacy.allowNegativeScaleOfDecimalfalseRestore decimal с отрицательным scale
spark.sql.legacy.respectNullableInTextDatasetConversionfalsePreserve nullable в text-readers
spark.sql.legacy.charVarcharAsStringfalseCHAR/VARCHAR как STRING без padding

10-step migration playbook

  1. Audit — пройтись по pipeline, найти все cast(), division, array-indexing, JSON-readers без явной схемы.
  2. Enable ANSI на 3.5 — в staging-окружении с spark.sql.ansi.enabled=true.
  3. Fix или wrap — каждое падение либо исправить логику, либо обернуть в try_*.
  4. Update connectors — Delta 4.0 (требует Spark 4.0), Iceberg 1.5+, Hudi 1.0+.
  5. Update Java/Scala/Python — поднять runtime до Java 17, Scala 2.13, Python 3.9+.
  6. Test deprecation paths — убрать SQLContext и HiveContext ещё до миграции.
  7. Migrate cluster — обновить Spark binary до 4.0 (или 4.1 если уже доступен).
  8. Re-run regression suite — zero-error baseline на 4.0.
  9. Re-enable optimizations — Spark Connect, ANSI, TIMESTAMP_NTZ где уместно.
  10. Remove compat flags — после стабилизации убрать все legacy.* флаги.
WARNING

Не пытайтесь мигрировать “одним подходом”. На production-нагрузках с тысячами SQL-запросов миграция занимает 4-8 недель. ANSI mode выявляет latent bugs, которые годами были скрыты. Лучшая практика: enable ANSI в 3.5, исправить все ошибки, и только потом переключать кластер на 4.0.

INFO

Spark 4.1 — minor-релиз поверх 4.0 без дополнительных breaking changes (политика API stability в major-line). Если вы переходите на 4.x, целиться сразу на последний 4.x — нет смысла застревать на 4.0.0. Между 4.0 и 4.1 добавлены новые pipe-операторы, дополнения в SQL UDFs и улучшения Spark Connect, но никаких удалений APIs.

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 2