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 ORC | Apache Parquet |
|---|---|---|
| Разработчик | Hortonworks (Cloudera) | Twitter и Cloudera |
| Сжатие | Zlib, Snappy, LZO, ZSTD | Snappy, 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 →


