数据库系列文章之 ClickHouse入门

clickhouse安装与简单使用

Clickhouse是一个高性能且开源的数据库管理系统,主要用于在线分析处理(OLAP)业务。它采用列式存储结构,可使用SQL语句实时生成数据分析报告,另外它还支持索引,分布式查询以及近似计算等特性,凭借其优异的表现,ClickHouse在各大互联网公司均有广泛地应用。

官网:https://clickhouse.com/
中文官网:https://clickhouse.com/docs/zh

一、系统要求


ClickHouse可以在任何具有x86_64,AArch64或PowerPC64LE CPU架构的Linux,FreeBSD或Mac OS X上运行。

官方预构建的二进制文件通常针对x86_64进行编译,并利用SSE 4.2指令集,因此,除非另有说明,支持它的CPU使用将成为额外的系统需求。下面是检查当前CPU是否支持SSE 4.2的命令:
 

grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"

要在不支持SSE 4.2或AArch64,PowerPC64LE架构的处理器上运行ClickHouse,应该通过源代码构建ClickHouse。

二、部署

推荐使用CentOS、RedHat和所有其他基于rpm的Linux发行版的官方预编译rpm包。
在线安装,也可以下载后再安装。

yum install -y yum-utils
yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo
yum install -y clickhouse-server clickhouse-client

# 启动
/etc/init.d/clickhouse-server start

# 客户端连接
clickhouse-client # or "clickhouse-client --password" if you set up a password.

日志文件将输出在/var/log/clickhouse-server/文件夹。
如果服务器没有启动,检查/etc/clickhouse-server/config.xml中的配置。
您也可以手动从控制台启动服务器

clickhouse-server --config-file=/etc/clickhouse-server/config.xml

如果配置文件在当前目录中,则不需要指定——config-file参数。默认情况下,它的路径为./config.xml。 ClickHouse支持访问限制设置。它们位于users.xml文件(与config.xml同级目录)。 默认情况下,允许default用户从任何地方访问,不需要密码。可查看user/default/networks。 更多信息,请参见Configuration Files。 
启动服务后,您可以使用命令行客户端连接到它
 

clickhouse-client

默认情况下,使用default用户并不携带密码连接到localhost:9000。还可以使用–host参数连接到指定服务器。

终端必须使用UTF-8编码。

三、验证

在安装server端的机器上直接执行

[root@server2 etc]# clickhouse-client
ClickHouse client version 22.2.2.1.
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 22.2.2 revision 54455.

server2 :) select 1;

SELECT 1

Query id: 16581f5c-4dca-448b-9236-4d3b8fa43b89

┌─1─┐
│ 1 │
└───┘

1 rows in set. Elapsed: 0.001 sec. 

使用ClickHouse

1、新建分布式表

-- 查看宏变量
select * from `system`.macros;

-- 查看cluster
select * from `system`.clusters;

-- 创建本地表
-- create table `default`.optest on cluster cluster (a UInt64) Engine = MergeTree() order by tuple();

create table `default`.optest on cluster cluster (a UInt64) Engine = ReplicatedMergeTree('/clickhouse/tables/{shard}/default.optest','{replica}') order by tuple();

-- 创建本地表对应的分布式表
create table `default`.optest_dis on cluster cluster as optest Engine = Distributed(cluster, default, optest, cityHash64(a));

-- 删除本地表
drop table `default`.optest on cluster cluster;
-- 要等待480s才会删除zk中的数据

2、增删查改

INSERT INTO `default`.optest(a) values(10);
SELECT * FROM `default`.optest_dis;
ALTER TABLE `default`.optest  on cluster cluster UPDATE `a` = '11' WHERE `a` = '10';
SELECT * FROM `default`.optest_dis;
ALTER TABLE `default`.optest on cluster cluster DELETE WHERE `a`='11';
SELECT * FROM `default`.optest_dis;

四 clickhouse和hadoop的区别

一、背景


提到大数据不得不提 Hadoop,当下的 Hadoop 已不仅仅是当初的HDFS + MR(MapReduce) 这么简单。基于 Hadoop 而衍生的 Hive、Pig、Spark、Presto、Impala 等一系列组件共同构成了 Hadoop 生态体系。Hadoop 生态为今天的大数据领域提供着稳定可靠的数据服务。

Hadoop 生态体系解决了大数据界的大部分问题,当然其也存在缺点。Hadoop 体系的最大短板在于数据处理时效性。基于 Hadoop 生态的数据处理场景大部分对时效要求不高,按照传统的做法一般是 T + 1 的数据时效。即 Trade + 1,数据产出在交易日 + 1 天。

ClickHouse 的产生就是为了解决大数据量处理的时效性。独立于Hadoop生态圈。

二、概述


Clickhouse由俄罗斯yandex公司开发。专为在线数据分析而设计。Yandex是俄罗斯搜索引擎公司。官方提供的文档表名,ClickHouse 日处理记录数“十亿级”。

1.特性
采用列式存储。
数据压缩。
基于磁盘的存储,大部分列式存储数据库为了追求速度,会将数据直接写入内存,按时内存的空间往往很小。
CPU 利用率高,在计算时会使用机器上的所有 CPU 资源。
支持分片,并且同一个计算任务会在不同分片上并行执行,计算完成后会将结果汇总。
支持SQL,SQL 几乎成了大数据的标准工具,使用门槛较低。
支持联表查询。
支持实时更新。
自动多副本同步。
支持索引。
分布式存储查询。
2.性能
根据官方提供的数据,性能表现大致如下:

低延迟:对于数据量(几千行,列不是很多)不是很大的短查询,如果数据已经被载入缓存,且使用主码,延迟在50MS左右。
并发量:虽然 ClickHouse 是一种在线分析型数据库,也可支持一定的并发。当单个查询比较短时,官方建议100 Queries / second。
写入速度:在使用 MergeTree 引擎的情况下,写入速度大概是 50 - 200M / s,如果按照 1K一条记录来算,大约每秒可写入50000 ~ 200000条记录每秒。如果每条记录比较小的话写入速度会更快。
 

3.接口
对外提供Http,JDBC两种接口方式
对内各模块间使用TCP连接通信。
Hadoop 体系是一种离线系统,一般很难支持即席查询。ClickHouse 可以支持即席查询。
Hadoop 体系一般不支持实时更新,都采用批量更新和写入。ClickHouse 支持实时数据更新。
Hadoop 体系一般采用行记录存储,数据查询需要扫描所有列,当表很宽时会扫描很多用不到的列。ClickHouse 是列式存储,查询只需要加载相关的列。
4.与hadoop 区别
分区新特性:

在老版本的 ClickHouse 中只支持按月分区。
在 1.1.54310 版之后,支持用户自定义分区。
可以通过 system.parts 表查看表的分区情况。
整型:JInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64。释:(范围U开头-2^N/2~2^N-1;非U开头0~2^N-1)
枚举类型:Enum8,Enum16。释:(Enum('hello'=1,'test'=-1),Enum是有符号的整型映射的,因此负数也是可以的)
字符串型:FixedString(N),String。释:(N是最大字节数,不是字符长度,如果是UTF8字符串,那么就会占3个字节,GBK会占2字节;String可以用来替换VARCHAR,BLOB,CLOB等数据类型)
时间类型:Date,DateTime。
数组类型:Array(T)。释:(T是一个基本类型,包括arry在内,官方不建议使用多维数组)元祖数:Tuple
结构:Nested(name1 Type1,name2 Type2,...)。释:(类似一种map的结构)


三、引擎


1.引擎列表
2.引擎介绍
TinyLog引擎:

TinyLog 是最简单的表引擎, 它将数据保存到磁盘。每个字段都以单独压缩文件形式保存,当写入数据时, 数据追加到文件的末尾。

并发数据访问不限制任何形式:

l  如果你同时对此表进行读写,如从表中读取数据的同时写入数据到此表,那么读操作将会报错。

l  如果同时并行往表里写入数据,那么数据将损坏。

使用此表的标准方式是一次写入:一写多读的应用场景。查询在单个流中执行。换句话说,本引擎适合很多小表操作(100万行左右的表)。如果你有很多小表,那么适合于使用本引擎,它比Log更简单(使用文件更小)。当你有大量小表的时候,你可以使用 TinyLog 引擎来存储这些数据,和进行下一步查询服务。另外,索引不支持 TinyLog 引擎。TinyLog 表经常作为中间表,用于数据的微批量处理。

Log引擎:

Log 区别于 TinyLog ,小文件的标记 "marks" 保留在列文件中. 这些标记写到每个数据块中 ,包含偏移量,在哪开始读文件,跳过特定的行数. 此机制可以多线程并行读取表中的数据. 对于并发数据访问, 读操作能够同时执行,而写操作将阻塞读操作,或者读写操作互相阻塞。 Log 引擎不支持索引。 与之类似的是, 如果写入到数据表失败, 则表将损坏, 从表中读取数据将返回错误。 Log 引擎适合存储临时数据, 一次写入表, 或者用于测试环境。

Memory引擎:

内存表引擎保存在内存中, 数据处于未压缩状态。数据保存格式与读取数据的格式相同。换句话说, 从本表中读取数据是完全相同的。 并发数据访问是同步的。无锁访问: 读写数据操作互相不受影响,但数据索引不支持,读取数据是并行执行的。因为无磁盘读写, 压缩/解压缩, 和序列化/反序列化操作,因此单个SQL语句查询可达到 10 GB/秒。 (在大多数情况下, Memory 引擎的数据处理效率和 MergeTree 的引擎相差无几)。当重启服务器后, 数据会在表中清空,不存在。正常情况下, 内存表引擎不经常使用,它可用于小数据量(1亿条左右)的高速读取数据场景或用于测试环境。内存引擎也可用于外部数据的临时表查询和实现 GLOBAL IN 操作。

MergeTree引擎:

MergeTree 引擎支持索引,通过主键和日期来构建索引, 同时提供 数据的实时更新能力。这是目前 ClickHouse处理能力最好的引擎。注意:不要和 Merge 引擎相混淆。

Kafka:

表引擎的后台为Kafka,Kafka 作为流数据平台具备三个关键能力:

l  它让你发布和订阅记录数据流。它类似消息队列或者企业级消息总线。

l  它让你以容错的方式来存储记录数据流。

l  它让你以流式的方式处理记录数据流。

Distributed

分布式引擎本身不存储数据,但允许在多个服务器上进行分布式查询处理。 读取是自动并行的。 在读取数据期间,使用远程服务器上的表索引(如果有的话)。 分布式引擎接受参数:服务器配置文件中的集群名称,远程数据库的名称,远程表的名称以及(可选)分片键。

四、总结


Clickhouse是内存计算的列式存储数据仓库,目前只支持Ubuntu、Centos等操作系统。相对于Hive来说,查询速度特别快,这是由于Hive依赖于HDFS和Mapreduce来实现功能,而Clickhouse是独立的实现逻辑,并且Clickhouse是基于内存计算的实时数据查询、更新。所以Clickhouse是具有Spark、Impala等功能的即时响应数据仓库。未来潜力巨大。

但从单机版安装来看,Clickhouse类似于Mysql,包括软件安装、服务启停、进入退出客户端等,比较容易上手。但对于性能优化、底层架构的了解还需要更进一步的学习,目前也没有官方给出Clickhouse的机构图。

你可能感兴趣的:(数据库,clickhouse)