Amazon Redshift 到 ClickHouse 迁移指南
介绍
Amazon Redshift 是一个流行的云数据仓库解决方案,是亚马逊Web服务(AWS)提供的一部分。本指南介绍了将数据从Redshift实例迁移到ClickHouse的不同方法。我们将涵盖三种选项:

从ClickHouse实例的角度来看,您可以选择:
-
推送 数据到ClickHouse,使用第三方ETL/ELT工具或服务
-
拉取 数据从Redshift,利用ClickHouse JDBC Bridge
-
透视 使用S3对象存储,采用“先卸载后加载”的逻辑
在本教程中,我们使用Redshift作为数据源。然而,这里介绍的迁移方法并不专属于Redshift,类似的步骤也可以适用于任何兼容的数据源。
从Redshift推送数据到ClickHouse
在推送场景中,想法是利用第三方工具或服务(无论是自定义代码还是 ETL/ELT)将您的数据发送到ClickHouse实例。例如,您可以使用像 Airbyte 这样的软件,在您的Redshift实例(作为源)和ClickHouse(作为目标)之间传输数据(请参阅我们的Airbyte集成指南)

优点
- 可以利用ETL/ELT软件中现有的连接器目录。
- 内置的同步数据能力(追加/覆盖/增量逻辑)。
- 能够启用数据转换场景(例如,请参见我们的 dbt 集成指南)。
缺点
- 用户需要建立和维护ETL/ELT基础设施。
- 在架构中引入了第三方元素,这可能成为潜在的可扩展性瓶颈。
从Redshift拉取数据到ClickHouse
在拉取场景中,想法是利用ClickHouse JDBC Bridge直接连接到Redshift集群,并执行 INSERT INTO ... SELECT
查询:

优点
- 适用于所有兼容JDBC的工具
- 优雅的方法允许从ClickHouse中查询多个外部数据源
缺点
- 需要一个ClickHouse JDBC Bridge实例,这可能成为潜在的可扩展性瓶颈
尽管Redshift基于PostgreSQL,但由于ClickHouse要求PostgreSQL版本9或更高,而Redshift API基于早期版本(8.x),无法使用ClickHouse的PostgreSQL表函数或表引擎。
教程
要使用此选项,您需要设置ClickHouse JDBC Bridge。ClickHouse JDBC Bridge是一个独立的Java应用程序,处理JDBC连接,并充当ClickHouse实例与数据源之间的代理。在本教程中,我们使用了一个预填充的Redshift实例,其中包含一个 示例数据库。
部署ClickHouse JDBC Bridge
部署ClickHouse JDBC Bridge。有关更多详细信息,请参见我们的用户指南 JDBC用于外部数据源
如果您使用ClickHouse Cloud,您需要在一个单独的环境中运行ClickHouse JDBC Bridge,并使用 remoteSecure 函数连接到ClickHouse Cloud。
配置您的Redshift数据源
为ClickHouse JDBC Bridge配置您的Redshift数据源。例如,/etc/clickhouse-jdbc-bridge/config/datasources/redshift.json
使用S3从Redshift透视数据到ClickHouse
在此场景中,我们将数据导出到S3,以中间透视格式存储,然后在第二步中,将数据从S3加载到ClickHouse。

优点
- Redshift和ClickHouse都具有强大的S3集成功能。
- 利用现有功能,例如Redshift的
UNLOAD
命令和ClickHouse的S3表函数/表引擎。 - 由于ClickHouse中的并行读取和高吞吐能力,可以无缝扩展。
- 可以利用复杂且压缩的格式,如Apache Parquet。
缺点
- 过程中的两个步骤(从Redshift卸载,然后加载到ClickHouse)。
教程
在ClickHouse中创建表
在ClickHouse中创建表:
或者,ClickHouse可以尝试通过 CREATE TABLE ... EMPTY AS SELECT
推断表结构:
当数据以包含数据类型信息的格式(如Parquet)时,这尤其有效。
将S3文件加载到ClickHouse
使用 INSERT INTO ... SELECT
语句将S3文件加载到ClickHouse:
本示例使用CSV作为透视格式。然而,对于生产工作负载,我们建议使用Apache Parquet作为大型迁移的最佳选择,因为它包含压缩,能够节省存储成本并缩短传输时间。(默认情况下,每个行组使用SNAPPY进行压缩)。ClickHouse还利用Parquet的列式存储加速数据摄取。