clickhouse查询同步远程集群

  • 需求

在使用ck时,我们难免会遇到跨集群的数据传输,比如数据备份,不同环境同步数据等。之前试过查询出来再写入,数据量少的情况还能接受,超过10w这样效率就显得很低了,而大数据环境下10w当然是不能接受的。所以ck也提供了一种比较高效的方式,直接跨集群传输,减少了io次数,进而大幅度提升效率。

  • 方案

ck提供remote函数,允许我们去查询远程的服务。(这里要吐槽下ck的文档,目录结构的划分实在是很难找到相关函数)

remote('addresses_expr', db, table[, 'user'[, 'password']])
remote('addresses_expr', db.table[, 'user'[, 'password']])
  • 示例

文档里面没有测试用例,这里我再补充一个查询远程表行数命令:

SELECT count(*) FROM 
remote('ip:port', 'database', 'test', 'user', 'password');

其中remote()函数就可以理解为远程表名,需要注意的是port是指TCP端口,也是就默认的9000端口。那么如何传输数据了,其实就和本地表一样,只需要insert into test select ...就行了。当然select部分是可以多层嵌套加条件的,而remote函数就可以理解为一个表名使用。我们在内网用一个测试表在测试集群传输。

dc_sit_02 :) select count(*) from test_all;

SELECT count(*)
FROM test_all

┌───count()─┐
│ 180990246 │
└───────────┘

条数180990246,约等于1.8亿。

dc_sit_02 :) insert into test_all SELECT * FROM remote('ip:9000', 'default', 'test_all', 'default', '');

INSERT INTO test_all SELECT *
FROM remote('ip:9000', 'default', 'test_all', 'default', '')

Ok.

Elapsed: 137.199 sec. Processed 180.99 million rows, 16.41 GB (1.32 million rows/s., 119.59 MB/s.) 

可以看到执行了137秒,约等于2分钟,数据大小16.4G,实际速率和集群资源决定。平均132w行/s,查询并且插入,速度已经算很快了。
如果你也有数据传输需求,不防试一试这个利器。

发布了62 篇原创文章 · 获赞 33 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/yyoc97/article/details/100974274