向 ClickHouse 插入数据与向 OLTP 数据库插入数据的区别
插入的最佳实践
按较大的批次插入
确保批次一致,以实现幂等重试
-
- 如果接收数据的节点出现问题,插入查询会超时 (或返回更具体的错误) ,并且不会收到确认。
-
- 如果节点已将数据写入,但由于网络中断,确认无法返回给查询发送方,发送方会收到超时或网络错误。
插入到 MergeTree 表或分布式表
internal_replication=true。
这样 ClickHouse 就会将数据复制到各个分片中任意可用的副本,并确保数据最终一致。
如果客户端侧负载均衡不方便,也可以通过分布式表进行插入,由它将写入分发到各个节点。同样,建议设置 internal_replication=true。
但需要注意的是,这种方式性能会稍差一些,因为写入必须先在包含分布式表的节点上本地执行,然后再发送到各个分片。
对小批次使用异步插入
使用官方 ClickHouse 客户端
优先使用 Native 格式
使用 HTTP 接口
基本示例
INSERT INTO TABLE 命令。下面我们将一些数据插入到之前在快速入门指南“在 ClickHouse 中创建表”里创建的表中。
SELECT 查询:
从 Postgres 加载数据
ClickPipes,这是一款专为 PostgreSQL 数据库复制设计的 ETL 工具。在以下两种环境中均可用:- ClickHouse Cloud - 可通过 ClickPipes 中的托管摄取服务使用。
- 自管理 - 可通过 PeerDB 开源项目使用。
- PostgreSQL 表引擎 可像前面的示例那样直接读取数据。如果基于已知水位线 (例如时间戳) 的批次复制已足够,或者这是一次性迁移,这种方式通常比较合适。此方法可扩展到数千万行。对于需要迁移更大数据集的用户,建议考虑使用多个请求,每个请求处理一部分数据。可以为每部分数据使用暂存表,再将其分区移动到最终表中。这样一来,如果请求失败,也可以重试。有关这种批量加载策略的更多细节,请参见此处。
- 可以将数据从 PostgreSQL 导出为 CSV 格式。然后可使用表函数从本地文件或通过对象存储将其插入 ClickHouse。
需要帮助插入大型数据集吗?如果你在向 ClickHouse Cloud 导入数据时,需要协助插入大型数据集,或遇到任何错误,请通过 support@clickhouse.com 联系我们,我们很乐意提供帮助。
从命令行插入数据
- 你已安装 ClickHouse
clickhouse-server正在运行- 你可访问已安装
wget、zcat和curl的终端
clickhouse-client,从命令行将一个 CSV 文件插入 ClickHouse。有关使用处于批次模式的 clickhouse-client 通过命令行插入数据的更多信息和示例,请参阅 “批次模式”。
本示例将使用 Hacker News dataset,其中包含 2800 万行 Hacker News 数据。
创建表
在clickhouse-server 运行时,你可以使用处于批次模式的 clickhouse-client,通过命令行直接按以下 schema 创建一个空表:_EOF) 使用了单引号,以防止发生任何插值。如果不加单引号,就需要对列名两侧的反引号进行转义。从命令行插入数据
接下来,运行下面的命令,将你之前下载的文件中的数据插入表中:gzip、zcat 或类似工具对文件进行解压,然后再将解压后的数据通过管道传给 clickhouse-client,并配合相应的 INSERT 语句和 FORMAT。当使用处于交互模式的
clickhouse-client 插入数据时,可以让 ClickHouse 在插入时通过 COMPRESSION 子句代为处理解压。ClickHouse 可以根据文件扩展名自动检测压缩类型,也可以显式指定。此时,插入查询如下所示:hackernews 表中的行数:使用 curl 通过命令行插入数据
在前面的步骤中,你先使用wget 将 CSV 文件下载到本地机器。你也可以用一条命令直接从远程 URL 插入数据。运行以下命令,清空 hackernews 表中的数据,这样你就可以再次插入数据,而无需先下载到本地机器这一步中间操作: