Примеры использования 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-таблиц (рекомендуемый способ)

  1. Подключитесь к базе данных 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());
  2. Подключитесь к базе данных 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);
  3. Добавьте тестовые данные в таблицу test:

    INSERT INTO test
    SELECT gen, 'Some text #' || gen::text
    FROM generate_series(1, 50) gen;
    Содержимое таблицы test
     id | 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)
  4. В 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_$.

  5. Загрузите данные из таблицы ADB test в таблицу ADQM test_distr, используя функцию txn. Обратите внимание, что функция требует явного указания транзакции с помощью BEGIN и COMMIT:

    BEGIN;
    SELECT txn('INSERT INTO test_ext SELECT * FROM test;');
    COMMIT;

    Результат:

    BEGIN
     txn
    -----
    
    (1 row)
    
    COMMIT
  6. Убедитесь, что данные, переданные из 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. Выполните шаги 1-3, описанные в предыдущем разделе (если они не выполнены ранее).

  2. Удалите данные из таблицы test_local в ADQM:

    ALTER TABLE default.test_local ON CLUSTER default_cluster DELETE WHERE true;
  3. В 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 без каких-либо постфиксов.

  4. Загрузите данные из таблицы ADB test в таблицу ADQM test_distr, используя запрос INSERT к внешней таблице test_ext2:

    INSERT INTO test_ext2 SELECT * FROM test;

    Результат:

    INSERT 0 50
  5. Убедитесь, что данные, переданные из 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.
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней