Бинарные данные в таблицах

В данном разделе собрана информация о том, как использовать таблицы для хранения бинарных данных.

Общие сведения

Иногда необходимо сохранять бинарные данные из джобов.
Очевидное решение заключается в том, чтобы писать из каждого джоба файл в Кипарис.
Но у этого способа есть недостатки:

  • Создается высокая нагрузка на прокси.
  • Появляется большое количество объектов в Кипарисе, что негативно сказывается на эффективности работы с ними.

Поэтому предпочтительнее записывать бинарные данные в одну таблицу:

  1. Данные разбиваются на части и сохраняются в отдельные строки таблицы. У этой таблицы должен быть набор ключевых колонок, которые однозначно определяют файл: имя и путь. Кроме того, должна быть колонка, отвечающая за номер BLOB с данными и колонка, отвечающая за сами данные. Таблица должна быть отсортирована по набору ключевых колонок и по колонке с номером BLOB, чтобы были возможны точечные чтения по ключу, задающему имя файла.
  2. Для файла все 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'