Перейти к основному содержимому
Перейти к основному содержимому

Руководство по миграции с Amazon Redshift на ClickHouse

Введение

Amazon Redshift — это популярное облачное решение для хранения данных, которое является частью предложений Amazon Web Services. Этот руководств представляет различные подходы к миграции данных из экземпляра Redshift в ClickHouse. Мы рассмотрим три варианта:

Опции миграции из Redshift в ClickHouse

С точки зрения экземпляра ClickHouse, вы можете:

  1. PUSH данные в ClickHouse с помощью стороннего инструмента или сервиса ETL/ELT

  2. PULL данные из Redshift, используя ClickHouse JDBC Bridge

  3. PIVOT с использованием объектного хранилища S3 по логике "Сначала выгрузить, затем загрузить"

примечание

Мы использовали Redshift в качестве источника данных в этом учебном пособии. Тем не менее, представленные здесь подходы к миграции не эксклюзивны для Redshift, и аналогичные шаги могут быть выведены для любого совместимого источника данных.

Отправка данных из Redshift в ClickHouse

В сценарии отправки идея состоит в том, чтобы использовать сторонний инструмент или сервис (либо собственный код, либо ETL/ELT), чтобы отправить ваши данные в экземпляр ClickHouse. Например, вы можете использовать программное обеспечение, такое как Airbyte, для перемещения данных между вашим экземпляром Redshift (как источником) и ClickHouse в качестве назначения (см. наше руководство по интеграции для Airbyte)

PUSH из Redshift в ClickHouse

Плюсы

  • Это может использовать существующий каталог коннекторов программного обеспечения ETL/ELT.
  • Встроенные возможности для синхронизации данных (добавление/перезапись/инкрементная логика).
  • Возможность реализации сценариев преобразования данных (например, см. наше руководство по интеграции для dbt).

Минусы

  • Пользователи должны настроить и поддерживать инфраструктуру ETL/ELT.
  • В архитектуру вводится сторонний элемент, который может стать потенциальным узким местом по масштабируемости.

Получение данных из Redshift в ClickHouse

В сценарии получения идея состоит в том, чтобы использовать ClickHouse JDBC Bridge для прямого подключения к кластеру Redshift из экземпляра ClickHouse и выполнения запросов INSERT INTO ... SELECT:

PULL из Redshift в ClickHouse

Плюсы

  • Универсальность для всех совместимых с JDBC инструментов
  • Элегантное решение для выполнения запросов к нескольким внешним источникам данных из ClickHouse

Минусы

  • Требуется экземпляр ClickHouse JDBC Bridge, который может стать потенциальным узким местом по масштабируемости
примечание

Несмотря на то, что Redshift основан на PostgreSQL, использование функции таблицы PostgreSQL или движка таблицы ClickHouse невозможно, так как ClickHouse требует версию PostgreSQL 9 или выше, а API Redshift основан на более ранней версии (8.x).

Учебное пособие

Чтобы использовать этот вариант, вам нужно настроить ClickHouse JDBC Bridge. ClickHouse JDBC Bridge — это отдельное Java-приложение, которое обрабатывает соединение JDBC и выполняет функции прокси между экземпляром ClickHouse и источниками данных. В этом учебном пособии мы использовали предварительно заполненный экземпляр Redshift с образцовой базой данных.

Развертывание ClickHouse JDBC Bridge

Разверните ClickHouse JDBC Bridge. Для получения дополнительной информации см. наше руководство пользователя по JDBC для внешних источников данных

примечание

Если вы используете ClickHouse Cloud, вам нужно будет запустить свой ClickHouse JDBC Bridge в отдельной среде и подключиться к ClickHouse Cloud, используя функцию remoteSecure

Настройка источника данных Redshift

Настройте источник данных Redshift для ClickHouse JDBC Bridge. Например, /etc/clickhouse-jdbc-bridge/config/datasources/redshift.json

{
 "redshift-server": {
   "aliases": [
     "redshift"
   ],
   "driverUrls": [
   "https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/2.1.0.4/redshift-jdbc42-2.1.0.4.jar"
   ],
   "driverClassName": "com.amazon.redshift.jdbc.Driver",
   "jdbcUrl": "jdbc:redshift://redshift-cluster-1.ckubnplpz1uv.us-east-1.redshift.amazonaws.com:5439/dev",
   "username": "awsuser",
   "password": "<password>",
   "maximumPoolSize": 5
 }
}

Выполнение запросов к экземпляру Redshift из ClickHouse

После развертывания и запуска ClickHouse JDBC Bridge вы можете начать выполнять запросы к вашему экземпляру Redshift из ClickHouse

SELECT *
FROM jdbc('redshift', 'select username, firstname, lastname from users limit 5')
Query id: 1b7de211-c0f6-4117-86a2-276484f9f4c0

┌─username─┬─firstname─┬─lastname─┐
│ PGL08LJI │ Vladimir  │ Humphrey │
│ XDZ38RDD │ Barry     │ Roy      │
│ AEB55QTM │ Reagan    │ Hodge    │
│ OWY35QYB │ Tamekah   │ Juarez   │
│ MSD36KVR │ Mufutau   │ Watkins  │
└──────────┴───────────┴──────────┘

5 rows in set. Elapsed: 0.438 sec.
SELECT *
FROM jdbc('redshift', 'select count(*) from sales')
Query id: 2d0f957c-8f4e-43b2-a66a-cc48cc96237b

┌──count─┐
│ 172456 │
└────────┘

1 rows in set. Elapsed: 0.304 sec.

Импорт данных из Redshift в ClickHouse

В следующем разделе мы покажем, как импортировать данные, используя оператор INSERT INTO ... SELECT


# TABLE CREATION with 3 columns
CREATE TABLE users_imported
(
   `username` String,
   `firstname` String,
   `lastname` String
)
ENGINE = MergeTree
ORDER BY firstname
Query id: c7c4c44b-cdb2-49cf-b319-4e569976ab05

Ok.

0 rows in set. Elapsed: 0.233 sec.
INSERT INTO users_imported (*) SELECT *
FROM jdbc('redshift', 'select username, firstname, lastname from users')
Query id: 9d3a688d-b45a-40f4-a7c7-97d93d7149f1

Ok.

0 rows in set. Elapsed: 4.498 sec. Processed 49.99 thousand rows, 2.49 MB (11.11 thousand rows/s., 554.27 KB/s.)

Свод данных из Redshift в ClickHouse с использованием S3

В этом сценарии мы экспортируем данные в S3 в промежуточном сводном формате и на втором этапе загружаем данные из S3 в ClickHouse.

PIVOT из Redshift с использованием S3

Плюсы

  • И Redshift, и ClickHouse имеют мощные функции интеграции с S3.
  • Использует существующие функции, такие как команда Redshift UNLOAD и функцию таблицы/движок таблицы ClickHouse для S3.
  • Безшовно масштабируется благодаря параллельным чтениям и высоким возможностям пропускной способности при передаче данных в/из S3 в ClickHouse.
  • Может использовать сложные и сжатые форматы, такие как Apache Parquet.

Минусы

  • Два шага в процессе (выгрузка из Redshift, затем загрузка в ClickHouse).

Учебное пособие

Выгрузка данных в корзину S3 с помощью UNLOAD

Используя функцию UNLOAD Redshift, выгрузите данные в существующую приватную корзину S3:

UNLOAD из Redshift в S3

Это создаст файлы частей, содержащие сырые данные в S3

Данные в S3

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

Создайте таблицу в ClickHouse:

CREATE TABLE users
(
  username String,
  firstname String,
  lastname String
)
ENGINE = MergeTree
ORDER BY username

В качестве альтернативы ClickHouse может попытаться вывести структуру таблицы, используя CREATE TABLE ... EMPTY AS SELECT:

CREATE TABLE users
ENGINE = MergeTree ORDER BY username
EMPTY AS
SELECT * FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '<aws_access_key>', '<aws_secret_access_key>', 'CSV')

Это особенно хорошо работает, когда данные находятся в формате, содержащем информацию о типах данных, например, Parquet.

Загрузка файлов S3 в ClickHouse

Загрузите файлы S3 в ClickHouse, используя оператор INSERT INTO ... SELECT:

INSERT INTO users SELECT *
FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '<aws_access_key>', '<aws_secret_access_key>', 'CSV')
Query id: 2e7e219a-6124-461c-8d75-e4f5002c8557

Ok.

0 rows in set. Elapsed: 0.545 sec. Processed 49.99 thousand rows, 2.34 MB (91.72 thousand rows/s., 4.30 MB/s.)
примечание

В этом примере использовался CSV в качестве сводного формата. Однако для производственных рабочих нагрузок мы рекомендуем использовать Apache Parquet как лучший вариант для больших миграций, так как он поддерживает сжатие и может снизить затраты на хранение, сокращая время передачи. (По умолчанию для каждого группы строк применяется сжатие с помощью SNAPPY). ClickHouse также использует ориентированность колонок Parquet для ускорения приемки данных.