一、clickhouse简介
ClickHouse是俄罗斯的Yandex于2016年开源的一个用于联机分析(OLAP:Online Analytical Processing)的列式数据库管理系统(DBMS:Database Management System) , 主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。 ClickHouse的全称是Click Stream,Data WareHouse,简称ClickHouse
ClickHouse是一个完全的列式分布式数据库管理系统,允许在运行时创建表和数据库,加载数据和运行查询,而无需重新配置和重新启动服务器,支持线性扩展,简单方便,高可靠性,容错。它在大数据领域没有走 Hadoop 生态,而是采用 Local attached storage 作为存储,这样整个 IO 可能就没有 Hadoop 那一套的局限。它的系统在生产环境中可以应用到比较大的规模,因为它的线性扩展能力和可靠性保障能够原生支持 shard + replication 这种解决方案。它还提供了一些 SQL 直接接口,有比较丰富的原生 client。
优点:
灵活的MPP架构,支持线性扩展,简单方便,高可靠性
多服务器分布式处理数据 ,完备的DBMS系统
底层数据列式存储,支持压缩,优化数据存储,优化索引数据 优化底层存储
容错跑分快:比Vertica快5倍,比Hive快279倍,比MySQL快800倍,可处理数据级别已达到10亿级别
功能多:支持数据统计分析各种场景,支持类SQL查询,异地复制部署
海量数据存储,分布式运算,快速闪电的性能,几乎实时的数据分析 ,友好的SQL语法,出色的函数支持
缺点:
不支持事务,不支持真正的删除/更新
不支持高并发,官方建议qps为100,可通过修改配置文件增加连接数,但是在服务器足够好的情况下
不支持二级索引
不擅长多表join
元数据管理需要人为干预
尽量做1000条以上批量的写入,避免逐行insert或小批量的insert,update,delete操作
依赖zookeeper
应用场景:
1.绝大多数请求都是用于读访问的, 要求实时返回结果
2.数据需要以大批次(大于1000行)进行更新,而不是单行更新;或者根本没有更新操作
3.数据只是添加到数据库,没有必要修改
4.读取数据时,会从数据库中提取出大量的行,但只用到一小部分列
5.表很“宽”,即表中包含大量的列
6.查询频率相对较低(通常每台服务器每秒查询数百次或更少)
7.对于简单查询,允许大约50毫秒的延迟
8.列的值是比较小的数值和短字符串(例如,每个URL只有60个字节)
9.在处理单个查询时需要高吞吐量(每台服务器每秒高达数十亿行)
10.不需要事务
11.数据一致性要求较低 [原子性 持久性 一致性 隔离性]
12.每次查询中只会查询一个大表。除了一个大表,其余都是小表
13.查询结果显著小于数据源。即数据有过滤或聚合。返回结果不超过单个服务器内存大小
不适用场景:
不支持事务(对并发的读写不支持,批量插入是支持事务的)
不擅长根据主键按行粒度进行查询,不应该把ClickHouse当作Key-Value数据库使用
不擅长按行删除数据(支持但不擅长,一般批量删除)
二、基本概念
分片:ClickHouse的集群由分片 ( Shard ) 组成,而每个分片又通过副本 ( Replica ) 组成。ClickHouse的1个节点只能拥有1个分片。
分区 :ClickHouse支持PARTITION BY子句,在建表时可以指定按照任意合法表达式进行数据分区操作,比如通过toYYYYMM()将数据按月进行分区、toMonday()将数据按照周几进行分区。
副本:数据存储副本,在集群模式下实现高可用。
引擎:不同的引擎决定了表数据的存储特点和表数的操作行为:。
在clickhouse中数据库也有自己的引擎, 数据库目前支持的数据库引擎有5种:
·Ordinary:默认引擎,在绝大多数情况下我们都会使用默认引擎,使用时无须刻意声明。在此数据库下可以使用任意类型的表引擎
·Dictionary:字典引擎,此类数据库会自动为所有数据字典创建它们的数据表。
·Memory:内存引擎,用于存放临时数据。此类数据库下的数据表只会停留在内存中,不会涉及任何磁盘操作,当服务重启后数据会被清除。
·Lazy:日志引擎,此类数据库下只能使用Log系列的表引擎。
·MySQL:MySQL引擎,此类数据库下会自动拉取远端MySQL中的数据,并为它们创建MySQL表引擎的数据表。
三、clickhouse安装部署
单节点部署:
1)安装curl工具
yum install -y curl
2)添加clickhouse的yum镜像
curl -s https://packagecloud.io/install/repositories/altinity/clickhouse/script.rpm.sh | sudo bash
3)检查镜像情况
[root@doit04 yum.repos.d]# yum list | grep clickhouse
clickhouse-client.x86_64 20.5.4.40-1.el7 @Altinity_clickhouse
clickhouse-common-static.x86_64 20.5.4.40-1.el7 @Altinity_clickhouse
4)安装clickhouse的服务端和客户端
yum install -y clickhouse-server
yum -y install clickhouse-client
5)启动服务daunt
service clickhouse-server start
6)启动交互式客户端
clickhouse-client
分布式部署:
见 大数据之clickhouse常用函数
四、参数设置
1、允许其他机器访问
vi config.xml
<listen_host>::</listen_host>
service clickhouse-server restart --重启服务
2、目录结构
(1)/etc/clickhouse-server:服务端的配置文件目录,包括全局配置config.xml
和用户配置users.xml等。
(2)/var/lib/clickhouse:默认的数据存储目录(通常会修改默认路径配置,将数据保存到大容量磁盘挂载的路径)。
(3)/var/log/clickhouse-server:默认保存日志的目录(通常会修改路径配置,将日志保存到大容量磁盘挂载的路径)。
五、clickhouse基本入门
1、建表语句,一定要指定引擎
createtable tb_test(
id Int8 ,
name String
)engine=Memory;
2、数据类型
数值类型
数值类型分为整数、浮点数和定点数三类:
1、整数
2、浮点数
3、定点数
字符串类型
字符串类型可以细分为String、FixedString(固定长度)和UUID三类。
时间类型
时间类型分为Date、DateTime(精确到秒)和DateTime64(精确到亚秒)三类。
复杂类型
复杂类型分为Array、Enum、Tuple和Nested四类
1、Array数组类型
createtable test_array(
name String ,
hobby Array(String))engine=Log;insertinto test_array values('于谦',['抽烟','喝酒','烫头']);insertinto test_array values('班长',['抽烟','于谦']);
2、Enum枚举类型
createtable test_enum(
id UInt8 ,
color Enum('RED'=1,'GREEN'=2,'BLUE'=3))engine=Memory ;insertinto test_enum values(1,'RED'),(3,'BLUE');insertinto test_enum values(4,'PINK');-- 没有声明的值是不能插入
3、Tuple元祖类型
createtable test_tuple(
name String ,
info Tuple(String,String,UInt8))engine=Memory ;insertinto test_tuple values('zss',('M','coder',23)),('lss',tuple('F','coder',33));
4、Nested嵌套类型
createtable test_nested(
uid Int8 ,
name String ,
hobby Nested(
id Int8 ,
hname1 String ,
hname2 String
))engine=Memory ;insertinto test_nested values(1,'zss',[1,2,3],['吃','喝','睡'],['eat','drink','sleep']);insertinto test_nested values(2,'lss',[1,2],['吃','喝'],['eat','drink']);
特殊类型
特殊类型包括Domain 、IPv6、IPv4(存储ip地址)和Nulltable 类型
1、IPv4类型
createtable tb_ip2(
id Int8 ,
ip IPv4
)engine=Memory ;insertinto tb_ip2 values(1,'192.167.34.2');
2、Nulltable 类型
createtable tb_nulltable (
id Int8 ,
age Nulltable(Int8))engine=Memory ;
版权归原作者 大数据同盟会 所有, 如有侵权,请联系我们删除。