|
| 1 | +# Трансфер данных |
| 2 | + |
| 3 | +Трансфер в {{ ydb-short-name }} — асинхронный механизм переноса данных из [топика](glossary.md#topic) в таблицу. [Создание](../yql/reference/syntax/create-transfer.md) экземпляра трансфера, его [изменение](../yql/reference/syntax/alter-transfer.md) и [удаление](../yql/reference/syntax/drop-transfer.md) осуществляет с использованием YQL. Трансфер запускается внутри базы данных, работает в фоновом режиме. Трансфер используется для решения задачи поставки данных из топика в таблицу. |
| 4 | + |
| 5 | +Часто на практике удобнее записывать данные не напрямую в таблицу, а в топик, чтобы затем в асинхронном режиме переписывать их из топика в таблицу. Такой подход позволяет равномерно распределять нагрузку и справляться со всплесками, поскольку операция записи в очередь сообщений более лёгкая. В зависимости от количества записываемых сообщений в топик, задержка доступности данных для чтения из таблицы после добавления в топик может составлять от нескольких секунд до нескольких минут. |
| 6 | + |
| 7 | +Трансфер осуществляет чтение сообщений из указанного топика, их преобразование в формат, пригодный для записи в таблицу, и последующую запись в целевую таблицу. Если в таблице уже есть строка с указанным [первичным ключом](glossary.md#primary-key), то строка будет обновлена. Преобразование данных осуществляется с помощью [lambda-функции](../yql/reference/syntax/expressions.md#lambda), которая принимает сообщение в качестве параметра и возвращает список [структур](../yql/reference/types/containers.md), каждая из которых соответствует строке, подлежащей добавлению или замене в таблице. Например, если таблица содержит колонку `example_column` типа `Int32`, структура должна включать именованное поле `example_column` того же типа. |
| 8 | +Если [lambda-функция](../yql/reference/syntax/expressions.md#lambda) возвращает пустой список, ни одна строка в таблице не будет изменена. Из lambda-функции не допускается обращение к таблицам и другим объектам {{ ydb-short-name }}. |
| 9 | +Используемую lambda-функцию можно получить из [описания](../reference/ydb-cli/commands/scheme-describe.md) экземпляра трансфера. |
| 10 | + |
| 11 | +На работу трансфера тратятся дополнительные ресурсы сервера, в первую очередь CPU. Потребление CPU зависит от сложности преобразования записываемых в топик данных. |
| 12 | + |
| 13 | +Трансфер способен читать данные из топиков, расположенных как в [базе данных](glossary.md#database), где он создаётся, так и в другой базе {{ ydb-short-name }} или [кластере](glossary.md#cluster) {{ ydb-short-name }}. Для чтения топика из другой базы данных при создании трансфера необходимо указать параметры подключения к этой базе. Целевая таблица должна находиться в той же базе данных, где создаётся трансфер. |
| 14 | + |
| 15 | +Чтение из [топика](glossary.md#topic) осуществляется с использованием [читателя](glossary.md#consumer). Трансфер автоматически добавляет в топик читателя с уникальным именем для чтения сообщений. При удалении трансфера созданный читатель удаляется автоматически. Также возможно создать читателя вручную и указать его имя при создании трансфера. Читатель, созданный вручную, не удаляется автоматически при удалении трансфера. Имя автоматически созданного читателя можно получить из [описания](../reference/ydb-cli/commands/scheme-describe.md) экземпляра трансфера. |
| 16 | + |
| 17 | +Если требуется передача данных из одного топика в несколько таблиц, для каждой таблицы необходимо создать отдельный трансфер. Аналогично, данные из нескольких топиков могут быть направлены в одну таблицу, для чего каждый топик должен быть ассоциирован с отдельным трансфером. Если имя читателя задаётся вручную, то при наличии нескольких трансферов, читающих из одного топика, необходимо назначить каждому трансферу уникального читателя, иначе данные будут обработаны только одним из них. |
| 18 | + |
| 19 | +{% note info %} |
| 20 | + |
| 21 | +При обновлении строки в таблице производится полная перезапись её значений данными из возвращаемой lambda-функцией структуры. Если структура не содержит именованного поля, соответствующего колонке таблицы, значение этой колонки будет установлено в `NULL`. Именованные поля, не имеющие соответствия в таблице, игнорируются. |
| 22 | + |
| 23 | +При попытке записать в `NOT NULL` колонку таблицы значение `NULL` трансфер остановится с [критичной ошибкой](#error-handling). |
| 24 | + |
| 25 | +{% endnote %} |
| 26 | + |
| 27 | +## Гарантии {#guarantees} |
| 28 | + |
| 29 | +* Гарантируется, что записи в таблицу будут происходить в том же порядке, в которую они были записаны в [партицию](glossary.md#partition) топика. Рекомендуется группировать сообщения, относящиеся к одной строке таблицы, в одну партицию топика. |
| 30 | +* Запись в таблицу осуществляется с использованием [пакетной вставки](../recipes/ydb-sdk/bulk-upsert.md) без гарантий атомарности. Запись данных разбивается на несколько независимых транзакций, каждая их которых затрагивает единственную партицию таблицы, с параллельным исполнением. |
| 31 | + |
| 32 | +## Начало работы трансфера |
| 33 | + |
| 34 | +Если трансфер создаётся без явного указания имени читателя, то в топик будет добавлен новый читатель, и обработка сообщений топика начнётся с первого сообщения в топике. |
| 35 | +Если трансфер создаётся с указанием созданного ранее читателя, то обработка сообщений топика начнётся с первого необработанного этим читателем сообщения. |
| 36 | + |
| 37 | +## Необходимые права для работы трансфера {#permissions} |
| 38 | + |
| 39 | +Для создания и выполнения трансфера пользователь должен обладать правами на запись в целевую таблицу и чтение из исходного топика. Если топик расположен в другой базе данных {{ ydb-short-name }}, читатель создаётся автоматически; дополнительно требуется право на модификацию топика, что позволяет трансферу автоматически создавать читателя и удалять его при удалении трансфера. |
| 40 | + |
| 41 | +## Диагностика |
| 42 | + |
| 43 | +Текущие параметры трансфера, включая текст lambda-функции, можно просмотреть в пользовательском интерфейсе [Embedded UI](../reference/embedded-ui/index.md) и в [описании](../reference/ydb-cli/commands/scheme-describe.md) экземпляра трансфера. |
| 44 | + |
| 45 | +Скорость обработки данных и задержки можно контролировать по [метрикам читателя](../reference/observability/metrics/index.md#topics), который используется для чтения из топика. |
| 46 | + |
| 47 | +## Временная остановка трансфера {#pause-and-resume} |
| 48 | + |
| 49 | +Работа трансфера может быть временно приостановлена, а затем возобновлена. После возобновления работы трансфера начнут обрабатываться сообщения, следующие за последним обработанным сообщением в топике. |
| 50 | + |
| 51 | +Для остановки трансфера следует [изменить](../yql/reference/syntax/alter-transfer.md#examples) статус трансфера на `PAUSED`, а для возобновления — на `STANDBY`. |
| 52 | + |
| 53 | +{% note warning %} |
| 54 | + |
| 55 | +Следует учесть, что в топике есть [время хранения сообщений](topic.md#retention-time), по истечении которого сообщения удаляются. Если с момента остановки трансфера пройдёт больше времени, чем время хранения сообщений, то сообщения будут удалены и не будут обработаны после возобновления работы трансфера. |
| 56 | + |
| 57 | +Чтобы гарантировать, что необработанные сообщения не будут удалены, следует сделать читателя [важным](topic.md#important-consumer). |
| 58 | + |
| 59 | +{% endnote %} |
| 60 | + |
| 61 | +## Обработка ошибок в процессе трансфера {#error-handling} |
| 62 | + |
| 63 | +В процессе трансфера возможно возникновение разных типов ошибок: |
| 64 | + |
| 65 | +* **Временные сбои**. Транспортные ошибки, перегрузка системы и другие временные проблемы. Запросы будут повторяться до успешного выполнения. |
| 66 | +* **Критичные ошибки**. Ошибки, связанные с правами доступа, схемой данных и другими критическими аспектами. В случае возникновения таких ошибок трансфер будет остановлен, и в пользовательском интерфейсе [Embedded UI](../reference/embedded-ui/index.md) на странице трансфера будет указан текст ошибки. Также текст ошибки можно получить из [описания](../reference/ydb-cli/commands/scheme-describe.md) экземпляра трансфера. |
| 67 | + |
| 68 | +Для возобновления работы трансфера необходимо выполнить команду `ALTER` с устранением причины ошибки. Например, если ошибка содержалась в тексте lambda-функции, то следует изменить lambda-функцию. Если ошибка не связана с конфигурацией трансфера, например, отсутствовали права на чтение из топика, то после устранения причины ошибки трансфер необходимо перезапустить сначала [временно остановив](#pause-and-resume), а потом [возобновив](#pause-and-resume) его работу. |
| 69 | + |
| 70 | +## См. также |
| 71 | + |
| 72 | +* [CREATE TRANSFER](../yql/reference/syntax/create-transfer.md) |
| 73 | +* [ALTER TRANSFER](../yql/reference/syntax/alter-transfer.md) |
| 74 | +* [DROP TRANSFER](../yql/reference/syntax/drop-transfer.md) |
0 commit comments