Из Elasticsearch в Doris
Используйте ES Catalog для запросов к индексам Elasticsearch, затем копируйте выбранные столбцы во внутренние таблицы Doris с помощью INSERT INTO ... SELECT. В этом примере выполняется небольшая разовая миграция, при которой последующие обновления и удаления не переносятся непрерывно. Для поисковых нагрузок также необходимо отдельно проверить анализаторы, оценку релевантности, вложенные объекты и семантику запросов.
Предварительные требования
В этом примере используется API маппинга без типов в Elasticsearch 7.x или 8.x. Для других версий источника адаптируйте настройку индекса и проверьте диапазон версий, поддерживаемых каталогом.
- Доступный кластер Elasticsearch и учётная запись с правами на создание тестового индекса, запись в него и чтение из него. Учётной записи для миграции в производственной среде также нужны права доступа к метаданным каталога; см. ES Catalog.
- Сетевой доступ к ES с каждого FE/BE Doris и учётная запись Doris с правами на создание каталогов/баз данных/таблиц, чтение внешних таблиц и загрузку данных в целевую таблицу.
- Пустая целевая таблица. Замените адреса подключений и учётные данные. Одна реплика и один бакет используются только для упрощения примера.
Основы использования
1. Подготовьте исходный индекс
Выполните в Elasticsearch Dev Tools или аналогичном HTTP-клиенте:
PUT /migration_demo
{
"mappings": {
"properties": {
"title": { "type": "keyword" }
}
}
}
PUT /migration_demo/_doc/one?refresh=true
{ "title": "first" }
PUT /migration_demo/_doc/two?refresh=true
{ "title": "second" }
Ожидаемый результат: индекс содержит два доступных для поиска документа с идентификаторами one и two.
2. Создайте каталог и сохраните идентификаторы документов
CREATE CATALOG migration_es PROPERTIES (
'type' = 'es',
'hosts' = 'http://es-host:9200',
'user' = '<es_user>',
'password' = '<es_password>',
'mapping_es_id' = 'true'
);
DESC migration_es.default_db.migration_demo;
CREATE DATABASE IF NOT EXISTS migration_target;
CREATE TABLE migration_target.es_demo (
doc_id VARCHAR(512),
title STRING
)
DUPLICATE KEY(doc_id)
DISTRIBUTED BY HASH(doc_id) BUCKETS 1
PROPERTIES ('replication_num' = '1');
INSERT INTO migration_target.es_demo (doc_id, title)
SELECT _id, title FROM migration_es.default_db.migration_demo;
SELECT doc_id, title FROM migration_target.es_demo ORDER BY doc_id;
+--------+--------+
| doc_id | title |
+--------+--------+
| one | first |
| two | second |
+--------+--------+
Справочник параметров
| Параметр | Тип | Обязательный | По умолчанию | Описание |
|---|---|---|---|---|
hosts | STRING | Да | Нет | HTTP-адреса ES, доступные с каждого FE/BE |
user / password | STRING | Зависит от аутентификации ES | Пустое значение | Учётные данные при включённой аутентификации Basic |
mapping_es_id | boolean | Нет | false | Предоставляет доступ к _id документа; включён в этом примере |
enable_docvalue_scan | boolean | Нет | true | Пытается читать doc-values для поддерживаемых полей |
nodes_discovery | boolean | Нет | true | Обнаруживает узлы; в изолированных сетях может потребоваться отключение |
Полный список параметров, сведения об аутентификации и аннотациях массивов см. в ES Catalog.
Типы и семантика поиска
- ES Catalog сопоставляет
objectиnestedс JSON, а не автоматически с VARIANT. Выполняйте преобразование явно и проверяйте результат перед использованием другого целевого типа. - Поля ES могут содержать как скалярные значения, так и массивы. Настройте
_meta.doris.array_fieldsсогласно документации, проверьте выводDESCи изучите реальные примеры данных, не делая выводов обо всём столбце по одному документу. - Проверьте форматы дат, часовые пояса, числовые диапазоны и отсутствующие поля. Поле
text, к которому применяется анализатор, отличается от поляkeyword, используемого для точного сопоставления. - В Doris инвертированные индексы поддерживают полнотекстовый поиск, но эквивалентность ES DSL, оценки релевантности, вложенных запросов и анализаторов автоматически не обеспечивается. Проверяйте результаты реальных запросов, не ограничиваясь механической заменой синтаксиса.
Проверка и ошибки
В период, когда запись в источник приостановлена, сравните количество документов и количество уникальных _id; в этом примере оба значения должны быть равны 2. Сравните примеры исходного _source с целевыми столбцами, включая отсутствующие значения, массивы JSON и даты.
При ошибках метаданных проверьте права на чтение индекса, получение состояния кластера и HTTP-доступ к узлам. При сбоях постраничного чтения проверьте сетевую доступность узлов источника и настройки обнаружения узлов. Изменения индекса во время миграции могут повлиять на согласованность данных; создайте стабильный снимок или определите период без записи в источник. Повторное выполнение INSERT добавляет строки, поэтому перед возобновлением определите, какие диапазоны уже импортированы.
Рекомендации
Проверьте чтение полей и семантику поиска перед переходом к пакетной обработке. Для непрерывного зеркалирования необходимо отдельно спроектировать обновления, удаления, упорядочивание и повторную обработку по идентификатору документа; каталог не является задачей CDC. Рекомендации по переключению на целевую систему см. в Обзоре миграции.