ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),他的优势就是快,每秒处理的数据量特别大,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。
与Hadoop、Spark这些巨无霸组件相比,ClickHouse很轻量级,其特点:列式存储数据库,数据压缩;关系型、支持SQL;分布式并行计算,把单机性能压榨到极限;高可用;数据量级在PB级别。
适用场景:日志数据的行为分析,标签画像的分析,数据集市层分析等。
下载地址:https://packagecloud.io/altinity/clickhouse
(1)安装前准备:
①取消CentOS取消打开文件数限制:在/etc/security/limits.conf、/etc/security/limits.d/90-nproc.conf这2个文件的末尾加入一下
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
②CentOS取消SELINUX:修改/etc/selinux/config中的SELINUX=disabled后重启
SELINUX=disabled
③关闭防火墙
(2)下载四个安装包
wget --content-disposition https://packagecloud.io/Altinity/clickhouse/packages/el/6/clickhouse-server-common-1.1.54362-1.el6.x86_64.rpm/download.rpm
wget --content-disposition https://packagecloud.io/Altinity/clickhouse/packages/el/6/clickhouse-server-1.1.54362-1.el6.x86_64.rpm/download.rpm
wget --content-disposition https://packagecloud.io/Altinity/clickhouse/packages/el/6/clickhouse-debuginfo-1.1.54362-1.el6.x86_64.rpm/download.rpm
wget --content-disposition https://packagecloud.io/Altinity/clickhouse/packages/el/6/clickhouse-client-1.1.54362-1.el6.x86_64.rpm/download.rpm
(3)安装server-common
sudo rpm -ivh clickhouse-server-common-1.1.54362-1.el6.x86_64.rpm
(2)安装server
sudo rpm -ivh clickhouse-server-1.1.54362-1.el6.x86_64.rpm
如果遇到下面依赖问题安装依赖包
error: Failed dependencies:
libicudata.so.42()(64bit) is needed by clickhouse-common-static-19.7.3.9-1.el6.x86_64
libicui18n.so.42()(64bit) is needed by clickhouse-common-static-19.7.3.9-1.el6.x86_64
libicuuc.so.42()(64bit) is needed by clickhouse-common-static-19.7.3.9-1.el6.x86_64
---------------------------------------------------------------------------
yum install libicu.x86_64
yum install -y unixODBC libicudata
(3)安装debug
sudo rpm -ivh clickhouse-debuginfo-1.1.54362-1.el6.x86_64.rpm
(4)安装client
sudo rpm -ivh clickhouse-client-1.1.54362-1.el6.x86_64.rpm
(5)验证:因为安装好后会直接写如环境变量,所以直接clousehouse看有没有提示就行
(6)启动
前台启动:clickhouse-server --config-file=/etc/clickhouse-server/config.xml
后台启动:nohup clickhouse-server --config-file=/etc/clickhouse-server/config.xml >null 2>&1 &
(7)client连接server
# clickhouse-client
ClickHouse client version 1.1.54236.
Connecting to localhost:9000.
Connected to ClickHouse server version 1.1.54236.
bigdata01 :)
客户端连接常用参数
参数 | 说明 |
---|---|
–host, -h | 服务端的 host 名称, 默认是 ‘localhost’ |
–port | 连接的端口,默认值: 9000。 |
–user, -u | 用户名。 默认值: default。 |
–password | 密码。 默认值: 空字符串。 |
–query, -q | 非交互模式下的查询语句. |
–database, -d | 默认当前操作的数据库。 默认值: default |
–multiline, -m | 允许多行语句查询 |
–format, -f | 使用指定的默认格式输出结果。 |
–time, -t | 非交互模式下会打印查询执行的时间到窗口。 |
–stacktrace | 如果出现异常,会打印堆栈跟踪信息。 |
–config-file | 配置文件的名称。 |
(8)关闭ClickServer
service clickhouse-server stop
按上面步骤在4个节点安装ClickHouse,然后修改配置文件
我是使用“Core Data & Core AI 流分析平台 JDP” 网址:http://www.fusionlab.cn/
配置文件说明: ClickHouse的配置文件是config.xml,默认在/etc/clickhouse-server/目录中
(1)config.xml
10 -- ClickHouse存储的已归档日志文件的数量
1000M -- 文件的大小。适用于loganderrorlog,文件达到大小后,ClickHouse将对其进行存档并重命名,并在其位置创建一个新的日志文件
/var/log/clickhouse-server/error.log -- 错误日志文件
/var/log/clickhouse-server/server.log --日志文件,根据级别包含所有条目
trace --日志记录级别。可接受的值: trace, debug, information, warning, error
::
9000
/clickhouse/task_queue/ddl
8123
users.xml
/data/clickhouse/tmp/
8589934592
/etc/clickhouse-server/config/metrika.xml
1
16
/data/clickhouse
10737418240
default
3
default
9009
(2)metrika.xml
01 ---layer:双级分片设置,单集群所以这个值对我们没有影响全部一样即可
ambari01-01-1 ---replica是副本标识,这里使用了cluster{layer}-{shard}-{replica}的表示方式,ambari01-01-1表示ambari01集群的01分片下的1号副本
01 ---shard:分片编号
ambari01
2181
ambari02
2181
ambari03
2181
10000000000 --数据部分的最小大小
0.01 --数据部分大小与表大小的比率
lz4 ---压缩算法,zstd和lz4
true
ambari01
admin
admin
9000
ambari02
admin
admin
9000
true
ambari03
admin
admin
9000
ambari04
admin
admin
9000
::/0
(3)users.xml
random
10000000000
0
random
10000000000
1
0
3600
0
0
0
0
0
::/0
8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
default
default
::/0
8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
readonly
default
生成密码
PASSWORD=$(base64 < /dev/urandom | head -c8);
echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
官方文档:https://clickhouse.yandex/docs/zh/data_types/
下面介绍几种常见的数据类型
固定长度的整型,包括有符号整型或无符号整型。
(1)整型 范围(-2n-1~2n-1-1):
Int8 | [-128 : 127] |
---|---|
Int16 | [-32768 : 32767] |
Int32 | [-2147483648 : 2147483647] |
Int64 | [-9223372036854775808 : 9223372036854775807] |
(2)无符号整型范围(0~2n-1):
UInt8 | [0 : 255] |
---|---|
UInt16 | [0 : 65535] |
UInt32 | [0 : 4294967295] |
UInt64 | [0 : 18446744073709551615] |
Float32 》 float ;Float64》double
建议尽可能以整数形式存储数据,浮点型进行计算时可能引起四舍五入的误差。
特殊的浮点型
(1)Inf-正无穷
:) select 1-0.9
┌───────minus(1, 0.9)─┐
│ 0.09999999999999998 │
└─────────────────────┘
(2)-Inf-负无穷
:) select -1/0
┌─divide(1, 0)─┐
│ -inf │
└──────────────┘
(3)NaN-非数字
:) select 0/0
┌─divide(0, 0)─┐
│ nan │
└──────────────┘
String:字符串可以任意长度的。它可以包含任意的字节集,包含空字节。
FixedString(N):固定长度 N 的字符串,N 必须是严格的正自然数。当服务端读取长度小于 N 的字符串时候,通过在字符串末尾添加空字节来达到 N 字节长度。 当服务端读取长度大于 N 的字符串时候,将返回错误消息。
Array(T):由 T 类型元素组成的数组。T 可以是任意类型,包含数组类型。 但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。如不能在 MergeTree 表中存储多维数组。
创建方式:①使用array函数来创建数组array(T)②可以使用方括号[]
Tuple(T1, T2, …):元组,其中每个元素都有单独的类型
创建方式:使用tuple函数tuple(T1, T2, …)
日期类型,用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值
包括 Enum8 和 Enum16 类型。Enum 保存 ‘string’= integer 的对应关系。Enum8 用 ‘String’= Int8 对描述。Enum16 用 ‘String’= Int16 对描述。
使用案例:创建一个带有一个枚举 Enum8(‘hello’ = 1, ‘hi’ = 2) 类型的列:
CREATE TABLE t_enum(
x Enum8('hello' = 1, 'hi' = 2)
)ENGINE = TinyLog
这个 x 列只能存储类型定义中列出的值:‘hello’或’hi’。如果尝试保存任何其他值则报错
:) INSERT INTO t_enum VALUES ('hello'), ('hi')
INSERT INTO t_enum VALUES
Ok.
:) insert into t_enum values('a')
INSERT INTO t_enum VALUES
Exception on client:
Code: 49. DB::Exception: Unknown element 'a' for type Enum8('hello' = 1, 'hi' = 2)
从表中查询数据时,ClickHouse 从 Enum 中输出字符串值,如果需要看到对应行的数值,则必须将 Enum 值转换为整数类型
SELECT CAST(x, 'Int8') FROM t_enum
┌─CAST(x, 'Int8')─┐
│ 1 │
│ 2 │
└─────────────────┘
(1) CREATE DATABASE:用于创建指定名称的数据库,语法如下:
CREATE DATABASE [IF NOT EXISTS] db_name
如果查询中存在IF NOT EXISTS,则当数据库已经存在时,该查询不会返回任何错误。
(2)CREATE TABLE:对于创建表,语法如下:
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = engine
DEFAULT expr – 默认值,用法与SQL类似。
MATERIALIZED expr – 物化表达式,被该表达式指定的列不能被INSERT,因为它总是被计算出来的。 对于INSERT而言,不需要考虑这些列。 另外,在SELECT查询中如果包含星号,此列不会被查询。
ALIAS expr – 别名。
有三种方式创建表:
①直接创建: create table t1(id UInt16,name String) engine=TinyLog
②创建一个与其他表具有相同结构的表:CREATE TABLE [IF NOT EXISTS] [db.]table_name AS [db2.]name2 [ENGINE = engine]
可以对其指定不同的表引擎声明。如果没有表引擎声明,则创建的表将与db2.name2使用相同的表引擎。
③使用指定的引擎创建一个与SELECT子句的结果具有相同结构的表,并使用SELECT子句的结果填充它。CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGINE = engine AS SELECT …
主要用于向表中添加数据,基本格式如下:
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
ClickHouse不支持的修改数据的查询:UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE。
ALTER只支持MergeTree系列,Merge和Distributed引擎的表,基本语法:
ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|MODIFY COLUMN ...
参数说明:ADD COLUMN – 向表中添加新列;DROP COLUMN – 在表中删除列;MODIFY COLUMN – 更改列的类型
查看表结构:desc mt_table
检查表中的数据是否损坏,他会返回两种结果:0 – 数据已损坏1 – 数据完整
该命令只支持Log,TinyLog和StripeLog引擎。