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,查詢並且插入,速度已經算很快了。
如果你也有數據傳輸需求,不防試一試這個利器。下一節 介紹一個運維重要知識點,查看clickhouse集羣、表容量相關信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章