Открыть сервис

Apache ORC

Apache ORC (Optimized Row Columnar) — это формат хранения данных в колоночном (столбцовом) представлении, предназначенный для работы с большими объёмами информации в экосистеме Apache Hadoop. Он был разработан для оптимизации операций чтения, сжатия и обработки данных в распределённых вычислительных системах, таких как Apache Hive, Apache Spark и Apache Flink. ORC относится к категории столбцовых форматов (columnar storage), что позволяет эффективно выполнять аналитические запросы, агрегации и фильтрацию, сокращая объём передаваемых данных и время выполнения задач.

История

Формат ORC был создан в 2013 году инженерами компании Hortonworks (позднее вошедшей в состав Cloudera) для решения проблем производительности, связанных с использованием формата Apache Avro и текстовых форматов (CSV, JSON) в системе Apache Hive. Первоначально ORC использовался как внутренний формат Hive, но в 2015 году был передан в инкубатор Apache Software Foundation и получил статус проекта верхнего уровня (Top-Level Project) в 2016 году. С тех пор ORC стал одним из стандартных форматов для хранения данных в Hadoop-экосистеме, наряду с Apache Parquet и Apache Avro.

Основной мотивацией для создания ORC стало стремление уменьшить размер хранимых данных и ускорить выполнение запросов за счёт колоночного сжатия и продвинутой статистики. В 2017 году была выпущена версия 1.4, добавившая поддержку вложенных структур данных (struct, map, list) и улучшенное сжатие. В 2019 году вышла версия 1.6, которая ввела поддержку формата данных Apache Arrow и улучшила производительность записи.

Архитектура и устройство

Файл ORC состоит из трёх основных разделов: заголовка (header), тела (body) и хвоста (footer). Заголовок содержит магическое число «ORC» и версию формата. Тело разделено на полосы (stripes), каждая из которых представляет собой группу строк (по умолчанию — 64 000 строк). Хвост содержит метаданные о файле: количество строк, схему данных, статистику (минимум, максимум, количество нулевых значений) для каждого столбца и каждой полосы, а также индексы для быстрого поиска.

Структура полосы

Каждая полоса состоит из трёх частей:

  • Индексные данные (Index Data) — содержит статистику по группам строк (row groups) внутри полосы. Это позволяет при выполнении запроса с условием (WHERE) пропускать целые группы строк, если они не удовлетворяют условию.
  • Данные строк (Row Data) — собственно колоночные данные, сжатые с использованием алгоритмов (Zlib, Snappy, LZO, ZSTD). Каждый столбец хранится отдельно, что позволяет считывать только нужные столбцы.
  • Стрим-буферы (Stream Buffers) — вспомогательные данные для восстановления значений (например, словари для строковых типов).

Колоночное хранение

В отличие от строчных форматов (CSV, Avro), где все столбцы одной строки хранятся вместе, в ORC данные каждого столбца хранятся последовательно. Это даёт преимущество при аналитических запросах, которые часто обращаются только к нескольким столбцам из многих. Например, для запроса «SELECT sum(amount) FROM sales WHERE year=2024» будет считан только столбец «amount» и столбец «year», а остальные столбцы (например, «customer_name», «address») будут проигнорированы.

Ключевые характеристики

  • Сжатие — ORC поддерживает несколько алгоритмов сжатия: Zlib (высокая степень сжатия), Snappy (быстрое сжатие/распаковка), LZO и ZSTD. Выбор алгоритма влияет на соотношение размера файла и скорости чтения.
  • Статистика и индексация — для каждого столбца и каждой группы строк хранятся минимальное и максимальное значения, количество нулевых значений, а для строковых типов — словарь. Это позволяет выполнять предикативное просеивание (predicate pushdown) — пропускать блоки данных, не удовлетворяющие условию.
  • Поддержка сложных типов — ORC поддерживает вложенные структуры: struct, map, list, union. Это позволяет хранить данные, соответствующие современным схемам (например, JSON-подобные объекты).
  • Эволюция схемы — ORC допускает добавление новых столбцов в схему без перезаписи существующих файлов. Старые файлы при чтении автоматически дополняются значениями NULL для отсутствующих столбцов.
  • Производительность — благодаря колоночному хранению и индексации, ORC обеспечивает высокую скорость чтения при аналитических запросах, особенно при фильтрации по условиям. Запись данных в ORC, как правило, медленнее, чем в строчные форматы, из-за необходимости вычислять статистику и сжимать данные.

Применение

ORC широко используется в системах, работающих с большими данными (Big Data), особенно в сценариях, где требуется высокая производительность аналитических запросов:

  • Apache Hive — ORC является рекомендуемым форматом для таблиц Hive, так как он позволяет выполнять запросы в 2–5 раз быстрее, чем с текстовыми файлами или Avro.
  • Apache Spark — Spark поддерживает чтение и запись ORC через встроенный модуль. ORC используется для хранения промежуточных результатов и финальных данных в ETL-процессах.
  • Apache Flink — Flink может читать и писать данные в ORC, что полезно для потоковой обработки с последующим анализом.
  • Presto/Trino — эти движки SQL-запросов поддерживают ORC, используя его колоночную природу для ускорения запросов.
  • Amazon EMR и Google Cloud Dataprocоблачные сервисы Hadoop также поддерживают ORC.

Сравнение с другими форматами

ORC часто сравнивают с Apache Parquet, другим популярным колоночным форматом. Оба формата имеют схожие характеристики, но есть различия:

ХарактеристикаApache ORCApache Parquet
РазработчикHortonworks (Cloudera)Twitter и Cloudera
СжатиеZlib, Snappy, LZO, ZSTDSnappy, Gzip, LZO, ZSTD
ИндексацияВстроенная статистика по группам строкМинимальная статистика, поддержка страниц
Поддержка сложных типовДа (struct, map, list, union)Да (struct, map, list, repeated)
Эволюция схемыДа (добавление столбцов)Да (добавление столбцов, переименование)
Производительность чтенияВысокая при фильтрацииВысокая при проекции (выборке столбцов)
РаспространённостьВ основном в Hive и SparkШире в Spark и Presto

В целом, выбор между ORC и Parquet зависит от конкретной системы и сценария: ORC часто предпочтительнее в Hive, а Parquet — в Spark и Presto.

Интересные факты

  • Формат ORC изначально назывался «Optimized Row Columnar», но в 2015 году было решено оставить аббревиатуру без расшифровки, чтобы избежать путаницы с другими форматами.
  • ORC поддерживает автоматическое определение типов данных при записи, что упрощает создание схемы для неструктурированных данных.
  • В 2020 году в ORC была добавлена поддержка формата Apache Arrow, что позволяет передавать данные между системами без копирования.

Критика

Основным недостатком ORC считается его более низкая производительность при записи по сравнению с некоторыми другими форматами, особенно при использовании сжатия Zlib. Кроме того, ORC менее распространён в экосистемах, не связанных с Hadoop, например, в Python-библиотеках (pandas) поддержка ORC появилась относительно недавно. Также ORC хуже подходит для потоковой записи (append-only), так как требует буферизации данных для формирования полос.

Источники

  • Apache ORC Project Documentation, официальный сайт проекта (orc.apache.org).
  • White Paper: «ORC: Optimized Row Columnar Storage» by Hortonworks (2013).
  • «Hadoop: The Definitive Guide» by Tom White (4th edition, 2015).
  • Документация Apache Hive, раздел «ORC Format».
  • Сравнительный анализ форматов хранения данных в Hadoop-экосистеме (статья на Habr, 2018).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →