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

Руководство по миграции с 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

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

PUSH из Redshift в ClickHouse

Преимущества

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

Недостатки

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

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

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

PULL from Redshift to ClickHouse

Преимущества

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

Недостатки

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

Несмотря на то, что Redshift основан на PostgreSQL, использование табличной функции PostgreSQL в ClickHouse или движка таблиц PostgreSQL невозможно, поскольку 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 в промежуточном формате PIVOT, а затем, на втором шаге, загружаем данные из S3 в ClickHouse.

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

Преимущества

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

Недостатки

  • Два шага в процессе: сначала выгрузка из Redshift, затем загрузка в ClickHouse.

Практическое руководство

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

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

UNLOAD из Redshift в S3

Будут сгенерированы файлы-части (part files), содержащие необработанные данные в 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 на столбцы для ускорения приёма данных.