接上一篇从0到1搭建clickhouse集群_天启的博客-CSDN博客_clickhouse集群
1、基本操作
1.1集群启动的基本步骤
master,node1,node2三个节点上各自执行如下操作
zkServer.sh start
service clickhouse-server start
然后在一台节点,这里使用master启动clickhouse客户端
clickhouse-client
1.2集群上创建数据库与删除数据库
创建数据库
create database databaseName on cluster clustersName;
databaseName是你要创建的数据库名称,clustersName是集群名称,必须要和配置文件metrika.xml中的一致
删除数据库
drop database databaseName on cluster clustersName;
1.3删除集群上的表
drop table tableName on cluster clusterName;
2、使用示例
1)在master节点上建表
- 该表会自动同步到node1和node2上
- 集群名字要和配置文件中的一致
- 分片和副本名称从配置文件中的宏定义中获取
create table st_order_mt on cluster gmall_cluster (
id UInt32,
sku_id String,
total_amount Decimal(16,2), create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/tables/{shard}/st_order_mt','{replica}')
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);
engine后面的参数,是提供给zookeeper区分该表的路径。对于不同分片上的表,路径必须唯一。第一个参数/clickhouse/table是官方要求的固定前缀;{shard}表示分片名,自动从配置文件获取;st_order_mt是表名;{replica}是副本名称,直接从配置文件metrika.xml中获取。shard和replica如果没有在/etc/clickhouse-server/config.d/metrika.xml下的<macros></macros>中指定的话,则无法通过{shard}和{replica}的方式获取,只能手动指定,如:
在master上为:
engine =ReplicatedMergeTree('/clickhouse/tables/1/st_order_mt','master')
在node1上为:
engine =ReplicatedMergeTree('/clickhouse/tables/2/st_order_mt','node1')
在node2上为:
engine =ReplicatedMergeTree('/clickhouse/tables/3/st_order_mt','node2')
注意:table_name
在3个节点上查看show tables;
若上述建表语句不使用on cluster,则需要在3个节点上分别执行建表语句,创建本地表。
2)创建分布式表
master节点执行如下语句
create table st_order_mt_all2 on cluster clustersName
(
id UInt32,
sku_id String,
total_amount Decimal(16,2), create_time Datetime
)engine = Distributed(clustersName,default, st_order_mt,hiveHash(sku_id));
Distriubed(集群名称,库名,本地表明,分片键)
分片键用于分片的key值,在数据写入的过程中,分布式表会根据分片key的规则,将数据分布到各个节点的本地表。必须是整型数字,所以需要用HiveHash好难受转换
使用了on cluster,这意味着在集群的每个分片节点上,都会创建一张Distributed表,
3)从分布式表插入数据
master节点执行
insert into st_order_mt_all2 values
(201,'sku_001',1000.00,'2020-06-01 12:00:00') ,
(202,'sku_002',2000.00,'2020-06-01 12:00:00'),
(203,'sku_004',2500.00,'2020-06-01 12:00:00'),
(204,'sku_002',2000.00,'2020-06-01 12:00:00'),
(205,'sku_003',600.00,'2020-06-02 12:00:00');
4)查询
从分布式表查询,master节点执行
SELECT * FROM st_order_mt_all2;
从本地表查询,master,node1,node2分别执行
select * from st_order_mt;
5)从本地表插入
在master节点执行
insert into st_order_mt values(206,'sku_id',5000.00,'2020-06-01 12:00:00');
在master,node1,node2查询
3、批量导入
和单节点的批量导入没有区别,以CSV格式为例。可以下载CSV数据集,这里手动写一个。
csv,json,xml,txt等格式都支持。
1)在master节点创建test.csv,添加数据,如下:
touch test.csv;
chmod 777 test.csv;
vim test.csv;
内容为:
207,‘sku_007’,4000,‘2020-06-03 12:00:00’,
208,’sku_008‘,4500,’2020-06-03 12:00:00‘,
2)导入数据
不执行clickhouse-client,先exit退出,然后直接在master节点执行下述语句,
cat test.csv | clickhouse-client --query="insert into st_order_mt_all2 format CSV";
或者
clickhouse-client --query "INSERT st_order_mt_all2 FORMAT TSV" --max_insert_block_size=100000 < test.csv
3)查询数据
在3台机器上分别执行select * from st_order_mt,可以看到新插入的数据被记录在node1和node2上
4.结果导出
先执行exit退出,然后在master节点执行如下语句:
clickhouse-client --query="select * from st_order_mt_all2">result.csv;
若不存在result.csv会自动创建,若存在该文件则会覆盖原有内容。result.csv的内容如下: