ClickHouse入门

1 什么是ClickHouse

​ ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),他的优势就是快,每秒处理的数据量特别大,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。

​ 与Hadoop、Spark这些巨无霸组件相比,ClickHouse很轻量级,其特点:列式存储数据库,数据压缩;关系型、支持SQL;分布式并行计算,把单机性能压榨到极限;高可用;数据量级在PB级别。

适用场景:日志数据的行为分析,标签画像的分析,数据集市层分析等。

2 ClickHouse安装

​ 下载地址: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

3 分布式集群及配置文件

​ 按上面步骤在4个节点安装ClickHouse,然后修改配置文件

​ 我是使用“Core Data & Core AI 流分析平台 JDP” 网址:http://www.fusionlab.cn/

​ 配置文件说明: ClickHouse的配置文件是config.xml,默认在/etc/clickhouse-server/目录中

​ (1)config.xml

<?xml version="1.0" encoding="utf-8"?>
<yandex>
	<!-- logger:日志记录设置-->
	<logger>
		<count>10</count>  --  ClickHouse存储的已归档日志文件的数量
		<size>1000M</size>  -- 文件的大小。适用于loganderrorlog,文件达到大小后,ClickHouse将对其进行存档并重命名,并在其位置创建一个新的日志文件
		<errorlog>/var/log/clickhouse-server/error.log</errorlog>  -- 错误日志文件
		<log>/var/log/clickhouse-server/server.log</log>  --日志文件,根据级别包含所有条目
		<level>trace</level>  --日志记录级别。可接受的值: trace, debug, information, warning, error
	</logger>
	<remote_servers incl="clickhouse_remote_servers"/>
	
	<!-- listen_host:限制来源主机的请求, 如果要服务器回答所有请求,请指定“::”-->
	<listen_host>::</listen_host>
	
	<!--tcp_port:通过TCP协议与客户端进行通信的端口,即ClickHouse端口-->
	<tcp_port>9000</tcp_port>
	<zookeeper incl="zookeeper-servers" optional="true"/>
	<distributed_ddl>
		<path>/clickhouse/task_queue/ddl</path>
	</distributed_ddl>
	
	<!--max_connections:最大连接数--_
	<max_connections>64</max_connections>
	<builtin_dictionaries_reload_interval>3600</builtin_dictionaries_reload_interval>
	
	<!--通过HTTP连接到服务器的端口-->
	<http_port>8123</http_port>
	
	<!--users_config:用户配置文件,可以配置用户访问、profiles、quota、查询等级等。-->
	<users_config>users.xml</users_config>
	
	<!--macros:复制表的参数替换,如果不使用复制表,则可以省略-->
	<macros incl="macros" optional="true"/>
	
	<!-- tmp_path:用于处理大型查询的临时数据的路径-->
	<tmp_path>/data/clickhouse/tmp/</tmp_path>
	
	<!--max_table_size_to_drop:删除表的限制,默认50G,0表示不限制_
	<max_table_size_to_drop>0</max_table_size_to_drop>
	
	<!--uncompressed_cache_size:表引擎从MergeTree使用的未压缩数据的缓存大小-->
	<uncompressed_cache_size>8589934592</uncompressed_cache_size>
	
	<!--include_from:带替换文件的路径-->
	<include_from>/etc/clickhouse-server/config/metrika.xml</include_from>
	
	<!--query_log:通过log_queries = 1设置,记录接收到的查询-->
	<log_queries>1</log_queries>
	
	<!--max_concurrent_queries:同时处理的最大请求数-->
	<max_concurrent_queries>16</max_concurrent_queries>
	
	<!--path:数据的目录路径。-->
	<path>/data/clickhouse</path>
	
	<!--interserver_http_host:其他服务器可以用来访问该服务器的主机名。如果省略,则其定义方法与hostname -f命令相同>
	<interserver_http_host>ambari01</interserver_http_host>
	
	<!-- mark_cache_size:标记缓存的大小,用于MergeTree系列的表中-->
	<mark_cache_size>10737418240</mark_cache_size>
	
	<!--default_profile:默认设置配置文件,在参数user_config中指定-->
	<default_profile>default</default_profile>
	
	<!--keep_alive_timeout:ClickHouse在关闭连接之前等待传入请求的秒数。 默认为3秒-->
	<keep_alive_timeout>3</keep_alive_timeout>
	
	<!--default_database:默认数据库-->
	<default_database>default</default_database>
	
	<!-- interserver_http_port:于在ClickHouse服务器之间交换数据的端口-->
	<interserver_http_port>9009</interserver_http_port>

​ (2)metrika.xml

<?xml version='1.0' encoding='utf-8'?>
<yandex>
	<!--宏配置,这里唯一标识一个副本名称,每个实例都要配置并且都是唯一的-->
	<macros>
		<layer>01</layer>---layer:双级分片设置,单集群所以这个值对我们没有影响全部一样即可
		<replica>ambari01-01-1</replica>---replica是副本标识,这里使用了cluster{layer}-{shard}-{replica}的表示方式,ambari01-01-1表示ambari01集群的01分片下的1号副本
		<shard>01</shard>---shard:分片编号
	</macros>
	
	<!--zookeeper配置-->
	<zookeeper-servers>
		<node index="1">
			<host>ambari01</host>
			<port>2181</port>
		</node>
		<node index="2">
			<host>ambari02</host>
			<port>2181</port>
		</node>
		<node index="3">
			<host>ambari03</host>
			<port>2181</port>
		</node>
	</zookeeper-servers>
	
	<!--compression:MergeTree引擎表的数据压缩设置-->
	<clickhouse_compression>
		<case>
			<min_part_size>10000000000</min_part_size>--数据部分的最小大小
			<min_part_size_ratio>0.01</min_part_size_ratio> --数据部分大小与表大小的比率
			<method>lz4</method>---压缩算法,zstd和lz4
		</case>
	</clickhouse_compression>
	
	<!--remote_servers:远程服务器,分布式表引擎和集群表功能使用的集群的配置-->
	<clickhouse_remote_servers>
		<!---ck_cluster:集群名称-->
		<ck_cluster>
			<!---第一个分片-->
			<shard>
				<!--internal_replication,表示是否只将数据写入其中一个副本,默认为false,表示写入所有副本,在复制表的情况下可能会导致重复和不一致,所以这里一定要改为true,clickhouse分布式表只管写入一个副本,其余同步表的事情交给复制表和zookeeper来进行-->
				<internal_replication>true</internal_replication>
				<!---第一个分片的第一个副本-->
				<replica>
					<host>ambari01</host>
					<user>admin</user>
					<password>admin</password>
					<port>9000</port>
				</replica>
				<!---第一个分片的第二个副本-->
                                <replica>
                                        <host>ambari02</host>
                                        <user>admin</user>
                                        <password>admin</password>
                                        <port>9000</port>
                                </replica>
			</shard>
			<!---第二个分片-->
			<shard>
				<internal_replication>true</internal_replication>
				<!---第二个分片的第一个副本-->
				<replica>
					<host>ambari03</host>
					<user>admin</user>
					<password>admin</password>
					<port>9000</port>
				</replica>
				<!---第二个分片的第二个副本-->
                                <replica>
                                        <host>ambari04</host>
                                        <user>admin</user>
                                        <password>admin</password>
                                        <port>9000</port>
                                </replica>
			</shard>
		</ck_cluster>
	</clickhouse_remote_servers>
	
	<!--networks表示允许被登陆clickhouse服务器的客户端列表,支持通过ip、host、host_regexp方式设置-->
	<networks>
		<ip>::/0</ip>
	</networks>

​ (3)users.xml

<?xml version="1.0" encoding="utf-8"?>
<yandex>

	<!--profile:类似于用户角色,可以实现最大内存、负载方式等配置的服用-->
	<profiles>
		
		<!--可自定义名称,default是默认存在的角色名称-->
		<default>
			<load_balancing>random</load_balancing>
			<max_memory_usage>10000000000</max_memory_usage>
			<use_uncompressed_cache>0</use_uncompressed_cache>
		</default>
		
		<!--自定义readonly角色-->
		<readonly>
			<load_balancing>random</load_balancing>
			<max_memory_usage>10000000000</max_memory_usage>
			<readonly>1</readonly>
			<use_uncompressed_cache>0</use_uncompressed_cache>
		</readonly>
	</profiles>
	
	<!--quotas:限制一段时间内的资源使用等-->
	<quotas>
		<default>
			<interval>
				<duration>3600</duration>
				<errors>0</errors>
				<execution_time>0</execution_time>
				<queries>0</queries>
				<read_rows>0</read_rows>
				<result_rows>0</result_rows>
			</interval>
		</default>
	</quotas>
	
	<!--users:设置包括用户名、密码、权限等-->
	<users>
		<admin>
			<networks incl="networks" replace="replace">
				<ip>::/0</ip>
			</networks>
			<password_sha256_hex>8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918</password_sha256_hex>
			<profile>default</profile>
			<quota>default</quota>
		</admin>
		<ck>
			<networks incl="networks" replace="replace">
				<ip>::/0</ip>
			</networks>
			<password_sha256_hex>8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918</password_sha256_hex>
			<profile>readonly</profile>
			<quota>default</quota>
		</ck>
	</users>
</yandex>
生成密码
PASSWORD=$(base64 < /dev/urandom | head -c8);
echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'

4 数据类型

​ 官方文档:https://clickhouse.yandex/docs/zh/data_types/

​ 下面介绍几种常见的数据类型

4.1 整型

​ 固定长度的整型,包括有符号整型或无符号整型。

​ (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]

4.2 浮点型

​ 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 │
└──────────────┘

4.3 字符串

​ String:字符串可以任意长度的。它可以包含任意的字节集,包含空字节。

​ FixedString(N):固定长度 N 的字符串,N 必须是严格的正自然数。当服务端读取长度小于 N 的字符串时候,通过在字符串末尾添加空字节来达到 N 字节长度。 当服务端读取长度大于 N 的字符串时候,将返回错误消息。

4.4 数组

​ Array(T):由 T 类型元素组成的数组。T 可以是任意类型,包含数组类型。 但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。如不能在 MergeTree 表中存储多维数组。

​ 创建方式:①使用array函数来创建数组array(T)②可以使用方括号[]

4.5 元组

​ Tuple(T1, T2, …):元组,其中每个元素都有单独的类型

​ 创建方式:使用tuple函数tuple(T1, T2, …)

4.6 Date

​ 日期类型,用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值

4.7 枚举

​ 包括 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 │
└─────────────────┘

5 SQL语法

5.1 CREATE

​ (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 …

5.2 INSERT INTO

​ 主要用于向表中添加数据,基本格式如下:

INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...

​ ClickHouse不支持的修改数据的查询:UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE。

5.3 ALTER

​ ALTER只支持MergeTree系列,Merge和Distributed引擎的表,基本语法:

ALTER TABLE [db].name [ON CLUSTER cluster] ADD|DROP|MODIFY COLUMN ...

​ 参数说明:ADD COLUMN – 向表中添加新列;DROP COLUMN – 在表中删除列;MODIFY COLUMN – 更改列的类型

5.4 DESCRIBE TABLE

​ 查看表结构:desc mt_table

5.5 CHECK TABLE

​ 检查表中的数据是否损坏,他会返回两种结果:0 – 数据已损坏1 – 数据完整

​ 该命令只支持Log,TinyLog和StripeLog引擎。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值