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

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

Введение

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

Redshift to ClickHouse Migration Options

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

  1. PUSH отправлять данные в ClickHouse, используя сторонний ETL/ELT-инструмент или сервис

  2. PULL забирать данные из Redshift с использованием ClickHouse JDBC Bridge

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

Примечание

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

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

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

PUSH Redshift to ClickHouse

Плюсы

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

Минусы

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

Извлечение данных из Redshift в ClickHouse

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

Извлечение из 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

# СОЗДАНИЕ ТАБЛИЦЫ с 3 столбцами \{#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 и S3 table function / table engine в ClickHouse.
  • Масштабируется без труда благодаря параллельному чтению и высокой пропускной способности при работе с S3 в ClickHouse.
  • Может использовать продвинутые и сжатые форматы, такие как Apache Parquet.

Недостатки

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

Руководство

Экспорт данных в бакет S3 с помощью UNLOAD

Используя функцию Redshift UNLOAD, экспортируйте данные в существующий закрытый бакет 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 для ускорения ингестии данных.