ClickHouse学习教程

what

官网说明

a fast open-source OLAP database management system. It is column-oriented and allows to generate analytical reports using SQL queries in real-time.

学习资料参考

GitHub
clickhouse-doc-zh
china
数据目录
由浅入深系列
阿里云clickhouse
optional

book

ClickHouse原理解析与应用实践

个人

朱凯

altinity

官网
clickhouse-operator
Altinity是国外一家从事ClickHouse咨询、服务的公司,该公司高管由ClickHouse开发者,以及来自Percona的专家组成。目前Altinity的ClickHouse云服务测试版已经上线。

安装

ClickHouse集群搭建从0到1

数据类型

ClickHouse 数据类型介绍

SQL

DESCRIBE TABLE:

CHECK TABLE: 检查表中的数据是否损坏,返回两种结果: 0 – 数据已损坏; 1 – 数据完整;
该命令只支持 Log,TinyLog 和 StripeLog 引擎。

ORDER BY 决定每个分区中数据的排序规则;

PRIMARY KEY 决定一级索引(primary.idx);

ORDER BY 可以指代PRIMARY KEY,通常只用声明ORDER BY 即可。

DROP 删除元数据和数据,TRUNCATE 只删除数据。

删除数据:ALTER TABLE [db.]table DELETE WHERE filter_expr

更新数据:ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE filter_expr

条件:

  1. 版本号1.1.54388+,以及mergeTree引擎;
  2. 这两条命令是异步执行的,可以通过查看表 system.mutations 来查看命令的是否执行完毕
    select * from system.mutations where table='test_update';
  3. 不可以用于分布式表,需要在每台机器上的local表中来执行

系统表

系统表说明
系统表用于实现部分系统功能,并提供途径来获取与系统运行状态相关的信息。
系统表无法删除(但可以执行 DETACH)。
系统表中的数据或者元数据没有以文件的方式存储在磁盘上。server 启动时将创建所有系统表。
系统表是只读的。
系统表位于system数据库中。

几个主要的系统表:

  1. system.asynchronous_metrics

表引擎

TinyLog

Memory

Merge

Distributed

Distributed(logs, default, hits[, sharding_key])
Distributed(cluster_2shards_2replicas, default, topic_lycf_h5_pageview_ubt, rand());
参数:服务器配置文件中的集群名,远程数据库名,远程表名,数据分片键(可选)。数据分片键的概念就是数据插入时是根据什么原则分配到具体分片上的。

集群的名称是在集群搭建时的metrika.xml文件中配置的,可在配置中配置任意数量的集群。

Clickhouse创建分布式表以及表引擎介绍

MergeTree

ClickHouse各种MergeTree的关系与作用

MergeTree

数据是由多组part文件组成,每一个part的数据是按照主键进行字典序排列。这些数据片段在后台按照一定规则合并。

SummingMergeTree

ReplacingMergeTree

和MergeTree的不同之处在于它会删除具有相同主键的重复项。但数据的去重只会在merge的过程中出现,merge操作是后台进程异步执行。
OPTIMIZE TABLE 操作可以手动触发merge操作,但会引发对大量数据的读和写操作,降低性能。因此,ReplacingMergeTree 适用于在后台清除重复的数据以节省空间,并不保证没有重复的数据出现。

AggregatingMergeTree

ClickHouse会将相同主键的行(在一个数据片段内)替换为单个存储一系列聚合函数状态的行。可以使用 AggregatingMergeTree 表来做增量数据统计聚合,包括物化视图的数据聚合。

SummingMergeTree

当合并 SummingMergeTree 表的数据片段时,ClickHouse 会把所有具有相同主键的行进行汇总,将同一主键的行替换为包含sum后的一行记录。如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度。

CollapsingMergeTree

在创建时与 MergeTree 基本一样,除了最后多了一个参数,需要指定 Sign 位(必须是 Int8 类型)。CollapsingMergeTree 会异步的删除(折叠)除了特定列 Sign 1 和 -1 值以外的所有字段的值重复的行。

VersionedCollapsingMergeTree

是collapsingmergetree的升级,使用不同的collapsing算法,该算法允许使用多个线程以任何顺序插入数据。

副本

INSERT 和 ALTER 操作副本间会复制。
CREATE,DROP,ATTACH,DETACH 和 RENAME 语句只会在单个服务器上执行,不会被复制。
复制表需要借助Zookeeper。
相比非复制表,写 zk 会导致 INSERT 的延迟略长一些,建议不要每秒一个INSERT,尽量批量写入。
复制是多主异步。
默认INSERT 语句仅等待一个副本写入成功后返回,insert_quorum参数可以指定几个副本写入成功后返回,默认为0。
数据块会自动去重。

只有 Replicated*MergeTree 系列里的表可支持副本:

  • ReplicatedMergeTree
  • ReplicatedSummingMergeTree
  • ReplicatedReplacingMergeTree
  • ReplicatedAggregatingMergeTree
  • ReplicatedCollapsingMergeTree
  • ReplicatedVersionedCollapsingMergeTree
  • ReplicatedGraphiteMergeTree:应用于Graphite data的数据汇总,减少存储容量,提高Graphite查询的效率。

https://cloud.tencent.com/developer/article/1510152

配置

配置文件包括/etc/clickhouse-server/config.xmlusers.xml以及集群配置文件/etc/metrika.xml。通过metrika.xml可以看到节点登陆的明文用户名,密码。
配置说明

物化视图

Materialized View,提高查询速度,本质:触发器。

原理
物化视图的原理是服务器觉得空闲的时候,帮你做一次select再insert的动作,可以通过物化视图来实现表间数据复制。
配置parallel_view_processing来实现物化视图是同步还是异步写。
物化视图也是一个普通的表。
pay attention:物化视图不能修改表名

  1. 用途
    当有需要在同个实例进行多表多写时,就可以使用物化视图来实现ClickHouse帮你做表的数据复制,减少多写的带宽消耗,降低集群负载。
    适用场景:
    1. 需要有多个时间维度的表
    2. 同一个表需要建立不同的索引粒度
  2. How
    CREATE MATERIALIZED VIEW db.table ENGINE = MergeTree() PARTITION BY day ORDER BY name AS SELECT * FROM db.old-table;
    如果需要实现多个时间维度的表,则AS SELECT时对时间字段多处理即可。

http://www.hohode.com/2019/10/16/Clickhouse物化视图/
CREATE MATERIALIZED VIEW app.tracker_log (dayDate,stUInt64,u_iString,d_iString,tk_idString,timeDateTime,catString,actString,e_tString,c_pString) ENGINE = MergeTree() PARTITION BY day ORDER BY (st) POPULATE AS SELECT day, toUInt64(s_t) AS st, u_i, d_i, tk_id, toDateTime(toUInt64(st) / 1000) AS time, cat, act, e_t, multiIf((c_p = 'iOS') OR (c_p = 'IOS') OR (c_p = 'Android'), 'APP', (c_p = 'wap') OR (c_p = 'WAP'), 'WAP', 'PC') AS c_p FROM app.scene_tracker WHERE (s_t != '') AND ((u_i != '') OR (d_i != '')) AND (length(d_i) > 5) AND (length(cat) > 1) AND (length(act) > 1)

实例
https://blog.lzzrpi.xin/index.php/archives/205/

TO关键字指向目标表,缺点:ClickHouse不允许在TO中使用POPULATE关键字,需要注意,但可以避免,定义视图的时候可以用where字句,手动insert进物化视图的目标表中。

https://blog.51cto.com/11106335/1869120

http://www.clickhouse.com.cn/topic/5b33777b9d28dfde2ddc6197

端口

默认情况下,clickhouse-server 会在端口 8123 上监控 HTTP 请求

本地表 & 分布式表

函数

https://clickhouse.tech/docs/en/sql-reference/aggregate-functions/reference/
函数有两种类型:常规函数和聚合函数,区别是常规函数可以通过一行数据产生结果,聚合函数则需要一组数据来产生结果
modulo(a, b):计算两个字段的余数
uniqCombined

http://www.clickhouse.com.cn/topic/5a5f58519d28dfde2ddc5e2c
https://blog.csdn.net/u012111465/article/details/85250030
http://www.mooyle.com/bigdata/clickhouse/

SQL优化

  1. 不要用select *
  2. 通过使用 limit 限制返回数据条数
  3. 根据需要查询指定范围的数据:where
  4. 不要在唯一列或大基数列上进行分组或去重操作:group by id
  5. 关联查询时小表在后,大表join小表;无论是Left Join 、Right Join还是Inner Join永远都是拿着右表中的每一条记录到左表中查找该记录是否存在
  6. 使用 uniqCombined 替代 distinct:
SELECT count(DISTINCT create_user) from app.scene_model; -- wrong
SELECT uniqCombined(create_user) from app.scene_model; -- right:近似去重
  1. 不要在大结果集上构造 虚拟列:select id, pv, uv, pv/uv rate from app.scene_model,虚拟列非常消耗资源浪费性能,拿到pv uv后在前端显示时构造比率。
  2. 尽量不去使用字符串类型
  3. 指定查询分区获取必要的数据

执行计划

目前,ClickHouse没有类似MySQL explain查询执行计划的功能。
如何在ClickHouse中查看SQL执行计划

数据备份

ClickHouse 数据目录的配置默认在config.xml中的 path 字段,默认目录为/data/clickhouse/clickhouse-server/data
数据目录格式
某个 clickhouse-server 的数据目录结构如下所示。

test
|-- account
|   |-- all_1_1_0
|   |   |-- checksums.txt
|   |   |-- columns.txt
|   |   |-- count.txt
|   |   |-- name.bin
|   |   |-- name.mrk2
|   |   |-- id.bin
|   |   |-- id.mrk2
|   |   |-- age.bin
|   |   |-- age.mrk2
|   |   |-- primary.idx
|   |-- detached
|-- |-- format_version.txt

第一级目录显示数据库名称如test
第二级目录为表名称如account数据表
第三级目录显示分区目录
checksum.txt 存储数据校验信息
columns.txt 保存数据列的列名和数据类型
count.txt 存储该分区的数据总数
.bin和.mrk2文件保存数据信息
primary.idx???
format_version.txt???
detached???

备份工具

clickhouse-backup 备份工具

监控

https://cloud.tencent.com/document/product/589/43539

https://clickhouse.tech/docs/zh/operations/monitoring/
https://wchch.github.io/2019/06/15/搭建clickhouse监控
https://hacpai.com/article/1515939854556
https://www.jianshu.com/p/37ca4c3e4203
https://github.com/f1yegor/clickhouse_exporter

访问权限控制

访问权限控制

虚拟列

Clickhouse 使用总结

clickhouse的索引结构和查询优化

个例:
http://www.clickhouse.com.cn/topic/5b1e168c9d28dfde2ddc612a
http://www.clickhouse.com.cn/topic/5b1755409d28dfde2ddc60fb

交互方式

curl:URL 的大小会限制在 16 KB,
wget
TCP
HTTP
各语言客户端
MySQL接口?

使用HTTP客户端的好处是,当查询语句中进行group by后,紧跟着WITH TOTALS,并且是FORMAT JSON时能够返回总数,这使得可以计算百分比。

工具

第三方代理服务器

chproxy
KittenHouse
clickhouse-bulk

可视化工具

开源

  • Tabix
  • HouseOps
  • 灯塔
  • DBeaver

收费

数据同步

HDFS to clickhouse

Waterdrop

Hive to clickhouse

https://www.cnblogs.com/gomysql/p/6708650.html

other

https://zhuanlan.zhihu.com/p/71014268
http://www.clickhouse.com.cn/topic/5a366e48828d76d75ab5d59e

问题

Missing columns…required columns…

报错信息:

ClickHouse exception, code: 47, host: 10.114.16.138, port: 8123; Code: 47, e.displayText() = DB::Exception: Missing columns: 'bussinessline' while processing query: '', required columns: 'bussinessline', source columns: 'bussinessLine' (version 19.16.8.34 (official build))

仔细看三个column,差别的地方在于大小写不一样,查阅文档得知:clickhouse对于select/SELECT不区分大小写,但是对于业务字段是大小写敏感的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章