初识ClickHouse分布式数据库|青训营笔记

271 阅读4分钟

图片.png

这是我参与「第四届青训营」笔记创作活动的第1天,笔记内容为《初识ClickHouse分布式数据库》,内容包括 ClickHouse概述、ClickHouse背景、ClickHouse特性、ClickHouse性能、ClickHouse常见数据类型、ClickHouse基础SQL语句。

ClickHouse概述

图片.png

ClickHouse是俄罗斯的“百度”——Yandex公司在2016年开源的一款针对大数据实时分析的高性能分布式数据库,与之对应的有Hadoop生态hive,Vertica和百度出品的palo。这是“战斗民族”继nginx后,又开源的一款“核武器”。那么其作为分析型数据库,有 三大特点:

  • 跑分快
  • 功能多
  • 文艺范

ClickHouse背景

图片.png

由于是与大数据相关的数据库,那么就不得不提到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]