ClinkHouse简介
ClickHouse来源
Yandex在2016年6月15日开源了一个数据分析的数据库,名字叫做ClickHouse,这对保守俄罗斯人来说是个特大事。更让人惊讶的是,这个列式存储数据库的跑分要超过很多流行的商业MPP数据库软件,例如Vertica。如果你没有听过Vertica,那你一定听过 Michael Stonebraker,2014年图灵奖的获得者,PostgreSQL和Ingres发明者(Sybase和SQL Server都是继承 Ingres而来的), Paradigm4和SciDB的创办者。Michael Stonebraker于2005年创办Vertica公司,后来该公司被HP收购,HP Vertica成为MPP列式存储商业数据库的高性能代表,Facebook就购买了Vertica数据用于用户行为分析。
- 真正的面向列的DBMS
- 数据高效压缩
- 磁盘存储的数据
- 多核并行处理
- 在多个服务器上分布式处理
- SQL语法支持
- 向量化引擎
- 实时数据更新
- 索引
- 适合在线查询
- 支持近似预估计算
- 支持嵌套的数据结构
- 支持数组作为数据类型
- 支持限制查询复杂性以及配额
- 复制数据复制和对数据完整性的支持
ClinkHouse Tbale常用引擎(ENGINE)
- TinyLog
- 是最简单的表轻量引擎(最多约100万行), 一写多读的应用场景。同时读写会损害数据
- TinyLog 表经常作为中间表,用于数据的微批量处理. 语法中无需携带任何参数
- 它将数据保存到磁盘. 每个字段都以单独压缩文件形式保存. 当写入数据时, 数据追加到文件的末尾
CREATE TABLE [ IF NOT EXISTS ] [ db 。] table_name [ ON CLUSTER cluster ] ( name1 [ type1 ] [ DEFAULT | MATERIALIZED | ALIAS expr1 ] [ TTL expr1 ], name2 [ type2 ] [ DEFAULT | MATERIALIZED | ALIAS expr2 ] [ TTL expr2 ], ... INDEX index_name1 expr1的 TYPE TYPE1 (...) 粒度 值1 , INDEX index_name2 表达式2 TYPE TYPE2 (...) 粒度 值2 ) ENGINE = TinyLog();
- MergeTree
- 这是目前 ClickHouse处理能力
最好
的引擎。 - 引擎支持索引,通过主键和日期来构建索引, 同时提供数据的实时更新能力。
CREATE TABLE [ IF NOT EXISTS ] [ db 。] table_name [ ON CLUSTER cluster ] ( name1 [ type1 ] [ DEFAULT | MATERIALIZED | ALIAS expr1 ] [ TTL expr1 ], name2 [ type2 ] [ DEFAULT | MATERIALIZED | ALIAS expr2 ] [ TTL expr2 ], ... INDEX index_name1 expr1的 TYPE TYPE1 (...) 粒度 值1 , INDEX index_name2 表达式2 TYPE TYPE2 (...) 粒度 值2 ) ENGINE = MergeTree () [ PARTITION BY EXPR ] [ ORDER BY EXPR ] [ PRIMARY KEY EXPR ] [ 样品 BY EXPR ] [ SETTINGS name = value, ...]
- 这是目前 ClickHouse处理能力
- ReplacingMergeTree
- 适用于在后台清除重复数据以节省空间,但不保证不存在重复。
CREATE TABLE [ IF NOT EXISTS ] [ db 。] table_name [ ON CL USTER cluster ] ( name1 [ type1 ] [ DEFAULT | MATERIALIZED | ALIAS expr1 ] [ TTL expr1 ] name2 [ type2 ] [ DEFAULT | MATERIALIZED | ALIAS expr2 ] [ TTL expr2 ], INDEX index_name1 expr1的 TYPE TYPE1 (...) 粒度值1 , INDEX index_name2 表达式2 TYPE TYPE2 (...) 粒度值2 ) ENGINE =ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/wt_order_details','{replica}') [ PARTITION BY EXPR ] [ ORDER BY EXPR] [ PRIMARY KEY EXPR ] [ 样品 BY EXPR] [ SETTINGS name = value, ...]
- Memory
- 重新启动服务器时,表中的数据消失,表将变为空。通常,使用此表引擎是不合理的。(值得注意的是,在许多情况下,与 MergeTree 引擎的性能几乎一样高)。
- 锁范围小:读写操作不会相互阻塞。不支持索引。阅读是并行化的。
- 换句话说,从这张表中读取是很轻松的。并发数据访问是同步的。
- 以未压缩的形式将数据存储在内存中。数据完全以读取时获得的形式存储。
- Distributed
- 分布式引擎本身不存储数据, 但可以在多个服务器上进行分布式查询。 读是自动并行的。
- 读取时,远程服务器表的索引(如果有的话)会被使用。
- 远程服务器不仅用于读取数据,还会对尽可能数据做部分处理。
- 分布式引擎参数:服务器配置文件中的集群名,远程数据库名,远程表名,数据分片键(可选)
- 样例:ENGINE =Distributed(cluster, db, table[, sharding_key])
- Kafka <导致数据丢失或者重复>
- 自动跟踪传递的消息,因此组中的每条消息仅计算一次。如果要获取数据两次,则使用另一个组名创建表的副本。组是灵活的并在群集上同步。
- 发布或订阅数据流。
- 组织容错存储。
- 处理流可用。
CREATE TABLE [IF NOT EXISTS] [db] table_name [ON CLUSTER cluster]( name1 [type1] [DEFAULT | MATERIALIZED | ALIAS expr1], name2 [type2] [DEFAULT | MATERIALIZED | ALIAS expr2], ) ENGINE = Kafka() kafka_broker_list ='host:port', kafka_topic_list ='topic1,topic2,...', kafka_group_name ='group_name', kafka_format ='data_format'[,] [kafka_row_delimiter ='delimiter_symbol',] [kafka_schema ='',] [kafka_num_consumers = N,] [kafka_skip_broken_messages = N]
ClinkHouse开发说明
建表说明
create table dim.pay_user (
user_id Integer,
status Integer,
start_date Integer,
end_date Nullable(Integer),
etl_time DateTime
)ENGINE = MergeTree() ORDER BY (user_id,status) SETTINGS index_granularity = 8192
--Nullable() 代表该字段有空值
--Date等同于2020-12-12 | DateTime 等同于 2020-12-12 12:12:12
--默认ENGINE为MergeTree,
--ORDER BY为表排序索引字段,
--SETTINGS index_granularity = 8192为默认结构