Справочник конфигурации Spark
Основные параметры конфигурации Apache Spark, организованные по категориям. Используйте этот справочник при настройке production-кластеров.
Memory
| Параметр | По умолчанию | Описание |
|---|---|---|
spark.executor.memory | 1g | Heap memory для каждого executor-а. Рекомендуется 4-8 GB для production |
spark.executor.memoryOverhead | 10% от executor memory | Off-heap memory (JVM overhead, native библиотеки, PySpark). Для PySpark увеличьте до 20-30% |
spark.memory.fraction | 0.6 | Доля heap, выделенная для execution + storage (unified memory) |
spark.memory.storageFraction | 0.5 | Доля unified memory, зарезервированная для storage (cache). Execution может занять эту область |
spark.driver.memory | 1g | Heap memory для driver-а. Увеличьте при collect() больших данных |
spark.driver.maxResultSize | 1g | Максимальный размер результата action-ов (collect, take). 0 = без ограничений |
spark.memory.offHeap.enabled | false | Включить off-heap memory для Tungsten. Требует spark.memory.offHeap.size |
spark.memory.offHeap.size | 0 | Размер off-heap memory в байтах. Обычно 2-4 GB |
Shuffle
| Параметр | По умолчанию | Описание |
|---|---|---|
spark.sql.shuffle.partitions | 200 | Число shuffle-партиций для SQL/DataFrame операций. Настройте под объём данных |
spark.shuffle.compress | true | Сжатие shuffle-данных. Снижает I/O за счёт CPU |
spark.shuffle.spill.compress | true | Сжатие spill-данных при записи на диск |
spark.reducer.maxSizeInFlight | 48m | Максимальный размер shuffle-буфера на reducer. Увеличьте для сетей с высокой пропускной способностью |
spark.shuffle.file.buffer | 32k | Размер буфера записи shuffle-файлов. 64k-128k для SSD |
spark.shuffle.io.maxRetries | 3 | Число повторных попыток при ошибке fetch shuffle-данных |
spark.shuffle.io.retryWait | 5s | Задержка между retry при fetch shuffle |
spark.shuffle.sort.bypassMergeThreshold | 200 | Если число reducer-ов меньше этого порога, используется bypass merge sort |
Spark SQL и Catalyst
| Параметр | По умолчанию | Описание |
|---|---|---|
spark.sql.autoBroadcastJoinThreshold | 10MB | Таблицы меньше этого размера автоматически broadcast-ятся. -1 = отключить |
spark.sql.broadcastTimeout | 300s | Таймаут для broadcast join. Увеличьте для больших таблиц |
spark.sql.codegen.wholeStage | true | Whole-stage codegen — генерация Java-кода для цепочки операторов |
spark.sql.codegen.hugeMethodLimit | 65535 | Максимальный размер метода в байткоде. При превышении codegen отключается |
spark.sql.cbo.enabled | false | Cost-Based Optimizer. Включите для сложных join-ов (требует ANALYZE TABLE) |
spark.sql.cbo.joinReorder.enabled | false | Автоматическая перестановка join-ов по стоимости |
Adaptive Query Execution (AQE)
| Параметр | По умолчанию | Описание |
|---|---|---|
spark.sql.adaptive.enabled | true (Spark 3.2+) | Включить AQE — динамическая оптимизация во время выполнения |
spark.sql.adaptive.coalescePartitions.enabled | true | Автоматическое объединение мелких shuffle-партиций |
spark.sql.adaptive.coalescePartitions.minPartitionSize | 1MB | Минимальный размер partition после coalesce |
spark.sql.adaptive.advisoryPartitionSizeInBytes | 64MB | Целевой размер партиции при coalesce |
spark.sql.adaptive.skewJoin.enabled | true | Автоматическое разбиение skew-партиций при join |
spark.sql.adaptive.skewJoin.skewedPartitionFactor | 5 | Партиция считается skewed, если в N раз больше медианы |
spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes | 256MB | Минимальный размер партиции для признания skew |
spark.sql.adaptive.localShuffleReader.enabled | true | Локальное чтение shuffle без network fetch при coalesce |
Structured Streaming
| Параметр | По умолчанию | Описание |
|---|---|---|
spark.sql.streaming.checkpointLocation | — | Директория для checkpoint-ов (обязательно для production) |
spark.sql.streaming.minBatchesToRetain | 100 | Число micro-batch-ей, сохраняемых в checkpoint |
spark.sql.streaming.stateStore.providerClass | HDFSBackedStateStoreProvider | Provider для state store. Для production рассмотрите RocksDB |
spark.sql.streaming.forceDeleteTempCheckpointLocation | false | Удалять temp checkpoint при остановке query |
spark.sql.streaming.kafka.maxOffsetsPerTrigger | — | Максимальное число offset-ов за trigger для Kafka source. Rate limiting |
spark.sql.streaming.stateStore.rocksdb.compactOnCommit | false | Компактификация RocksDB при каждом commit. Снижает размер state |
Хранение и I/O
| Параметр | По умолчанию | Описание |
|---|---|---|
spark.sql.parquet.compression.codec | snappy | Codec сжатия Parquet: snappy, gzip, lz4, zstd |
spark.sql.orc.compression.codec | snappy | Codec сжатия ORC |
spark.sql.files.maxPartitionBytes | 128MB | Максимальный размер partition при чтении файлов |
spark.sql.files.openCostInBytes | 4MB | Оценочная стоимость открытия файла (для планирования partition-ов) |
spark.sql.parquet.mergeSchema | false | Объединять schema из всех Parquet-файлов при чтении |
spark.hadoop.parquet.enable.summary-metadata | false | Запись summary metadata. Отключите для ускорения записи |
Использование справочника
- Начните с defaults — значения по умолчанию подходят для большинства сценариев
- Профилируйте — используйте Spark UI для выявления bottleneck-ов
- Меняйте по одному — изменяйте один параметр за раз и измеряйте эффект
- Документируйте — фиксируйте изменения конфигурации и их причины
Совет: Используйте
spark.conf.get("spark.sql.shuffle.partitions")для проверки текущего значения параметра в runtime.
Migration guide: Spark 3.5 LTS → 4.0/4.1
Spark4.0Spark 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.x | Spark 4.0 (ANSI) |
|---|---|---|
SELECT 10 / 0 | NULL | ArithmeticException: Division by zero |
SELECT CAST('abc' AS INT) | NULL | Cannot cast 'abc' to INT |
SELECT CAST(2147483648 AS INT) | overflow → -2147483648 | Overflow in cast |
SELECT INT '5' + INT '2147483647' | overflow silent | Overflow in arithmetic |
SELECT a[i] для i >= length(a) | NULL | Array 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:
- Включить
spark.sql.ansi.enabled=trueна стенде Spark 3.5 - Прогнать полный набор регрессионных тестов
- Зафиксировать каждое исключение, которое раньше “молча” возвращало NULL
- Решить: business-defect (исправить) или legacy-семантика (обернуть в
try_cast/try_divide) - Только после этого мигрировать сам кластер
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 |
HiveContext | SparkSession.builder.enableHiveSupport() |
mapred-ориентированные APIs | mapreduce-эквиваленты |
| Scala 2.12 binary | Scala 2.13 (default) |
| Java 8 | Java 17 (минимум 11 для cluster, 17 рекомендуется) |
| Python 3.8 | Python 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.timestampType — TIMESTAMP_LTZ (default) или TIMESTAMP_NTZ. Если вы храните “wall clock” события — переключитесь на TIMESTAMP_NTZ.
Compatibility flags для постепенной миграции
| Флаг | Дефолт 4.0 | Назначение |
|---|---|---|
spark.sql.ansi.enabled | true | Откатить на false для legacy-семантики |
spark.sql.legacy.timeParserPolicy | CORRECTED | LEGACY для старого парсинга дат |
spark.sql.storeAssignmentPolicy | ANSI | LEGACY для silent-cast при INSERT |
spark.sql.legacy.allowNegativeScaleOfDecimal | false | Restore decimal с отрицательным scale |
spark.sql.legacy.respectNullableInTextDatasetConversion | false | Preserve nullable в text-readers |
spark.sql.legacy.charVarcharAsString | false | CHAR/VARCHAR как STRING без padding |
10-step migration playbook
- Audit — пройтись по pipeline, найти все
cast(), division, array-indexing, JSON-readers без явной схемы. - Enable ANSI на 3.5 — в staging-окружении с
spark.sql.ansi.enabled=true. - Fix или wrap — каждое падение либо исправить логику, либо обернуть в
try_*. - Update connectors — Delta 4.0 (требует Spark 4.0), Iceberg 1.5+, Hudi 1.0+.
- Update Java/Scala/Python — поднять runtime до Java 17, Scala 2.13, Python 3.9+.
- Test deprecation paths — убрать
SQLContextиHiveContextещё до миграции. - Migrate cluster — обновить Spark binary до 4.0 (или 4.1 если уже доступен).
- Re-run regression suite — zero-error baseline на 4.0.
- Re-enable optimizations — Spark Connect, ANSI,
TIMESTAMP_NTZгде уместно. - Remove compat flags — после стабилизации убрать все
legacy.*флаги.
Не пытайтесь мигрировать “одним подходом”. На production-нагрузках с тысячами SQL-запросов миграция занимает 4-8 недель. ANSI mode выявляет latent bugs, которые годами были скрыты. Лучшая практика: enable ANSI в 3.5, исправить все ошибки, и только потом переключать кластер на 4.0.
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.