
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. Такой подход позволяет эффективно загружать большие объёмы данных с существенным выигрышем по времени, чем делать это вручную со своей машины.