Примеры использования ADB ClickHouse Connector
В статье показаны примеры передачи данных между ADB и распределенной (distributed) таблицей в ADQM через ADB ClickHouse Connector. При выполнении примеров соблюдены следующие условия:
-
Кластер ADQM установлен согласно руководству Online-установка на следующих хостах: dev-adqm-01, dev-adqm-02, dev-adqm-03, dev-adqm-04.
-
База данных с именем
default
существует в ADQM. -
Пользователь с именем
default
существует в ADQM. -
Кластер
default_cluster
определен в секцииremote_servers
конфигурационного файла config.xml в ADQM. Для получения дополнительной информации можно обратиться к статье Типовой кластер в документации ADQM. -
Все ноды кластера ADB имеют доступ к HTTP-порту
8123
на всех нодах кластера ADQM, через которые планируется производить загрузку данных.
Запись данных
Чтобы проверить запись данных из кластера ADB в ADQM, выполните следующие шаги:
-
Подключитесь к базе данных
default
кластера ADQM под пользователемdefault
(например, через clickhouse-client). Создайте последовательно следующие таблицы.-
Локальная таблица
test_local
:CREATE TABLE test_local ON CLUSTER default_cluster ( id Int32, value_string String ) ENGINE = ReplicatedMergeTree('/clickhouse/test/shard-{shard}', 'replica-{replica}') ORDER BY id;
-
Распределенная таблица
test_distr
:CREATE TABLE test_distr ON CLUSTER default_cluster AS default.test_local ENGINE = Distributed(default_cluster, default, test_local, rand());
-
-
Подключитесь к базе данных
adb
кластера ADB под пользователемgpadmin
(например, через psql). Создайте последовательно следующие объекты.-
Сервер
clickhouse_server
:CREATE SERVER clickhouse_server FOREIGN DATA WRAPPER tkh_fdw OPTIONS ( database 'default', hosts 'dev-adqm-01:8123, dev-adqm-02:8123, dev-adqm-03:8123, dev-adqm-04:8123', distribution_type 'random', lines_batch_size '100000', send_compressed 'true', send_delay '300', insert_distributed_sync 'true', use_staging 'true', staging_table_name_format '$_tmp_$');
-
User mapping для пользователя
gpadmin
:CREATE USER MAPPING FOR gpadmin SERVER clickhouse_server OPTIONS (clickhouse_username 'default', clickhouse_password '');
-
Foreign-таблица
tkhemali_test
:CREATE FOREIGN TABLE tkhemali_test (id INT, value_string TEXT) SERVER clickhouse_server OPTIONS (resource 'test_distr', hosts 'dev-adqm-01:8123', cluster 'default_cluster');
ВАЖНОПоскольку на табличном уровне определена опция
cluster
, вся работа будет проводиться с хостами, полученными из метаданных кластера ADQM. Поэтому требуется перезаписать значение опцииhosts
, указанное дляclickhouse_server
на уровне сервера, и оставить только один хост в значении опции на уровне таблицы.
-
-
Добавьте данные в таблицу ADB
tkhemali_test
:INSERT INTO tkhemali_test VALUES (1, 'test1'), (2, 'test2'), (3, 'test3'), (4, 'test4'), (5, 'test5'), (6, 'test6'), (7, 'test7'), (8,'test8'), (9,'test9'), (10,'test10');
Результат:
WARNING: skipping "themali_test" --- cannot analyze this foreign table INSERT 0 10
-
Убедитесь, что данные, переданные из ADB, успешно добавлены в ADQM:
SELECT * FROM test_distr;
Результат:
┌─id─┬─value_string─┐ │ 2 │ test2 │ │ 5 │ test5 │ │ 8 │ test8 │ │ 10 │ test10 │ └────┴──────────────┘ ┌─id─┬─value_string─┐ │ 1 │ test1 │ │ 3 │ test3 │ │ 4 │ test4 │ │ 6 │ test6 │ │ 7 │ test7 │ │ 9 │ test9 │ └────┴──────────────┘ 10 rows in set. Elapsed: 0.005 sec.
Чтение данных
ПРИМЕЧАНИЕ
ADB ClickHouse Connector поддерживает возможность чтения данных из ADQM/ClickHouse в ADB 6 начиная с версии 6.24.3.47. Однако, чтобы использовать foreign-таблицу в ADB для чтения, в ней необходимо определить имена столбцов, точно совпадающие с соответствующими именами в таблице ADQM/ClickHouse. |
Пример корректного чтения данных
Следующий пример демонстрирует чтение данных из кластера ADQM в ADB:
-
Выполните шаги 1-2, приведенные выше (если они не были пройдены ранее).
-
Удалите данные из таблицы
test_local
в ADQM:ALTER TABLE default.test_local ON CLUSTER default_cluster DELETE WHERE true;
-
Добавьте данные в таблицу ADQM
test_distr
:INSERT INTO test_distr VALUES (1, 'test1'), (2, 'test2'), (3, 'test3'), (4, 'test4'), (5, 'test5'), (6, 'test6'), (7, 'test7'), (8,'test8'), (9,'test9'), (10,'test10');
Результат:
Query id: 430a158f-1374-470d-a8c2-7b4dabdefbc7 Ok. 10 rows in set. Elapsed: 0.048 sec.
-
Убедитесь, что данные, добавленные в ADQM, могут быть успешно прочитаны из ADB:
SELECT * FROM tkhemali_test ORDER BY id;
Результат:
id | value_string ----+-------------- 1 | test1 2 | test2 3 | test3 4 | test4 5 | test5 6 | test6 7 | test7 8 | test8 9 | test9 10 | test10 (10 rows)
Пример с ошибкой
Приведенный ниже пример показывает, что чтение данных из ADQM/ClickHouse в ADB невозможно в случае, если имена столбцов в foreign-таблице ADB и исходной таблице ADQM/ClickHouse не совпадают:
-
Выполните все шаги из примера с корректным чтением данных (если они не выполнены ранее).
-
Убедитесь, что чтение данных в ADB при текущей структуре foreign-таблицы работает успешно:
SELECT * FROM tkhemali_test ORDER BY id;
Результат:
id | value_string ----+-------------- 1 | test1 2 | test2 3 | test3 4 | test4 5 | test5 6 | test6 7 | test7 8 | test8 9 | test9 10 | test10 (10 rows)
-
Переименуйте часть столбцов foreign-таблицы
tkhemali_test
в ADB:ALTER FOREIGN TABLE tkhemali_test RENAME value_string TO wrong_string;
-
Повторно проверьте возможность чтения данных из таблицы
tkhemali_test
в ADB:SELECT * FROM tkhemali_test ORDER BY id;
В результате возвращается ошибка:
ERROR: CH easy datum. HTTP error: 404; CH message: Code: 47. DB::Exception: Missing columns: 'wrong_string' while processing query: 'SELECT id, wrong_string FROM default.test_local', required columns: 'id' 'wrong_string', maybe you meant: 'id'. (UNKNOWN_IDENTIFIER) (version 23.3.2.37) (ch_easy_datum.c:142) (seg0 slice1 10.92.17.182:10000 pid=6414) (ch_easy_datum.c:142)
ПРИМЕЧАНИЕ
Если имена совпадают только у части столбцов foreign-таблицы в ADB и исходной таблицы в ADQM/ClickHouse — запрос успешно отрабатывает, пока в результирующем наборе данных используются только указанные столбцы. |