Примеры использования Tkhemali Connector 1.X
В статье показаны примеры передачи данных из ADB в распределенную (distributed) таблицу в ADQM через Tkhemali Connector 1.X. При выполнении примера соблюдены следующие условия:
-
Кластер 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, через которые планируется производить загрузку данных.
С созданием staging-таблиц (рекомендуемый способ)
-
Подключитесь к базе данных
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). Создайте таблицу для тестовых данных со структурой аналогичной таблицам в ADQM:CREATE TABLE test (id INT, value_string TEXT) WITH (appendoptimized=true, orientation=column, compresstype=zstd, compresslevel=1) DISTRIBUTED BY (id);
-
Добавьте тестовые данные в таблицу
test
:INSERT INTO test SELECT gen, 'Some text #' || gen::text FROM generate_series(1, 50) gen;
Содержимое таблицы testid | value_string ----+--------------- 1 | Some text #1 2 | Some text #2 3 | Some text #3 4 | Some text #4 5 | Some text #5 6 | Some text #6 7 | Some text #7 8 | Some text #8 9 | Some text #9 10 | Some text #10 11 | Some text #11 12 | Some text #12 13 | Some text #13 14 | Some text #14 15 | Some text #15 16 | Some text #16 17 | Some text #17 18 | Some text #18 19 | Some text #19 20 | Some text #20 21 | Some text #21 22 | Some text #22 23 | Some text #23 24 | Some text #24 25 | Some text #25 26 | Some text #26 27 | Some text #27 28 | Some text #28 29 | Some text #29 30 | Some text #30 31 | Some text #31 32 | Some text #32 33 | Some text #33 34 | Some text #34 35 | Some text #35 36 | Some text #36 37 | Some text #37 38 | Some text #38 39 | Some text #39 40 | Some text #40 41 | Some text #41 42 | Some text #42 43 | Some text #43 44 | Some text #44 45 | Some text #45 46 | Some text #46 47 | Some text #47 48 | Some text #48 49 | Some text #49 50 | Some text #50 (50 rows)
-
В ADB создайте внешнюю таблицу со структурой, идентичной таблице
test
:CREATE WRITABLE EXTERNAL TABLE test_ext (LIKE test) LOCATION ('pxf://default.test_distr_tmp_$?PROFILE=TKH&URL=dev-adqm-01:8123,dev-adqm-02:8123,dev-adqm-03:8123,dev-adqm-04:8123') FORMAT 'TEXT' ENCODING 'UTF8';
ВАЖНОПоскольку при передаче данных используются staging-таблицы, к имени целевой таблицы ADQM в директиве
LOCATION
добавлен постфикс_tmp_$
. -
Загрузите данные из таблицы ADB
test
в таблицу ADQMtest_distr
, используя функциюtxn
. Обратите внимание, что функция требует явного указания транзакции с помощьюBEGIN
иCOMMIT
:BEGIN; SELECT txn('INSERT INTO test_ext SELECT * FROM test;'); COMMIT;
Результат:
BEGIN txn ----- (1 row) COMMIT
-
Убедитесь, что данные, переданные из ADB, успешно добавлены в ADQM:
SELECT * FROM test_distr;
Результат┌─id─┬─value_string──┐ │ 5 │ Some text #5 │ │ 8 │ Some text #8 │ │ 16 │ Some text #16 │ │ 17 │ Some text #17 │ │ 18 │ Some text #18 │ │ 20 │ Some text #20 │ │ 21 │ Some text #21 │ │ 27 │ Some text #27 │ │ 32 │ Some text #32 │ │ 34 │ Some text #34 │ │ 35 │ Some text #35 │ │ 41 │ Some text #41 │ │ 42 │ Some text #42 │ └────┴───────────────┘ ┌─id─┬─value_string──┐ │ 1 │ Some text #1 │ │ 4 │ Some text #4 │ │ 7 │ Some text #7 │ │ 11 │ Some text #11 │ │ 19 │ Some text #19 │ │ 26 │ Some text #26 │ │ 28 │ Some text #28 │ │ 31 │ Some text #31 │ │ 36 │ Some text #36 │ │ 45 │ Some text #45 │ │ 46 │ Some text #46 │ └────┴───────────────┘ ┌─id─┬─value_string──┐ │ 2 │ Some text #2 │ │ 3 │ Some text #3 │ │ 6 │ Some text #6 │ │ 9 │ Some text #9 │ │ 10 │ Some text #10 │ │ 12 │ Some text #12 │ │ 13 │ Some text #13 │ │ 14 │ Some text #14 │ │ 15 │ Some text #15 │ │ 22 │ Some text #22 │ │ 23 │ Some text #23 │ │ 24 │ Some text #24 │ │ 25 │ Some text #25 │ │ 29 │ Some text #29 │ │ 30 │ Some text #30 │ │ 33 │ Some text #33 │ │ 37 │ Some text #37 │ │ 38 │ Some text #38 │ │ 39 │ Some text #39 │ │ 40 │ Some text #40 │ │ 43 │ Some text #43 │ │ 44 │ Some text #44 │ │ 47 │ Some text #47 │ │ 48 │ Some text #48 │ │ 49 │ Some text #49 │ │ 50 │ Some text #50 │ └────┴───────────────┘ 50 rows in set. Elapsed: 0.004 sec.
Без создания staging-таблиц
-
Выполните шаги 1-3, описанные в предыдущем разделе (если они не выполнены ранее).
-
Удалите данные из таблицы
test_local
в ADQM:ALTER TABLE default.test_local ON CLUSTER default_cluster DELETE WHERE true;
-
В ADB создайте внешнюю таблицу со структурой, идентичной таблице
test
:CREATE WRITABLE EXTERNAL TABLE test_ext2 (LIKE test) LOCATION ('pxf://default.test_distr?PROFILE=TKH&URL=dev-adqm-01:8123,dev-adqm-02:8123,dev-adqm-03:8123,dev-adqm-04:8123') FORMAT 'TEXT' ENCODING 'UTF8';
ВАЖНОПоскольку staging-таблицы теперь не используются, в директиве
LOCATION
указано имя целевой таблицы ADQM без каких-либо постфиксов. -
Загрузите данные из таблицы ADB
test
в таблицу ADQMtest_distr
, используя запросINSERT
к внешней таблицеtest_ext2
:INSERT INTO test_ext2 SELECT * FROM test;
Результат:
INSERT 0 50
-
Убедитесь, что данные, переданные из ADB, успешно добавлены в ADQM:
SELECT * FROM test_distr;
Результат┌─id─┬─value_string──┐ │ 1 │ Some text #1 │ │ 2 │ Some text #2 │ │ 3 │ Some text #3 │ │ 8 │ Some text #8 │ │ 12 │ Some text #12 │ │ 13 │ Some text #13 │ │ 14 │ Some text #14 │ │ 17 │ Some text #17 │ │ 18 │ Some text #18 │ │ 23 │ Some text #23 │ │ 25 │ Some text #25 │ │ 26 │ Some text #26 │ │ 29 │ Some text #29 │ │ 31 │ Some text #31 │ │ 35 │ Some text #35 │ │ 36 │ Some text #36 │ │ 38 │ Some text #38 │ │ 39 │ Some text #39 │ │ 42 │ Some text #42 │ │ 43 │ Some text #43 │ │ 46 │ Some text #46 │ │ 48 │ Some text #48 │ │ 49 │ Some text #49 │ │ 50 │ Some text #50 │ └────┴───────────────┘ ┌─id─┬─value_string─┐ │ 5 │ Some text #5 │ └────┴──────────────┘ ┌─id─┬─value_string──┐ │ 32 │ Some text #32 │ └────┴───────────────┘ ┌─id─┬─value_string──┐ │ 9 │ Some text #9 │ │ 10 │ Some text #10 │ │ 16 │ Some text #16 │ │ 19 │ Some text #19 │ │ 21 │ Some text #21 │ │ 22 │ Some text #22 │ │ 24 │ Some text #24 │ │ 27 │ Some text #27 │ │ 37 │ Some text #37 │ │ 40 │ Some text #40 │ │ 45 │ Some text #45 │ │ 47 │ Some text #47 │ └────┴───────────────┘ ┌─id─┬─value_string──┐ │ 4 │ Some text #4 │ │ 6 │ Some text #6 │ │ 7 │ Some text #7 │ │ 11 │ Some text #11 │ │ 15 │ Some text #15 │ │ 20 │ Some text #20 │ │ 28 │ Some text #28 │ │ 30 │ Some text #30 │ │ 33 │ Some text #33 │ │ 34 │ Some text #34 │ │ 41 │ Some text #41 │ │ 44 │ Some text #44 │ └────┴───────────────┘ 50 rows in set. Elapsed: 0.004 sec.