Parquet и ORC-форматы в YTsaurus

Рассказываем, какие преимущества дают форматы Parquet и ORC в YTsaurus

В YTsaurus поддерживается множество форматов представления данных (JSON, TSKV и другие), но при выгрузке крупных таблиц они далеко не всегда оказываются оптимальными — как с точки зрения занимаемого дискового пространства, так и с точки зрения нагрузки на оперативную память и сетевой канал.

Например, представим таблицу объёмом 40 ГБ внутри YTsaurus. При выгрузке её в формате TSKV или JSON она может занимать до 200 ГБ и более. В результате:

  • существенно растут требования к хранилищу на диске;
  • увеличивается время передачи данных по сети;
  • возрастают накладные расходы при последующем преобразовании (особенно если вы, например, читаете таблицу как список словарей и создаёте DataFrame):
data = yt_client.read_table(table_path)   # получаем list[dict]
df = pd.DataFrame(data)

Чтобы избежать недостатков текстовых форматов при выгрузке больших таблиц, в YTsaurus добавлена поддержка колоночных бинарных форматов Parquet и ORC — и в Python API, и в виде отдельных команд CLI. Parquet (изначально разработанный для экосистемы Hadoop) и ORC (оптимизированный под хранение и обработку данных в Hive) гарантируют эффективное сжатие, строгую схему и быстрый доступ к нужным столбцам.

Ниже перечислены ключевые преимущества Parquet и ORC в YTsaurus:

  • Чтение таблиц с поколоночным форматом хранения данных (optimize_for = scan) в этих форматах требует существенно меньше ресурсов CPU на клиенте и на проксях YTsaurus, чем чтение в любом строковом формате.
  • Бинарные форматы Parquet и ORC обеспечивают более плотное хранение данных. В результате итоговый объём файлов часто оказывается в несколько раз меньше по сравнению с выгрузкой в TSKV, JSON или других поддерживаемых форматах.
  • Работать с этими форматами просто и удобно. Во многих языках есть библиотеки для работы с ним. Например, в Python можно с помощью одной строки кода преобразовать Parquet или ORC файл в DataFrame или работать напрямую с файлом с помощью pyarrow, fastparquet для формата Parquet или pyorc для ORC формата;
  • Поддержано несколько способов скачивать таблицу параллельно в несколько потоков, в том числе и наиболее быстрый вариант, когда таблица представляется в виде нескольких файлов на диске, который скачиваются параллельно (надо проставить опцию enable_several_files и указать желаемую директорию, в которой создадутся выходные файлы).

Ниже приведены сравнительные характеристики скорости чтения и занимаемого места на диске для таблицы с объёмом данных 3.37 GiB в разных форматах:

TSKV YSON Parquet ORC
Размер на диске 22G 21G 3.8G 1.5G
Время параллельного чтения 6min 5.5min 1min 0.2min

Ниже приведены наиболее часто используемые команды для работы с Parquet и ORC в YTsaurus:

# 1. Чтение таблицы в Parquet (один файл):
yt dump-parquet \
    --proxy my-cluster.ytsaurus.tech \
    --table //home/dev/tutorial/is_robot_unsorted_schematized \
    --output-path file.parquet

# 2. Чтение таблицы в ORC (один файл):
yt dump-orc \
    --proxy my-cluster.ytsaurus.tech \
    --table //home/dev/tutorial/is_robot_unsorted_schematized \
    --output-path file.orc

# 3. Параллельное чтение в Parquet (несколько файлов в выходной директории):
yt dump-parquet \
    --proxy my-cluster.ytsaurus.tech \
    --table //home/dev/tutorial/is_robot_unsorted_schematized \
    --output-path ./output_directory \
    --enable-several-files \
    --config "{read_parallel={enable=%true; max_thread_count=10;}}"

# 4. Параллельное чтение в Parquet (один файл, но с многопоточностью):
yt dump-parquet \
    --proxy my-cluster.ytsaurus.tech \
    --table //home/dev/tutorial/is_robot_unsorted_schematized \
    --output-path file.parquet \
    --config "{read_parallel={enable=%true; max_thread_count=10;}}"

# 5. Загрузка таблицы из Parquet‑файла:
yt upload-parquet \
    --proxy my-cluster.ytsaurus.tech \
    --input-file file.parquet \
    --table //tmp/my-parquet-table

# 6. Загрузка таблицы из ORC‑файла:
yt upload-orc \
    --proxy my-cluster.ytsaurus.tech \
    --input-file file.orc \
    --table //tmp/my-orc-table

В каждом из примеров:

--proxy my-cluster.ytsaurus.tech указывает адрес YTsaurus‑прокси (замените на адрес своего кластера).
--table задаёт путь до таблицы в YTsaurus (при чтении — исходная таблица, при загрузке — целевая таблица).
--output-path (при dump) или --input-file (при upload) определяет локальный файл или директорию.

Загрузка Parquet и ORC файлов из внешних источников

Зачастую данные хранятся не только внутри YTsaurus, но и на внешних платформах. Чтобы избежать промежуточного хранения на локальной машине и ускорить процесс, реализована возможность загружать сразу несколько Parquet/ORC‑файлов из популярных внешних хранилищ напрямую в YTsaurus.

Утилита располагается здесь. Чтобы ее собрать, необходимо сделать следующее:

git clone git@github.com:ytsaurus/ytsaurus.git
cd ytsaurus
./ya make -r yt/yt/tools/import_table
cd yt/yt/tools/import_table

Ниже рассмотрены два источника, из которых поддержан импорт файлов.

HuggingFace Datasets

HuggingFace Datasets автоматически преобразует большинство датасетов в Parquet. Это позволяет одним вызовом загрузить нужный «сплит» (train/validation/test) прямо в таблицу YTsaurus.

./import_table huggingface \
    --proxy my-cluster.ytsaurus.tech \
    --dataset Deysi/spanish-chinese \
    --split train \
    --output //tmp/result_parquet_table

--dataset Deysi/spanish-chinese — идентификатор датасета на HuggingFace.
--split train — выбираемый сплит (например, train, validation или test).
--output //tmp/result_parquet_table — целевая таблица в YTsaurus, куда будут загружены данные.

S3

S3 — это наиболее популярное облачное объектное хранилище. Команда позволяет сканировать префикс внутри бакета и загружать сразу все найденные Parquet/ORC‑файлы в одну таблицу YTsaurus.

./import_table s3 \
    --proxy my-cluster.ytsaurus.tech \
    --url https://s3.yandexcloud.net \
    --region ru-central1 \
    --bucket bucket_name \
    --prefix common_parquet_files_prefix \
    --output //tmp/result_parquet_table

--url — точка доступа к S3 (например, https://s3.yandexcloud.net).
--region — регион (необходимо для S3‑совместимых хранилищ с поддержкой регионов, например Яндекс.Облако).
--bucket bucket_name — имя бакета, где лежат Parquet/ORC‑файлы.
--prefix common_parquet_files_prefix — «папка» или префикс внутри бакета, где искать файлы.
--output //tmp/result_parquet_table — целевая таблица в YTsaurus, куда будут загружены данные.

Загрузка файлов выполняется параллельно при помощи Map‑Reduce операций YTsaurus. Такой подход позволяет эффективно загружать большие объёмы данных с существенным выигрышем по времени, чем делать это вручную со своей машины.

Parquet и ORC-форматы в YTsaurus
Войдите, чтобы сохранить пост