Конференция Arenadata
ArenaTech 2026 – для всех, кому интересны технологии Big Data
Приглашаем вас принять участие в технической онлайн-конференции, посвященной работе с большими данными. Участие бесплатно для всех желающих.

В программе 3 блока докладов:

  • СУБД: архитектура и эксплуатация. Обсудим новые возможности Greengage DB и Arenadata DB на его основе, включая hot standby, обзор утилиты изменения кластерной топологии ggrebalance, вопросы безопасности и устранения CVE.
  • Платформа данных: безопасность и Kubernetes в ADH, аналитика в ADQM. Расскажем об управлении секретами и доступом в Arenadata Hyperwave с использованием OpenBao, особенности переноса сервисов в Kubernetes, а также про аналитические методы в инструментах ADQM.
  • Инструменты: кластерный менеджер, документация, ИИ-поиск. Поделимся опытом разработки технической документации (включая интеллектуальный поиск и ИИ-ассистент) и поговорим про развитие нашего кластерного менеджера ADCM.
Онлайн-конференция состоится 29 октября 2026 года, время трансляции: с 12:00 до 19:00 по московскому времени.
Осталось до события

Перезапись непартиционированных таблиц Hive

В данной статье описаны особенности записи данных в непартиционированные (unpartitioned) таблицы Hive с помощью сервиса Spark3.

Стандартная процедура перезаписи

По умолчанию при использовании Spark для записи данных в непартиционированную таблицу Hive в режиме перезаписи (overwrite mode) иногда возможны потери данных при определенных условиях и настройках. Пример кода Spark для записи содержимого DataFrame в таблицу в режиме перезаписи приведен ниже.

df.write \
  .mode("overwrite") \
  .format("orc") \
  .insertInto(table_name)

Следующие параметры Spark могут использоваться для обеспечения pushdown-операций и оптимизации работы:

spark.sql.hive.convertMetastoreOrc = true
spark.sql.hive.convertMetastoreParquet = true

Если установлено значение spark.sql.hive.convertMetastoreOrc=true, при перезаписи возможны периодические потери данных из-за особенностей реализации протокола коммита, используемого в Spark по умолчанию. Алгоритм работы стандартного протокола коммита изображен на следующей схеме.

Стандартная реализация протокола коммита
Стандартная реализация протокола коммита
Стандартная реализация протокола коммита
Стандартная реализация протокола коммита

OverwriteOnCommitProtocol

Чтобы избежать такого поведения и настроить Spark на выполнение перезаписи только после успешной записи DataFrame во временную директорию, необходимо использовать специальную реализацию протокола коммита (OverwriteOnCommitProtocol). Существует несколько способов активации этого протокола, которые описаны ниже.

  • Глобальные настройки

  • Переопределение на уровне задачи

  • Явное указание при создании SparkSession

Используя ADCM, укажите следующий параметр в Custom spark-defaults.conf (Clusters → <ADHclusterName> → Services → Spark3 → Primary configuration) и перезапустите сервис Spark3:

spark.sql.sources.commitProtocolClass=org.apache.spark.sql.execution.datasources.OverwriteOnCommitProtocol

Это позволяет Spark использовать OverwriteOnCommitProtocol по умолчанию для всех задач.

Чтобы активировать протокол для конкретной задачи, укажите конфигурационный параметр при запуске spark-submit:

$ spark-submit
    --conf spark.sql.sources.commitProtocolClass=org.apache.spark.sql.execution.datasources.OverwriteOnCommitProtocol
    ..

Протокол можно явно указать при создании объекта SparkSession в коде PySpark:

from pyspark.sql import SparkSession

spark = SparkSession.builder \
.appName("MyApp") \
.config("spark.sql.sources.commitProtocolClass", "org.apache.spark.sql.execution.datasources.OverwriteOnCommitProtocol") \
.config("spark.sql.hive.convertMetastoreOrc", "true") \
.config("spark.sql.hive.convertMetastoreParquet", "true") \
.enableHiveSupport() \
.getOrCreate()

Требования и рекомендации

При использовании OverwriteOnCommitProtocol стоит учитывать следующее:

  • Убедитесь, что значение spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version равно 1 (значение по умолчанию).

  • Не рекомендуется использование с объектными хранилищами S3 из-за низкой скорости работы.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней