这是我参与「第四届青训营」笔记创作活动的第1天,笔记内容为《初识ClickHouse分布式数据库》,内容包括 ClickHouse概述、ClickHouse背景、ClickHouse特性、ClickHouse性能、ClickHouse常见数据类型、ClickHouse基础SQL语句。
ClickHouse概述
ClickHouse是俄罗斯的“百度”——Yandex公司在2016年开源的一款针对大数据实时分析的高性能分布式数据库,与之对应的有Hadoop生态hive,Vertica和百度出品的palo。这是“战斗民族”继nginx后,又开源的一款“核武器”。那么其作为分析型数据库,有 三大特点:
- 跑分快
- 功能多
- 文艺范
ClickHouse背景
由于是与大数据相关的数据库,那么就不得不提到Hadoop,当下的 Hadoop 已不仅仅是当初的HDFS + MR(MapReduce) 这么简单。基于 Hadoop 而衍生的 Hive、Pig、Spark、Presto、Impala 等一系列组件共同构成了 Hadoop 生态体系。Hadoop 生态为今天的大数据领域提供着稳定可靠的数据服务。然而,虽然Hadoop生态体系解决了大数据界的大部分问题,但也存在最大短板,即数据处理时效性。一般来说,基于 Hadoop 生态的数据处理场景大部分对时效要求不高,按照传统的做法一般是 T + 1 的数据时效。即 Trade + 1,数据产出在交易日的后一天。因此ClickHouse 的产生就是为了解决大数据量处理的时效性,独立于Hadoop生态圈。
ClickHouse特性
- 采用列式存储
- 数据压缩
- CPU 利用率高,在计算时会使用机器上的所有 CPU 资源
- 支持分片,并且同一个计算任务会在不同分片上并行执行,计算完成后会将结果汇总
- 支持SQL,SQL 几乎成了大数据的标准工具,使用门槛较低
- 支持联表查询
- 支持实时更新
- 自动多副本同步
- 支持索引
- 分布式存储查询
ClickHouse性能
- 低延迟: 对于数据量(几千行,列不是很多)不是很大的短查询,如果数据已经被载入缓存,且使用主码,延迟在50MS左右。
- 并发量: 虽然 ClickHouse 是一种在线分析型数据库,也可支持一定的并发,但当单个查询比较短时,官方建议100 Queries / second。
- 写入速度: 在使用 MergeTree 引擎的情况下,写入速度大概是 50 - 200M / s,如果按照 1K一条记录来算,大约每秒可写入50000 ~ 200000条记录每秒。如果每条记录比较小的话写入速度会更快。1亿条数据的文件2.2GB,导入Clickhouse用时24秒。查询统计用时0.185秒。
ClickHouse常见数据类型
- UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64。
- 固定长度的整数,带或不带标志。
- Float32, Float64: 就像java语言中的“float”和“double”一样.
- 字符串:任意长度的字符串。长度不限。该值可以包含任意字节集,包括空字节。String类型替换了其他DBMS类型的VARCHAR,BLOB,CLOB和其他类型。
- Date:一个Date以1970-01-01(无符号)以来的天数存储在两个字节中。
- DateTime:日期与时间以四个字节存储为Unix时间戳(无符号)。允许将值存储在与日期类型相同的范围内。最小值输出为0000-00-00 00:00:00。时间储存精度高达1秒(不闰秒)。
ClickHouse基础SQL语句
建库
CREATE DATABASE test ENGINE = Ordinary;
创建表
CREATE TABLE test01(id UInt16,col1 String,col2 String,create_date date) ENGINE = MergeTree(create_date, (id), 8192);
- NGINE:是表的引擎类型,
- MergeTree:最常用的,MergeTree要求有一个日期字段,还有主键。
- Log引擎没有这个限制,也是比较常用。
- ReplicatedMergeTree:MergeTree的分支,表复制引擎。
- Distributed:分布式引擎。
- create_date:是表的日期字段,一个表必须要有一个日期字段。
- id:是表的主键,主键可以有多个字段,每个字段用逗号分隔。
- 8192:是索引粒度,用默认值8192即可。
插入数据
方式1-交互式:
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), ...INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...
方式2-批量导入:
cat file.csv | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV"
查询数据
SELECT [DISTINCT] expr_list [FROM [db.]table | (subquery) | table_function] [FINAL] [SAMPLE sample_coeff] [ARRAY JOIN ...] [GLOBAL] ANY|ALL INNER|LEFT JOIN (subquery)|table USING columns_list [PREWHERE expr] [WHERE expr] [GROUP BY expr_list] [WITH TOTALS] [HAVING expr] [ORDER BY expr_list] [LIMIT n BY columns] [LIMIT [n, ]m] [UNION ALL ...] [INTO OUTFILE filename] [FORMAT format]