Бинарные данные в таблицах
В данном разделе собрана информация о том, как использовать таблицы для хранения бинарных данных.
Общие сведения
Иногда необходимо сохранять бинарные данные из джобов.
Очевидное решение заключается в том, чтобы писать из каждого джоба файл в Кипарис.
Но у этого способа есть недостатки:
- Создается высокая нагрузка на прокси.
- Появляется большое количество объектов в Кипарисе, что негативно сказывается на эффективности работы с ними.
Поэтому предпочтительнее записывать бинарные данные в одну таблицу:
- Данные разбиваются на части и сохраняются в отдельные строки таблицы. У этой таблицы должен быть набор ключевых колонок, которые однозначно определяют файл: имя и путь. Кроме того, должна быть колонка, отвечающая за номер BLOB с данными и колонка, отвечающая за сами данные. Таблица должна быть отсортирована по набору ключевых колонок и по колонке с номером BLOB, чтобы были возможны точечные чтения по ключу, задающему имя файла.
- Для файла все BLOB, кроме последнего, должны иметь одинаковый размер, например, 4МБ. Колонки с данными и номером BLOB должны иметь имена
data
иpart_index
соответственно.
Таблицы, удовлетворяющие описанным условиям, — BLOB-таблицы.
Внутри YTsaurus BLOB-таблицы используются для хранения stderr и core-файлов, порождаемых джобами операций.
Например, в таблице с stderr операции имеется 3 колонки: job_id
, part_index
и data
, таблица отсортирована по job_id
и part_index
.
Команда read_blob_table
Для удобного чтения данных из BLOB-таблиц реализована специальная команда read_blob_table
.
Команда принимает на вход путь к таблице. На выход данная команда передает поток бинарных данных.
Также команда проверяет, что индексы читаемых BLOB начинаются с нуля и идут без пропусков.
Команда имеет параметры part_index_column_name
и data_column_name
, позволяющие задать имена колонок с номером BLOB и данными соответственно. По умолчанию эти имена равны part_index
и data
.
Запуск операции и чтение stderr джоба из таблицы с BLOB:
yt.run_map("....; echo 'something' >&2;", "//tmp/input", "//tmp/output", stderr_table="//tmp/stderr_table")
yt read-blob-table '<exact={key=["cc26aa85-a694bf6b-3fe0384-963"]}>//tmp/stderr_table'