Подключение Kafka

Apache Kafka — это открытая распределённая платформа потоковой передачи событий. Её можно использовать как систему обмена сообщениями для чтения и записи потоковых данных, публикации и подписки на сообщения. Она также подходит для создания масштабируемых приложений потоковой обработки в сценариях реального времени и для интеграции с базами данных с надёжным хранением потоковых данных в распределённом, реплицируемом и отказоустойчивом кластере. Создаваемые ею «потоки событий» — это «центральная нервная система» передачи данных.

Если вы планируете записывать данные из Kafka в кластер YMatrix, этот документ вам пригодится. База данных YMatrix поддерживает бесшовное подключение к Kafka: данные Kafka непрерывно и автоматически импортируются в таблицы YMatrix, управление поддерживается через графический интерфейс. В настоящее время поддерживаются форматы данных CSV и JSON. Мы рассмотрим простейший пример подключения данных Kafka с помощью платформы управления YMatrix.

1 Подготовка

1.1 Настройка среды Kafka

Сначала настройте работоспособную среду Kafka, следуя официальному руководству Kafka Quickstart.

1.2 Создание топика Kafka

После настройки среды Kafka на сервере перейдите в каталог установки (или используйте другой способ входа).

$ cd packages/kafka_2.13-3.2.0

Затем запустите службу Kafka и создайте тестовый топик (Topic); порт по умолчанию — 9092.

$ bin/kafka-topics.sh --create --topic csv_test --bootstrap-server localhost:9092

1.3 Запись тестовых данных

Запишите по одной несколько тестовых записей; завершите ввод сочетанием ctrl-c:

$ bin/kafka-console-producer.sh --topic csv_test --bootstrap-server localhost:9092
>1,Beijing,123.05,true,1651043583,1651043583123,1651043583123456
>2,Shanghai,112.95,true,1651043583,1651043583123,1651043583123456
>3,Shenzhen,100.0,false,1651043583,1651043583123,1651043583123456
>4,Guangxi,88.5,false,1651043583,1651043583123,1651043583123456
>^C

Приведённая выше команда записала 4 записи в только что созданный топик csv_test — 4 строки CSV с разделителями-запятыми. Подготовка завершена. Далее описано создание потока данных Kafka для импорта данных.

2 Создание потока данных Kafka

Введите в браузере IP-адрес машины с MatrixUI (по умолчанию — IP-адрес master-узла) и номер порта:

http://<IP>:8240

После успешного входа открывается главный интерфейс, разделённый на представления Processes и Tasks. Processes — это запущенные процессы MatrixGate, Tasks — это все задачи импорта данных. Один процесс MatrixGate может содержать несколько задач.

Нажмите «Import Data from Kafka».

Выберите источник данных Kafka. Сначала рассмотрим шаги на примере файла CSV.

2.1 Подключение потока данных CSV

2.1.1 Выбор или создание целевой таблицы

Сначала можно выбрать существующую таблицу или создать новую — она станет целевой таблицей для приёма данных Kafka.

2.1.1.1 Выбор существующей таблицы

В поле Target table выберите существующую таблицу и режим импорта данных (Importing mode). Предположим, выбрана таблица test в схеме public базы данных postgres. После выбора ниже отображается структура таблицы (имена столбцов, типы, допустимость NULL, автоинкремент) для проверки столбцов.

Режим импорта данных определяет способ обработки повторяющихся данных; выберите его с учётом ограничений целевой таблицы:

  • UPSERT (обновление с вставкой): объединяет UPDATE и INSERT, автоматически вставляя или обновляя запись одним оператором SQL: если записи нет, она вставляется; если есть — обновляется. Целевая таблица должна иметь ограничение уникальности без столбцов типа serial, а при сопоставлении обязательно укажите «Device ID (unique identifier)».
  • DEDUPLICATE (вставка с удалением дубликатов): для обеспечения уникальности данных при вставке, если у нескольких записей совпадают значения столбцов ограничения уникальности, сохраняется только первая запись. Целевая таблица также должна иметь ограничение уникальности без столбцов типа serial.
  • INSERT (прямая вставка): данные не обрабатываются и импортируются в порядке их создания.

2.1.1.2 Создание новой таблицы

При создании новой таблицы предположим, что схема — public, имя таблицы — test1.

При создании новой таблицы сначала выберите тип таблицы (Table type):

  • Partitioned table (разделённая таблица): автоматическое разбиение по столбцу времени, подходит для временных рядов с непрерывной записью. При сопоставлении столбцов обязательно выберите «Time column».
  • Non-partitioned table (неразделённая таблица): создаётся неразделённая таблица MARS3, выбор столбца времени не требуется.

При создании новой таблицы структуру таблицы на этом шаге задавать не нужно: имена и типы столбцов определяются на шаге 3 «Mapping» — автоматическим сопоставлением или вручную. Режим импорта поддерживает только UPSERT и INSERT.

При выборе «Partitioned table» ниже появляются настройки «Automatic partition»:

При выборе «Non-partitioned table» автоматическое разбиение не применяется:

После успешного создания таблицы появляется красная метка New.

Для неё выберите режим импорта данных и стратегию автоматического разбиения (Automatic partition). По умолчанию используется стратегия auto_partitioning. Для Non-partitioned table выбирается только режим импорта данных, стратегия автоматического разбиения не применяется.

2.1.2 Source data

После выбора целевой таблицы на втором шаге настройте подключение к источнику данных. Для перехода к следующему шагу выполните следующие действия:

  • Сначала в левой панели меню введите адрес и порт брокера Kafka в поле адреса в формате, показанном на рисунке. Если URL несколько, разделите их запятыми.
  • Затем выберите способ аутентификации (Auth method) для подключения к Kafka и проверьте имя пользователя и пароль Kafka.
  • Наконец, в правой панели меню отметьте или найдите топики Kafka, к которым нужно подключиться.

Адрес и данные аутентификации можно сохранить как «Kafka profile» для повторного использования: после заполнения нажмите «Save as profile», введите имя профиля в диалоге «Save Kafka profile» и сохраните. При создании потока данных можно напрямую выбрать сохранённый профиль; интерфейс отобразит «Using profile: ». Для временных изменений нажмите «Manual configuration». Удаление профиля не влияет на уже созданные потоки данных.

При выборе способа аутентификации GSSAPI необходимо загрузить файлы keytab и Kerberos:

Если подключение GSSAPI не удаётся, проверьте опцию DisablePAFXFAST в области аутентификации: при её включении быстрая аутентификация GSSAPI (PAFXFAST) не используется; в некоторых окружениях Kerberos для подключения необходимо отключить быструю аутентификацию.

2.1.3 Mapping

На третьем шаге настройте Sample data и выполните сопоставление с существующей или новой таблицей для импорта данных Kafka.

2.1.3.1 Базовая конфигурация

Выберите формат исходных данных CSV и задайте или настройте Sample data. Чтобы сопоставление было точным, необходимо указать или вручную настроить формат Sample data.

При настройке Sample data можно Select from topic или Edit data directly.

  • Если в топике Kafka (Topic) есть полные данные, выберите их в качестве Sample data.
  • Если данные в топике неполны (например, есть столбцы со значениями NULL), выберите Edit data directly и укажите одну строку Sample data в соответствии со структурой столбцов целевой таблицы. Эта строка используется только для разбора и сопоставления структуры столбцов и не импортируется в целевую таблицу.

Примечание!
Таблицы, созданные через графический интерфейс, по умолчанию используют движок хранения MARS3. Подробнее см. MARS3

2.1.3.2 Выполнение сопоставления

После базовой настройки выполните сопоставление столбцов исходных данных со столбцами целевой таблицы. Порядок действий для существующих и новых таблиц различается.

  • Сопоставление существующей таблицы

    Сначала выберите строку Sample data, затем найдите соответствующий целевой столбец в правилах сопоставления; после настройки нажмите сохранение — правило сопоставления создано.

    Можно также выполнить автоматическое сопоставление (Automatic mapping) одной кнопкой — это удобно и сохраняет корректность сопоставления. Начиная с 6.8.4 имена столбцов, сформированные автоматическим сопоставлением, не содержат лишних подчёркиваний и лучше читаются.

    После автоматического сопоставления для каждого столбца отображается выходное значение; в любой момент можно «Clear» или «Edit»:

  • Сопоставление новой таблицы

    Помимо создания правил сопоставления, для новой таблицы обратите внимание на следующие настройки: когда значение исходного столбца — UNIX-временная метка, а тип целевого столбца выбран timestamptz, справа от выходного значения появляется флажок Store as timestamp. Если флажок установлен, выходное значение автоматически преобразуется в формат timestamp базы данных.

    После сохранения правил сопоставления необходимо также подтвердить две настройки: «Device ID (unique identifier)» и «Time column»:

    • Device ID (unique identifier): в режиме UPSERT необходимо выбрать хотя бы один столбец — он используется для идентификации одной и той же записи, которую нужно обновить; в режиме INSERT выбор необязателен — если выбран, используется для распределения и сортировки данных, если не выбран, база данных по умолчанию использует первый столбец в качестве столбца распределения.
    • Time column: для Partitioned table необходимо выбрать допустимый столбец времени (тип целевого столбца — timestamptz); для Non-partitioned table выбор столбца времени не требуется.

    На странице сопоставления новой таблицы по сравнению с существующей таблицей добавлен столбец «Device ID (unique identifier)»:

2.1.4 Submission

Наконец, проверьте все конфигурации потока данных: при наличии ошибок вернитесь и исправьте их, при отсутствии — выполните отправку.

2.1.4.1 Существующая таблица

На странице отображаются все конфигурации потока данных; после проверки нажмите кнопку «Submit».

2.1.4.2 Новая таблица

По сравнению с существующей таблицей дополнительно отображается информация об уникальном идентификаторе: для Partitioned table — комбинация «Device ID + Time column»; для Non-partitioned table информация об уникальном идентификаторе не отображается. После проверки нажмите кнопку «Submit».

Начиная с 6.8.4, на странице Submission также отображаются тип таблицы (Table type) и режим импорта (Importing mode) целевой таблицы:

И для существующей, и для новой таблицы после успешной отправки открывается страница с сообщением об успешном создании — поток данных Kafka создан.

2.2 Подключение потока данных JSON

Здесь описаны в основном отличия от подключения в формате CSV; они касаются шага Mapping.

  • Сначала выберите формат данных JSON и настройте Sample data.

  • Затем для индексации столбцов JSON используется семантика $["имя_столбца"]; правила индексации см. в JSONPath.

  • Наконец, данные JSON поддерживают многоуровневую вложенность; YMatrix позволяет выбирать столбцы исходных данных разных уровней для создания правил сопоставления. Нажмите ⊕ в столбце Sample data, чтобы развернуть уровни вложенности.

3 Управление потоками данных Kafka

После создания потока данных Kafka через графический интерфейс YMatrix данные непрерывно импортируются в YMatrix. Если импорт необходимо временно прервать (например, для отладки службы), можно приостановить или остановить задачу в графическом интерфейсе, а затем возобновить или запустить её.

Для работающих потоков данных Kafka импорт управляется из двух представлений: Processes (управление всеми задачами процесса MatrixGate) и Tasks (управление отдельными задачами).

Примечание!
Операции запуска, остановки и приостановки могут вступать в силу в течение 1–10 секунд; в это время не выполняйте с потоком данных других операций. После приостановки или остановки импорт данных Kafka прекращается; после возобновления или запуска импорт возобновляется немедленно, а страница снова отобразит актуальные сведения об импорте не позднее чем через 5 секунд.

3.1 Processes

Представление Processes выводит для каждого процесса MatrixGate имя хоста, PID, тип, состояние задач, пропускную способность и время создания/выхода; завершённые процессы остаются в списке.

По кнопке «View» в столбце операций открывается страница сведений о процессе с тремя вкладками: «Performance», «Active tasks», «Basic info»:

  • Performance: пропускная способность и время выполнения процесса.
  • Active tasks: источник данных, целевая таблица, состояние и пропускная способность каждой задачи процесса; в столбце операций каждой задачи можно «View» журнал задачи, объём данных и сведения о загрузке, а также «Pause» и «Resume» импорт этой задачи.
  • Basic info: конфигурация процесса.

Кнопка «···» в строке списка управляет всеми задачами процесса и позволяет удалить запись о процессе из списка:

  • Pause all tasks: приостановить все задачи процесса, импорт больше не принимается.
  • Resume all tasks: возобновить все приостановленные задачи процесса, импорт продолжается.
  • Delete: удалить запись о процессе из списка, она больше не отображается.

3.2 Tasks

Кнопка раскрытия в меню операций позволяет выполнить операции Start, Reset offsets, Stop и Remove task.

  • Start: запустить остановленную задачу, импорт данных возобновится.
  • Reset offsets: сбросить позиции потребления остановленной задачи; подробнее см. главу «Сброс позиций потребления Kafka».
  • Stop: остановить задачу; связанный процесс MatrixGate завершится; позже задачу можно запустить снова.
  • Remove task: удалить задачу из списка, она больше не отображается.

По умолчанию в списке задач отображаются только задачи с фильтром «Active in: last hour»; для просмотра более ранних задач измените фильтр времени.

4 Сброс позиций потребления Kafka

Если необходимо возобновить потребление из другой позиции Kafka — например, повторно импортировать данные после случайного удаления или пропустить накопившиеся данные, — можно сбросить позиции потребления остановленного потока данных. Функция поддерживается начиная с 6.8.4; работать с ней можно в представлении Tasks графического интерфейса или с помощью команды mxgate offset-reset.

Примечание!
Сброс позиций — офлайн-операция. Сначала остановите задачу и убедитесь, что все связанные процессы MatrixGate завершены, и только затем выполняйте сброс позиций.

Примечание!
Повторное потребление следует семантике доставки «хотя бы один раз». Убедитесь, что целевая таблица может обрабатывать повторяющиеся данные, например с помощью режима UPSERT или режима удаления дубликатов.

4.1 Через графический интерфейс

  1. Остановите целевую задачу в представлении Tasks.

  2. Нажмите «Reset offsets» и на странице «Reset consumer offsets» выберите позицию возобновления потребления:

    • Earliest retained offset
    • Latest offset (skip backlog)
    • First message at or after a date and time
    • Specify offsets by partition, формат — 0:100,1:200

    При выборе «First message at or after a date and time» укажите дату и время:

  3. Нажмите «Generate plan», чтобы просмотреть сведения о Topic, группе потребителей, целевой таблице, Retained start, Log end, Consumed to, Consume from, Catalog rows to purge и т. д.; после проверки нажмите «Confirm reset».

  4. После завершения сброса запустите задачу в представлении Tasks; потребление продолжится с новой позиции.

4.2 Из командной строки

mxgate offset-reset сбрасывает позиции потребления остановленного потока данных. Команда читает конфигурацию потока данных из файла, указанного в -C, используя его только для поиска потока данных; файл конфигурации не изменяется.

Предварительные требования

  • Все процессы MatrixGate, выполняющие этот поток данных, завершены и не будут перезапущены systemd, Kubernetes и т. д. до завершения команды.
  • При использовании consumer group команда проверяет, есть ли у этой группы активные участники; если продолжает работать simple consumer, команда не может его обнаружить — убедитесь в завершении процесса самостоятельно.

Указание целевой позиции (необходимо указать ровно один из четырёх способов)

Параметр Описание
--to-earliest Сброс к самой ранней позиции, всё ещё сохранённой в Kafka
--to-latest Сброс к концу журнала с пропуском накопившихся данных
--to-datetime <время> Сброс к первому сообщению в указанное время или позже; время в формате RFC3339 с часовым поясом, например 2026-08-28T10:00:00+08:00
--to-offsets <раздел:позиция,...> Указание позиций по разделам, например 0:100,1:200

Выбор потока данных для сброса

--topic, --consumer-group, --job используются только для сопоставления с уже существующими потоками данных в файле конфигурации и не переопределяют и не собирают временную конфигурацию.

  • Если в файле конфигурации только один поток данных Kafka, команда выбирает его автоматически; параметры выбора указывать не нужно.
  • Если потоков данных несколько, укажите один из них с помощью --topic, --consumer-group, --job. У simple consumer нет consumer group, поэтому --consumer-group опускается.
  • Если заданы только часть условий выбора, нет совпадений или найдено несколько совпадений, команда отказывается выполняться и выводит список кандидатов.

Дополнительные параметры

Параметр Описание
-C, --config Файл конфигурации потока данных
--dry-run Только показать план, ничего не изменяя
-y, --yes Пропустить интерактивное подтверждение; удобно для автоматизации
--output Формат вывода: text или json. json выводит в stdout один объект; используется вместе с --dry-run или -y

Пример: предпросмотр плана

Если в файле конфигурации только один поток данных, параметры выбора указывать не нужно:

$ mxgate offset-reset -C mxgate.conf --to-earliest --dry-run

Сначала команда предупредит, что это офлайн-операция, а затем покажет план. Приведённый вывод — примерный; фактический вывод зависит от конкретного окружения:

offset-reset is an offline command. Before continuing, make sure that
  - every mxgate instance running this flow is stopped and its process has exited;
  - nothing restarts it (systemd, Kubernetes, ...) until this command has succeeded or you have recovered from its error.
Only the consumer group is checked for live members; a simple consumer that is still running cannot be detected.

Offset reset plan of topic csv_test (job job_csv_to_public.demo_csv -> "public"."demo_csv", consumer group "", mode earliest):

partition  kafka-oldest   kafka-newest   consumed-to      consume-from   purge-rows
0          0              4              3                0              1

dry-run: nothing has been changed

Каждая строка плана соответствует одному разделу: kafka-oldest и kafka-newest — диапазон позиций, сохранённых в Kafka; consumed-to — текущая позиция потребления; consume-from — позиция, с которой начнётся потребление после сброса; purge-rows — количество записей, которые будут удалены из прогресса потребления при этом сбросе.

Пример: выполнение сброса

Если в файле конфигурации несколько потоков данных, укажите один из них параметрами выбора; -y пропускает интерактивное подтверждение:

$ mxgate offset-reset -C mxgate.toml \
    --topic orders \
    --consumer-group mxgate-orders \
    --job j_orders \
    --to-offsets '0:100' \
    -y

Выполнение и восстановление

  • При реальном выполнении сначала также показывается план и ожидается интерактивное подтверждение; данные изменяются только после подтверждения.
  • После завершения выполнения перезапустите поток данных; потребление продолжится с позиции после сброса.
  • Запись прогресса потребления в базу данных и фиксация позиции Kafka consumer group — две независимые операции, которые нельзя выполнить в одной транзакции. Команда в течение 30 секунд фиксирует и считывает для проверки позицию consumer group; если подтверждение не получено, возвращается ошибка «частичный успех» с точными параметрами восстановления --to-offsets. В этом случае завершите восстановление согласно сообщению и не запускайте поток данных, пока позиция Kafka не будет подтверждена как согласованная.

Область влияния

  • Сообщения в топике Kafka не изменяются, политика хранения данных Kafka не меняется.
  • Изменения в базе данных, связанные со сбросом, фиксируются или откатываются целиком в одной транзакции.
  • Для потоков данных, сброс которых не выполнялся, семантика запуска, потребления и восстановления не меняется.
  • Удалённый прогресс потребления и связанные записи об ошибках архивируются и сохраняются; их можно сопоставить по reset_id.