ClickHouse实战--使用分布式表_一 铭的博客-CSDN博客_clickhouse 分布式表


本站和网页 https://blog.csdn.net/zg_hover/article/details/124555580 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

ClickHouse实战--使用分布式表_一 铭的博客-CSDN博客_clickhouse 分布式表
ClickHouse实战--使用分布式表
一 铭
于 2022-05-03 15:08:38 发布
3367
收藏
10
分类专栏:
ClickHouse
文章标签:
数据库
clickhouse实战
clickhouse
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zg_hover/article/details/124555580
版权
ClickHouse
专栏收录该内容
9 篇文章
2 订阅
订阅专栏
ClickHouse实战–使用分布式表
分布式表非实体表,本质上来说是一个视图。由于CK的节点是对等的(没有主从的概念),当一个分布式表接收到请求时,请求会落到一个其中一个节点上,接收请求的节点,会把SQL进行拆分,并把请求发送到其他各个节点上,然后再对数据进行聚合,并把聚合好的结果返回给客户端。
查看集群信息
由于在创建分布式表时会用到集群名,所以,需要查看一个集群的信息。可以通过一个sql查看集群信息。
select * from system.clusters;
查看系统设置
select * from system.settings;
分布式表的创建
创建分布式表时,一般是先存在本地表。分布式表是基于本地表创建来进行创建。创建的基本语法如下:
CREATE TABLE [IF NOT EXISTS] [db.]table_name
[ON CLUSTER cluster] AS [db2.]name2
ENGINE = Distributed(cluster, database, table[, sharding_key[, policy_name]])
[SETTINGS name=value, ...]
要注意的是:默认情况下分布式表的数据插入是异步的,若要实现同步的分布式表数据插入,需要设置参数。
分布式引擎参数解释
cluster - 服务为配置中的集群名database - 远程数据库名table - 远程数据表名sharding_key - (可选) 分片keypolicy_name - (可选) 规则名,它会被用作存储临时文件以便异步发送数据
在创建分布式表时,还有几个重要的setting参数需要注意:
insert_distributed_sync:默认情况下,向分布式表中插入数据时,ClickHouse 服务器以异步方式向集群节点发送数据。当insert_distributed_sync=1时,数据是同步处理的,只有在所有shard上都保存了所有数据后INSERT操作才成功(如果internal_replication为true,每个shard至少有一个replica)。fsync_after_insert:在异步插入到分布式后对文件数据进行 fsync。保证操作系统将整个插入的数据刷新到启动器节点磁盘上的文件中。
分布式表实战
查看分布式集群信息
可以先通过sql语句来查看一下系统的集群配置。
:) select * from system.clusters;
─cluster────────────────────┬─host_name───┬─host_address─┬─port─┐
│ perftest_2shards_1replicas │ x.x.x.1xx │ x.x.x.xxx │ 9000 │
│ perftest_2shards_1replicas │ x.x.x.2xx │ x.x.x.xxx │ 9000 │
└────────────────────────────┴─────────────┴──────────────┴──────┘
通过以上输出可知,我们的集群名是:perftest_2shards_1replicas。
创建集群的本地表
CREATE TABLE if not exists test_db.city_local on cluster perftest_2shards_1replicas
`id` Int64,
`city_code` Int32,
`city_name` String,
`total_cnt` Int64,
`event_time` DateTime
Engine=MergeTree()
PARTITION BY toYYYYMMDD(event_time)
ORDER BY id;
创建分布式表
分布式表实际上是一个视图,因此它需要与分片(服务器节点)具有相同的表结构定义。创建视图后,将在每个分片(服务器节点)上查询数据,并将结果聚合到最初调用查询的节点上。
在其中一个节点上执行以下创建分布式表的语句:
CREATE TABLE test_db.city_all on cluster perftest_2shards_1replicas
AS test_db.city_local
ENGINE = Distributed(perftest_2shards_1replicas, test_db, city_local, rand());
注意:在创建分布式表时需要添加上on cluster xxx。另外,创建分布式表的语法,可以参考官方文档。
Distributed中参数中,第1个参数:集群名;第2个参数:数据库名;第3个参数:本地表名;第4个参数:分布策略。
向分布式表中插入数据
insert into test_db.city_all (id, city_code, city_name, total_cnt, event_time) values (1, 4000, 'guangzhou', 420000, '2022-02-21 00:00:00');
insert into test_db.city_all (id, city_code, city_name, total_cnt, event_time) values (2, 5000, 'shenzhan', 55000, '2022-02-22 00:00:00');
insert into test_db.city_all (id, city_code, city_name, total_cnt, event_time) values (3, 6000, 'huizhou', 65000, '2022-02-23 00:00:00');
insert into test_db.city_all (id, city_code, city_name, total_cnt, event_time) values (4, 7000, 'huizhou', 75000, '2022-02-24 00:00:00');
insert into test_db.city_all (id, city_code, city_name, total_cnt, event_time) values (5, 8000, 'huizhou', 75001, '2022-02-25 00:00:00');
查看一下分布式表的数据条数:
:) select count() from city_all;
SELECT count() FROM city_all
Query id: eff9e667-61d7-4302-93dc-9d7379d234db
┌─count()─┐
│ 5 │
└─────────┘
连接到其中一个节点,查看本地表的数据条数:
:) select count() from city_local;
SELECT count() FROM city_local
Query id: 24347cdb-4cfe-4d6b-8492-90d40c8e0e2c
┌─count()─┐
│ 3 │
└─────────┘
更新分布式表的数据
想要更新分布式表的数据时,可以通过更新本地表的数据来完成。不过在更新本地表的数据时,必须添加on cluster xxx。否则只会在其中一个节点中进行操作。另外,不能直接更新分布式表。
更新本地表的语句如下:
ALTER TABLE city_local ON CLUSTER perftest_2shards_1replicas UPDATE total_cnt = 5555 WHERE city_name = 'shenzhan';
通过以上sql语句,可以正确的完成数据的更新。更新完成后,可以通过以下sql语句来查看更新后的数据。
select * from city_all order by id;
我们尝试来通过分布式表来更新数据,会报错。
ALTER TABLE city_all ON CLUSTER perftest_2shards_1replicas UPDATE total_cnt = 4444 WHERE city_name = 'shenzhan';
会报以下错误:
┌─host────────┬─port─┬─status─┬─error───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─num_hosts_remaining─┬─num_hosts_active─┐
│ xxx.xxx.1xx.xx│ 9000 │ 60 │ Code: 60, e.displayText() = DB::Exception: Table test_db.city_all doesn't exist (version 21.8.10.19 (official build)) │ 1 │ 0 │
│ xxx.xxx.2xx.xx │ 9000 │ 48 │ Code: 48, e.displayText() = DB::Exception: Table engine Distributed doesn't support mutations (version 21.8.10.19 (official build)) │ 0 │ 0 │
└─────────────┴──────┴────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────────┴──────────────────┘
↘ Progress: 0.00 rows, 0.00 B (0.00 rows/s., 0.00 B/s.) 0%
所以,可知,不能通过分布式表来更新数据。
另外,要注意,CK在更新数据时,哪怕更新一条数据,也会重写该条数据所在分区的所有数据,所以,CK的更新操作是一个很重的操作,不能频繁进行。特别是当数据量非常大的时候,进行数据的更新更是要谨慎。
修改分布式表的结构
一般来说,分布式表的表结构必须要和本地保持一致的。在修改表结构时,最好不要直接通过alter语句进行表结构的修改,而是新建一张表,然后把老表的数据导入到新表中。
比如我们有一张表t1_local,分布式表d1_all,需要修改表结构。一般情况下,修改分布式表的表结构的步骤是:
(1)按新的表结构创建一个新的集群本地表(必须添加on cluster xxx),比如为:t2_local
(2)按新的本地表创建一个分布式表(添加on cluster xxx),比如为:d2_all
(3)把老的数据表中的数据导入新的分布式表中:insert into d2_all select f1,f2,f3,fn from d1_all。注意:这一步也可以导入到本地表t2_local中,导入分布式表是为了让数据按新的分片策略进行分片。
(4)验证一下数据是否导入完成。
(5)修改老的本地表名为t1_local_bk,修改新的本地表名为:t1_local。必须添加on cluster xxx。此时,以前的分布式表d1_all没有修改,但我们修改了本地表的名称,所以在对d1_all分布式表进行操作时,会对最新的本地表上进行。
另外,要注意,为了避免数据丢失,在进行表结构更新操作时,最好停止数据写入的操作。
小结
本文介绍了分布式表的基本操作。包括分布式表的创建,如何向分布式表插入数据,如何更新分布式表的表结构等操作。
参考资料
分布式引擎的说明https://medium.com/@merticariug/distributed-clickhouse-configuration-d412c211687c
一 铭
关注
关注
点赞
10
收藏
打赏
评论
ClickHouse实战--使用分布式表
本文介绍了分布式表的基本操作。包括分布式表的创建,如何向分布式表插入数据,如何更新分布式表的表结构等操作。
复制链接
扫一扫
专栏目录
ClickHouse最佳实战之分布表写入流程分析
京东科技开发者
10-14
1595
云妹导读:前不久,京东智联云正式上线了基于Clickhouse的分析型云数据库JCHDB,一经推出便受到广大用户的极大关注。有兴趣的小伙伴可以回顾上一篇文章《比MySQL快839倍!揭开...
clickhouse的Distributed分布式表查询的性能陷阱
lixia0417mul2的博客
09-19
271
clickhouse 分布式表查询性能陷阱 clickhouse分布式表group by慢
参与评论
您还未登录,请先
登录
后发表或查看评论
ClickHouse系列--分布式表写入流程
IT云清
05-28
2351
摘要:在向ck集群写入数据的过程,有2种方案,一种是直接写本地表,一种是通过Distributed表引擎写分布式表。本文介绍写分布式表的核心流程。
先假定场景和统一命名:
我们假设有cluster1,和cluster2两个集群。
本地表log_local对应的分布式表为log_all。
假设请求A进来后请求到cluster1的分布式表log_all,要写入100条数据。
1.第一个分片写本地数据
1)cluster1节点接收到请求后,会根据分片键/分片表达式计算这100条数据的分片划分,一部分应该到clus
python Clickhouse 分布式表介绍和创建、插入和查询数据,以及解决遇到的问题
最新发布
qq_45956730的博客
11-11
554
Clickhouse 分布式表介绍和创建、插入和查询数据,以及解决遇到的问题
ClickHouse系列--数据读写方案
IT云清
05-18
1200
1.概念
1.分布式表
分布式表,是一个逻辑上的表,是一些本地表的逻辑视图。
Distributed表引擎是分布式表的实现,它自身不存储任何数据,数据都分散存储在分片上,能够自动路由请求至集群中的各个节点,然后进行汇总后返回给用户,Distributed表引擎需要和其他数据表引擎一起协同工作。
一张分布式表底层会对应多个本地分片数据表,由具体的分片表存储数据,分布式表与分片表是一对多的关系。
2.本地表
实际存储数据的表。
2.读数据方案
读数据一般都是直接读分布式表。
1.分布式引擎会自动从集群中的多个服
Flink 相关的深度技术博客链接
认知 行动 坚持
08-24
925
Flink相关的深度技术博客链接
超全干货--Flink思维导图,花了3周左右编写、校对
大解密:Flink恰巧语义一次消费,怎么保证
Flink 容错机制 —— CheckPoint【含示例源码】
文章最后,给大家推荐一些受欢迎的技术博客链接:
Flinak 相关技术博客链接
Hadoop相关技术博客链接
Spark核心技术链接
JAVA相关的深度技术博客链接
超全干货--Flink思维导图,花了3周左右编写、校对
深入JAVA 的JVM核心原理解决线上各种故障【附案例】
请...
大数据面试通关手册 | ClickHouse基础&实践&调优全视角解析
微信搜:import_bigdata,大数据领域硬核原创作者
06-09
1646
点击上方蓝色字体,选择“设为星标”回复”资源“获取更多资源我们在之前的文章中提到过ClickHouse:《腾讯基于Flink+ClickHouse的实时数据系统实践》《来自俄罗斯的凶猛彪悍...
ClickHouse创建分布式表
Jeremy
12-22
4530
ClickHouse创建分布式表
当数据量剧增的时候,clickhouse是采用分片的方式进行数据的存储的,类似于redis集群的实现方式。然后想进行统一的查询的时候,因为涉及到多个本地表,可以通过分布式表的方式来提供统一的入口。由于是涉及到分布式存储,保证高可用就必须有数据冗余—即副本(replica)。Clickhouse依靠ReplicatedMergeTree引擎族与Zookeeper实现了复制表机制,成为其高可用的基础。该引擎和 MergeTree 的不同之处在于它会删除排序键值相同的重复项。
clickhouse 五(分布式表原理解析)
写bug的小哥哥
10-15
6026
1.Distributed引擎介绍
Distributed表引擎是分布式表的代名词,它⾃身不存储任何数据,⽽是作为数据分⽚的透明代理,能够⾃动的
路由数据⾄集群中的各个节点,即分布式表需要和其他数据表⼀起协同⼯作。分布式表会将接收到的读写任务,
分发到各个本地表,而实际上数据的存储也是保存在各个节点的本地表中。
原理如下图:
2.创建分布式表
使用on cluster语句在集群的某台机器上创建一下代码,即可在每台机器上创建本地表和分布式表,
⼀张本地表对应着⼀个数据分⽚,分布式表通常以本地表加“_al
ClickHouse实时分析(七)- ClickHouse分布式表详解
程序园@一位木带感情的码农
03-29
6314
ClickHouse分布式集群搭建教程详解,什么是ClickHouse分布式表,分布式表数据写入读取流程详解,如何配置ClickHouse分布式表
MySQL解决修复表时提示 “The storage engine for the table doesn't support repair“问题
热门推荐
美奇软件开发工作室
05-16
1万+
遇到的问题, 如下图:
“ The storage engine for the table doesn't support repair “的意思是:“该表的存储引擎不支持修复”,通过表设计查看,可以看到该表的引擎是InnoDB。
InnoDB支持外键参照完整性,具备故障恢复能力,所以不需要修复!
解决方案:
1、从数据库设计上来讲,是不需要修复这个表的。
2、如...
【ClickHouse源码】Distributed之表insert流程
一只努力的微服务
11-19
1478
Distributed表引擎介绍
Distributed表引擎是一种特殊的表引擎,自身不会存储任何数据,而是通过读取或写入其他远端节点上的表进行数据处理的表引擎。该表引擎需要依赖各个节点的本地表来创建,本地表的存在是Distributed表创建的依赖条件,创建语句如下:
CREATE TABLE {teble} ON CLUSTER {cluster}
AS {local_table}
ENGINE= Distributed({cluster}, {database}, {local_table},{pol
clickhouse Mutations删除操作报错及解决方案
王者丶丿风范
04-12
3695
1. clickhouse 执行删除语句后查询数据仍旧存在,等待数分钟后依然存在
2. 查询 system.Mutations 表 ```sql select * from system.mutations where
is_done = 0; ```发现任务在突变表中状态一直是未执行
3. 查阅 /var/log/clickhouse-server/clickhouse-server.err.log 日志发现如下报错
2021.04.09 10:59:12.971073 [ 6363 ] {}
ClickHouse 实战:ClickHouse 基础数据类型极简教程
禅与计算机程序设计艺术
03-13
4790
1.ClickHouse基础数据类型道生一,一生二,二生三,三生万物。——【春秋·老子】道德经·第四十二章在第 2 章中,我们通过“一顿猛如虎的操作”,ClickHouse 环境已经...
clickhouse创建分布式数据库和分布式表
shy_snow的专栏
05-19
1270
前提:有多个clickhouse节点并在metrika.xml配置分片和副本。
-- 查询cluster集群名称 比如nx_clickhouse_4shards_1replicas
select * from system.clusters;
drop database test on cluster nx_clickhouse_4shards_1replicas ;
create database test on cluster nx_clickhouse_4shards_1replicas ;
ClickHouse安装与引擎
qq_41878423的博客
07-12
316
clickhouse初识
Distributed表引擎Insert和Select流程
style_boy的博客
06-07
390
ClickHouse依靠Distributed引擎实现了Distributed(分布式)表机制,在所有分片(本地表)上建立视图进行分布式查询,。它是一种特殊的表引擎,自身不会存储任何数据,而是通过读取或写入其他远端节点上的表进行数据处理的表引擎。该表引擎需要依赖各个节点的本地表来创建,本地表的存在是Distributed表创建的依赖条件,创建语句如下:
CREATE TABLE {teble} ON CLUSTER {cluster}
AS {local_table}
ENGINE= Distributed
ClickHouse系列之集群副本与分片
Jerome Wu の那点事儿
08-11
783
概述
​本文主要为大家介绍ClickHouse三板斧(集群、副本与分片)
集群
​集群是副本和分片的基础,它将ClickHouse的服务拓扑由当前节点延伸到多个节点,但它并不像Hadoop生态某系统那样,要求所有节点组成一个单一的大集群(服务级别)。ClickHouse的集群配置比较灵活,用户既可以组成一个单一集群,也可以按照业务划分为多个小集群(表级别),它们的节点、副本和分片数量可各不相同。
​从作用来看,ClickHouse集群的工作可以理解为是针对逻辑层面的,而执行层面的具体工作则交给副本和分
ClickHouse集群搭建部署
u013332124的专栏
01-27
9011
文章目录一、单机版安装和启停二、集群部署搭建1、手动搭建clickhouse集群2、使用docker-compose快速搭建clickhouse集群三、集群扩容如何保证扩容后的数据均匀分布?四、集群缩容docker-compose 中的一些文件
一、单机版安装和启停
单机版的安装相对简单,官网介绍了好几种办法:
https://clickhouse.com/docs/zh/getting-started/install/
这里提一下tgz安装包的方式,目前官网的文档有点问题(不知道将来会不会更新)。从21
Clickhouse 分布式表&本地表 &ClickHouse实现时序数据管理和挖掘
06-03
1678
一、CK 分布式表和本地表(1)CK是一个纯列式存储的数据库,一个列就是硬盘上的一个或多个文件(多个分区有多个文件),关于列式存储这里就不展开了,总之列存对于分析来讲好处更大,因为每个列单独存储,所以每一列数据可以压缩,不仅节省了硬盘,还可以降低磁盘IO。(2)CK是多核并行处理的,为了充分利用CPU资源,多线程和多核必不可少,同时向量化执行也会大幅提高速度。(3)提供SQL查询接口,CK的客户端连接方式分为HTTP和TCP,TCP更加底层和高效,HTTP更容易使用和扩展,一般来说HTTP足矣,社区已经有很
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:深蓝海洋
设计师:CSDN官方博客
返回首页
一 铭
CSDN认证博客专家
CSDN认证企业博客
码龄17年
暂无认证
306
原创
2万+
周排名
4289
总排名
91万+
访问
等级
9782
积分
236
粉丝
124
获赞
83
评论
582
收藏
私信
关注
热门文章
vim 命令(全)
86108
shell学习之-sed用法解析
73492
linux 守护进程编写
48603
flink实战—时间窗口(Time Windows)的原理和使用
30985
如何调整pdf的页边距
21085
分类专栏
架构设计
3篇
ClickHouse
9篇
Docker&K8s
4篇
Structured Streaming
8篇
我的微信公众号
深入浅出Spark原理
46篇
spark sql实战
19篇
深入浅出Spark SQL原理
20篇
任务调度
7篇
数据湖
3篇
Beanstalkd研究
16篇
Kafka研究
9篇
Go并发编程
11篇
flink实战
18篇
twemproxy研究
7篇
spark
66篇
大数据处理
36篇
flink
19篇
缓存系统
3篇
storm
1篇
redis研究
10篇
数据挖掘&机器学习
4篇
java
14篇
HBase
2篇
中间件
24篇
elasticsearch
3篇
zookeeper
4篇
大数据治理
1篇
图计算
7篇
区块链
5篇
Go语言编程
12篇
fabric
2篇
C程序设计
12篇
linux系统管理及应用程序配置
22篇
linux系统编程
21篇
kernel相关
2篇
shell编程
11篇
其他
3篇
源码阅读和管理
6篇
生活中的大学
3篇
程序的灵魂-算法
1篇
数据库
1篇
最新评论
spark2原理分析-广播变量(Broadcast Variables)的实现原理
qq_53756331:
引用「blockManagerMaster」
spark2实战-使用checkpoint保存和读取还原RDD
m0_73412765:
为什么要把调用checkpointfile写成protected?这样不是不方便调用吗?
ClickHouse实战--ClickHouse的主键
白snow:
大佬,请问怎么在新增加列的同时设置这列为主键
如何在vim中轻松阅读代码
一 铭:
文章中有写哈:在/home/username/下建立一个文件夹 .vim/plugins 或 .vim/plugin
如何在vim中轻松阅读代码
__kaixa_:
那两个.vim文件放在哪里
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Memcached源码分析-主架构分析
软件架构--开闭原则(Open-Closed Principle, OCP)
软件架构是什么
2022年18篇
2021年44篇
2020年31篇
2019年58篇
2018年62篇
2017年34篇
2012年3篇
2010年6篇
2009年37篇
2008年14篇
2007年14篇
2006年9篇
目录
目录
分类专栏
架构设计
3篇
ClickHouse
9篇
Docker&K8s
4篇
Structured Streaming
8篇
我的微信公众号
深入浅出Spark原理
46篇
spark sql实战
19篇
深入浅出Spark SQL原理
20篇
任务调度
7篇
数据湖
3篇
Beanstalkd研究
16篇
Kafka研究
9篇
Go并发编程
11篇
flink实战
18篇
twemproxy研究
7篇
spark
66篇
大数据处理
36篇
flink
19篇
缓存系统
3篇
storm
1篇
redis研究
10篇
数据挖掘&机器学习
4篇
java
14篇
HBase
2篇
中间件
24篇
elasticsearch
3篇
zookeeper
4篇
大数据治理
1篇
图计算
7篇
区块链
5篇
Go语言编程
12篇
fabric
2篇
C程序设计
12篇
linux系统管理及应用程序配置
22篇
linux系统编程
21篇
kernel相关
2篇
shell编程
11篇
其他
3篇
源码阅读和管理
6篇
生活中的大学
3篇
程序的灵魂-算法
1篇
数据库
1篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
一 铭
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值