ClickHouse技术实践V1.0


1 CLICKHOUSE简述

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。能够使用SQL查询实时生成分析数据报告。

1.1 CLICKHOUSE架构组成介绍

ClickHouse数据始终是按列存储的,包括矢量(向量或列块)执行的过程。ClickHouse的内部架构包括列(column)、字段、抽象漏洞、块(block)、块流(block stream)、格式(format)、I/O、表(tables)、解析器、函数(Function)、服务(server)、合并树等。
详见:https://clickhouse.tech/docs/zh/development/architecture/

1.2 CLICKHOUSE的特点

ClickHouse的主要特点
1.真正的面向列的DBMS
在一个真正的面向列的DBMS中,没有任何“垃圾”存储在值中。例如,必须支持定长数值,以避免在数值旁边存储长度“数字”。例如,十亿个UInt8类型的值实际上应该消耗大约1 GB的未压缩磁盘空间,否则这将强烈影响CPU的使用。由于解压缩的速度(CPU使用率)主要取决于未压缩的数据量,所以即使在未压缩的情况下,紧凑地存储数据(没有任何“垃圾”)也是非常重要的。
因为有些系统可以单独存储单独列的值,但由于其他场景的优化,无法有效处理分析查询。例如HBase,BigTable,Cassandra和HyperTable。在这些系统中,每秒钟可以获得大约十万行的吞吐量,但是每秒不会达到数亿行。
另外,ClickHouse是一个DBMS,而不是一个单一的数据库。ClickHouse允许在运行时创建表和数据库,加载数据和运行查询,而无需重新配置和重新启动服务器。
2.数据压缩
一些面向列的DBMS(InfiniDB CE和MonetDB)不使用数据压缩。但是,数据压缩确实提高了性能。
3.磁盘存储的数据
许多面向列的DBMS(SAP HANA和GooglePowerDrill)只能在内存中工作。但即使在数千台服务器上,内存也太小,无法在Yandex.Metrica中存储所有浏览量和会话。
4.多核并行处理
多核多节点并行化大型查询。
5.在多个服务器上分布式处理
上面列出的列式DBMS几乎都不支持分布式处理。在ClickHouse中,数据可以驻留在不同的分片上。每个分片可以是用于容错的一组副本。查询在所有分片上并行处理。这对用户来说是透明的。
6.SQL支持
如果你熟悉标准的SQL,我们不能真正谈论SQL的支持。NULL不支持。所有的函数都有不同的名字。JOIN支持。子查询在FROM,IN,JOIN子句中被支持;标量子查询支持。关联子查询不支持。
7.向量化引擎
数据不仅按列存储,而且由矢量 - 列的部分进行处理。这使我们能够实现高CPU性能。
8.实时数据更新
ClickHouse支持主键表。为了快速执行对主键范围的查询,数据使用合并树(MergeTree)进行递增排序。由于这个原因,数据可以不断地添加到表中。添加数据时无锁处理。
9.索引
例如,带有主键可以在特定的时间范围内为特定客户端(Metrica计数器)抽取数据,并且延迟时间小于几十毫秒。
10.支持在线查询
这让我们使用该系统作为Web界面的后端。低延迟意味着可以无延迟实时地处理查询,而Yandex.Metrica界面页面正在加载(在线模式)。
11.支持近似计算
a.系统包含用于近似计算各种值,中位数和分位数的集合函数。
b.支持基于部分(样本)数据运行查询并获得近似结果。在这种情况下,从磁盘检索比例较少的数据。
c.支持为有限数量的随机密钥(而不是所有密钥)运行聚合。在数据中密钥分发的特定条件下,这提供了相对准确的结果,同时使用较少的资源。
12.数据复制和对数据完整性的支持。
使用异步多主复制。写入任何可用的副本后,数据将分发到所有剩余的副本。系统在不同的副本上保持相同的数据。数据在失败后自动恢复

1.3 CLICKHOUSE的缺陷

1.不支持事物。
2.不支持Update/Delete操作。
3.支持有限操作系统。(Linux需要编译,不支持Windows)

1.4 CLICKHOUSE应用场景

1.电信行业用于存储数据和统计数据使用。
2.新浪微博用于用户行为数据记录和分析工作。
3.用于广告网络和RTB,电子商务的用户行为分析。
4.信息安全里面的日志分析。
5.检测和遥感信息的挖掘。
6.商业智能。
7.网络游戏以及物联网的数据处理和价值数据分析。
8.最大的应用来自于Yandex的统计分析服务Yandex.Metrica,类似于谷歌Analytics(GA),或友盟统计,小米统计,帮助网站或移动应用进行数据分析和精细化运营工具,据称Yandex.Metrica为世界上第二大的网站分析平台。ClickHouse在这个应用中,部署了近四百台机器,每天支持200亿的事件和历史总记录超过13万亿条记录,这些记录都存有原始数据(非聚合数据),随时可以使用SQL查询和分析,生成用户报告

1.5 CLICKHOUSE与一些技术的比较

1.商业OLAP数据库
例如:HP Vertica, Actian the Vector,
区别:ClickHouse是开源而且免费的
2.云解决方案
例如:亚马逊RedShift和谷歌的BigQuery
区别:ClickHouse可以使用自己机器部署,无需为云付费
3.Hadoop生态软件
例如:Cloudera Impala, Spark SQL, Facebook Presto , Apache Drill
区别:
ClickHouse支持实时的高并发系统
ClickHouse不依赖于Hadoop生态软件和基础
ClickHouse支持分布式机房的部署
4.开源OLAP数据库
例如:InfiniDB, MonetDB, LucidDB
区别:这些项目的应用的规模较小,并没有应用在大型的互联网服务当中,相比之下,ClickHouse的成熟度和稳定性远远超过这些软件。
5.开源分析,非关系型数据库
例如:Druid , Apache Kylin
区别:ClickHouse可以支持从原始数据的直接查询,ClickHouse支持类SQL语言,提供了传统关系型数据的便利

1.6 CLICKHOUSE各个端口

端口名称默认端口说明
zookeeper2181zookeeper节点端口
clickhouse.http_port8123clickhouse的web端
clickhouse.tcp_port9000clickhouse的通信端口

1.7 中间件版本选取

中间件名称版本号
CentOSCentOS 6.8
Java1.8.0_121
zookeeper3.4.10
ClickHouse19.7.3.9-1

2 CLICKHOUSE部署

2.1 环境准备

本次技术实践安装ClickHouse集群,安装在3台虚拟机上:hadoop102、hadoop103、hadoop104
由于ClickHouse在Linux(CentOS或者Ubantu)需要编译,这里我直接下载rpm包进行安装部署

2.1.1 CentOS6.8

CentOS6.8安过程省略。预先创建用户/用户组zhouchen
预先安装jdk1.8.0_92 +
预先安装zookeeper

2.1.2 关闭防火墙-root

针对CentOS7以下
1.查看防火墙状态
service iptables status
2.停止防火墙
service iptables stop
3.启动防火墙
service iptables start

2.2 集群安装

2.2.1 rpm安装

先将rpm安装包上传到/opt/software,然后以root权限执行安装命令:

[zhouchen@hadoop102 software]$ sudo rpm -ivh clickhouse-server-common-19.7.3.9-1.el6.x86_64.rpm
[zhouchen@hadoop102 software]$ sudo rpm -ivh clickhouse-common-static-19.7.3.9-1.el6.x86_64.rpm
[zhouchen@hadoop102 software]$ sudo rpm -ivh clickhouse-server-19.7.3.9-1.el6.x86_64.rpm
[zhouchen@hadoop102 software]$ sudo rpm -ivh clickhouse-debuginfo-19.7.3.9-1.el6.x86_64.rpm
[zhouchen@hadoop102 software]$ sudo rpm -ivh clickhouse-test-19.7.3.9-1.el6.x86_64.rpm
[zhouchen@hadoop102 software]$ sudo rpm -ivh clickhouse-client-19.7.3.9-1.el6.x86_64.rpm

2.2.2 集群配置

*三台机器都需要修改如下配置:
1.修改clickhouse配置文件config.xml

[zhouchen@hadoop102 software]$ sudo vim /etc/clickhouse-server/config.xml
#修改的内容如下:
<listen_host>::</listen_host>
<!-- Path to data directory, with trailing slash. -->
<path>/var/lib/clickhouse/</path>
<!-- Path to temporary data for processing hard queries. -->
<tmp_path>/var/lib/clickhouse/tmp/</tmp_path>

2.在/etc下创建metrika.xml文件

[zhouchen@hadoop102 software]$ sudo vim /etc/metrika.xml
#添加如下内容:
<yandex>
<clickhouse_remote_servers>
    <perftest_3shards_1replicas>
        <shard>
             <internal_replication>true</internal_replication>
            <replica>
                <host>hadoop102</host>
                <port>9000</port>
            </replica>
        </shard>
        <shard>
            <replica>
                <internal_replication>true</internal_replication>
                <host>hadoop103</host>
                <port>9000</port>
            </replica>
        </shard>
        <shard>
            <internal_replication>true</internal_replication>
            <replica>
                <host>hadoop104</host>
                <port>9000</port>
            </replica>
        </shard>
    </perftest_3shards_1replicas>
</clickhouse_remote_servers>


<zookeeper-servers>
  <node index="1">
    <host>hadoop102</host>
    <port>2181</port>
  </node>

  <node index="2">
    <host>hadoop103</host>
    <port>2181</port>
  </node>
  <node index="3">
    <host>hadoop104</host>
    <port>2181</port>
  </node>
</zookeeper-servers>

#填写本机IP hadoop102/hadoop103/hadoop104
<macros>
    <replica>hadoop102</replica>
</macros>

<networks>
   <ip>::/0</ip>
</networks>

<clickhouse_compression>
<case>
  <min_part_size>10000000000</min_part_size>
  <min_part_size_ratio>0.01</min_part_size_ratio>                                                                                                                                       
  <method>lz4</method>
</case>
</clickhouse_compression>

</yandex>

2.2.3 集群启动

首先在三台机器开启Zookeeper
前台启动:

[zhouchen@hadoop102 software]# sudo clickhouse-server --config-file=/etc/clickhouse-server/config.xml

后台启动:

[zhouchen@hadoop102 software]# sudo nohup clickhouse-server --config-file=/etc/clickhouse-server/config.xml  >null 2>&1 &

[1] 2696

2.2.4 安装检查

1.界面访问
http://Hadoop102:8123/
在这里插入图片描述

2.启动日志
在这里插入图片描述

3.查看服务状态
在这里插入图片描述

2.3 配置DBEAVER连接CLICKHOUSE

由于ClickHouse支持Sql协议,使用DBeaver操作ClickHouse会更加便捷。
1.点击创建连接
在这里插入图片描述

2.填写连接信息测试连接
点击测试连接,会下载驱动包
在这里插入图片描述

3.点击完成,创建成功
在这里插入图片描述

3 CLICKHOUSE的数据类型

ClickHouse的数据类型包含基本的整型、浮点型、布尔型,还包括一些其他的类型。

3.1 枚举类型

包括 Enum8 和 Enum16 类型。Enum 保存 ‘string’= integer 的对应关系。
Enum8 用 ‘String’= Int8 对描述。
Enum16 用 ‘String’= Int16 对描述。
用法演示:
创建一个带有一个枚举 Enum8(‘hello’ = 1, ‘world’ = 2) 类型的列:

:) CREATE TABLE t_enum
(
    x Enum8('hello' = 1, 'world' = 2)
)
ENGINE = TinyLog

这个 x 列只能存储类型定义中列出的值:‘hello’或’world’。如果尝试保存任何其他值,ClickHouse 抛出异常。

:) INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')

INSERT INTO t_enum VALUES

Ok.

3 rows in set. Elapsed: 0.002 sec.

:) 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, 'world' = 2)

从表中查询数据时,ClickHouse 从 Enum 中输出字符串值。

SELECT * FROM t_enum

┌─x─────┐
│ hello │
│ world │
│ hello │
└───────┘

如果需要看到对应行的数值,则必须将 Enum 值转换为整数类型。

SELECT CAST(x, 'Int8') FROM t_enum

┌─CAST(x, 'Int8')─┐
│               1 │
│               2 │
│               1 │
└─────────────────┘

3.2 数组

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

array(T)

也可以使用方括号:

[]

创建数组案例:

:) SELECT array(1, 2) AS x, toTypeName(x)

SELECT
    [1, 2] AS x,
    toTypeName(x)

┌─x─────┬─toTypeName(array(1, 2))─┐
│ [1,2] │ Array(UInt8)            │
└───────┴─────────────────────────┘

1 rows in set. Elapsed: 0.002 sec.

:) SELECT [1, 2] AS x, toTypeName(x)

SELECT
    [1, 2] AS x,
    toTypeName(x)

┌─x─────┬─toTypeName([1, 2])─┐
│ [1,2] │ Array(UInt8)       │
└───────┴────────────────────┘

1 rows in set. Elapsed: 0.002 sec.

3.3 元组

Tuple(T1, T2, …):元组,其中每个元素都有单独的类型。
创建元组的示例:

:) SELECT tuple(1,'a') AS x, toTypeName(x)

SELECT
    (1, 'a') AS x,
    toTypeName(x)

┌─x───────┬─toTypeName(tuple(1, 'a'))─┐
│ (1,'a') │ Tuple(UInt8, String)      │
└─────────┴───────────────────────────┘

1 rows in set. Elapsed: 0.021 sec.

3.4 DATE

日期类型,用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值。
还有很多数据结构,可以参考官方文档:https://clickhouse.tech/docs/zh/sql-reference/data-types/

4 CLICKHOUSE的表引擎

表引擎(即表的类型)决定了:
1)数据的存储方式和位置,写到哪里以及从哪里读取数据
2)支持哪些查询以及如何支持。
3)并发数据访问。
4)索引的使用(如果存在)。
5)是否可以执行多线程请求。
6)数据复制参数。
ClickHouse的表引擎有很多,下面介绍其中几种,对其他引擎有兴趣的可以去查阅官方文档:https://clickhouse.tech/docs/zh/engines/table-engines/

4.1 TINYLOG

最简单的表引擎,用于将数据存储在磁盘上。每列都存储在单独的压缩文件中,写入时,数据将附加到文件末尾。
该引擎没有并发控制

  • 如果同时从表中读取和写入数据,则读取操作将抛出异常;
  • 如果同时写入多个查询中的表,则数据将被破坏。
    这种表引擎的典型用法是 write-once:首先只写入一次数据,然后根据需要多次读取。此引擎适用于相对较小的表(建议最多1,000,000行)。如果有许多小表,则使用此表引擎是适合的,因为它比需要打开的文件更少。当拥有大量小表时,可能会导致性能低下。
    不支持索引。
    案例:创建一个TinyLog引擎的表并插入一条数据
:)create table t (a UInt16, b String) ENGINE=TinyLog;
:)insert into t (a, b) values (1, 'abc');

此时我们到保存数据的目录/var/lib/clickhouse/data/default/t中可以看到如下目录结构:

[root@hadoop102 t]# ls
a.bin  b.bin  sizes.json

a.bin 和 b.bin 是压缩过的对应的列的数据, sizes.json 中记录了每个 *.bin 文件的大小:

[root@hadoop102 t]# cat sizes.json 
{"yandex":{"a%2Ebin":{"size":"28"},"b%2Ebin":{"size":"30"}}}

4.2 MEMORY

内存引擎,数据以未压缩的原始形式直接保存在内存当中,服务器重启数据就会消失。读写操作不会相互阻塞,不支持索引。简单查询下有非常非常高的性能表现(超过10G/s)。
一般用到它的地方不多,除了用来测试,就是在需要非常高的性能,同时数据量又不太大(上限大概 1 亿行)的场景。

4.3 MERGE

Merge 引擎 (不要跟 MergeTree 引擎混淆) 本身不存储数据,但可用于同时从任意多个其他的表中读取数据。 读是自动并行的,不支持写入。读取时,那些被真正读取到数据的表的索引(如果有的话)会被使用。
Merge 引擎的参数:一个数据库名和一个用于匹配表名的正则表达式。
案例:先建t1,t2,t3三个表,然后用 Merge 引擎的 t 表再把它们链接起来。

:)create table t1 (id UInt16, name String) ENGINE=TinyLog;
:)create table t2 (id UInt16, name String) ENGINE=TinyLog;
:)create table t3 (id UInt16, name String) ENGINE=TinyLog;

:)insert into t1(id, name) values (1, 'first');
:)insert into t2(id, name) values (2, 'second');
:)insert into t3(id, name) values (3, 'i am in t3');

:)create table t (id UInt16, name String) ENGINE=Merge(currentDatabase(), '^t');

:) select * from t;
┌─id─┬─name─┐
│  2 │ second │
└────┴──────┘
┌─id─┬─name──┐
│  1 │ first │
└────┴───────┘
┌─id─┬─name───────┐
│ 3	 │ i am in t3 │
└────┴────────────┘

4.4 MERGETREE

Clickhouse 中最强大的表引擎当属 MergeTree (合并树)引擎及该系列(*MergeTree)中的其他引擎。
MergeTree 引擎系列的基本理念如下。当你有巨量数据要插入到表中,你要高效地一批批写入数据片段,并希望这些数据片段在后台按照一定规则合并。相比在插入时不断修改(重写)数据进存储,这种策略会高效很多。
格式:

ENGINE [=] MergeTree(date-column [, sampling_expression], (primary, key), index_granularity)

参数解读:
date-column — 类型为 Date 的列名。ClickHouse 会自动依据这个列按月创建分区。分区名格式为 “YYYYMM” 。
sampling_expression — 采样表达式。
(primary, key) — 主键。类型为Tuple()
index_granularity — 索引粒度。即索引中相邻”标记”间的数据行数。设为 8192 可以适用大部分场景。
案例:

create table mt_table (date  Date, id UInt8, name String) ENGINE=MergeTree(date, (id, name), 8192);

insert into mt_table values ('2020-05-01', 1, 'zhangsan');
insert into mt_table values ('2020-06-01', 2, 'lisi');
insert into mt_table values ('2020-05-03', 3, 'wangwu');

在/var/lib/clickhouse/data/ch_test/mt_table下可以看到:

[root@hadoop102 mt_table]# ls
20200501_20200501_2_2_0  20200503_20200503_6_6_0  20200601_20200601_4_4_0  detached

随便进入一个目录:
[root@hadoop102 20200601_20200601_2_2_0]# ls
checksums.txt  columns.txt  date.bin  date.mrk  id.bin  id.mrk  name.bin  name.mrk  primary.idx 
  • *.bin是按列保存数据的文件
  • *.mrk保存块偏移量
  • primary.idx保存主键索引

4.5 REPLACING MERGE TREE

这个引擎是在 MergeTree 的基础上,添加了“处理重复数据”的功能,该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。数据的去重只会在合并的过程中出现。合并会在未知的时间在后台进行,所以你无法预先作出计划。有一些数据可能仍未被处理。因此,ReplacingMergeTree 适用于在后台清除重复的数据以节省空间,但是它不保证没有重复的数据出现。
格式:

ENGINE [=] ReplacingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [ver])

可以看出他比MergeTree只多了一个ver,这个ver指代版本列。
案例:

create table rmt_table (date  Date, id UInt8, name String,point UInt8) ENGINE= ReplacingMergeTree(date, (id, name), 8192,point);

插入一些数据:

insert into rmt_table values ('2020-06-10', 1, 'a', 20);
insert into rmt_table values ('2020-06-10', 1, 'a', 30);
insert into rmt_table values ('2020-06-11', 1, 'a', 20);
insert into rmt_table values ('2020-06-11', 1, 'a', 30);
insert into rmt_table values ('2020-06-11', 1, 'a', 10);

等待一段时间或optimize table rmt_table手动触发merge,后查询

:) select * from rmt_table;
┌───────date─┬─id─┬─name─┬─point─┐
│ 2020-06-11 │  1 │ a    │    30 │
└────────────┴────┴──────┴───────┘

4.6 SUMMING MERGE TREE

该引擎继承自 MergeTree。区别在于,当合并 SummingMergeTree 表的数据片段时,ClickHouse 会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值。如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度,对于不可加的列,会取一个最先出现的值。
语法:

ENGINE [=] SummingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [columns])

columns — 包含将要被汇总的列的列名的元组
案例:

create table smt_table (date Date, name String, a UInt16, b UInt16) ENGINE=SummingMergeTree(date, (date, name), 8192, (a))

插入数据:

insert into smt_table (date, name, a, b) values ('2020-06-10', 'a', 1, 2);
insert into smt_table (date, name, a, b) values ('2020-06-10', 'b', 2, 1);
insert into smt_table (date, name, a, b) values ('2020-06-11', 'b', 3, 8);
insert into smt_table (date, name, a, b) values ('2020-06-11', 'b', 3, 8);
insert into smt_table (date, name, a, b) values ('2020-06-11', 'a', 3, 1);
insert into smt_table (date, name, a, b) values ('2020-06-12', 'c', 1, 3);

等待一段时间或optimize table smt_table手动触发merge,后查询

:) select * from smt_table 

┌───────date─┬─name─┬─a─┬─b─┐
│ 2020-06-10 │ a    │ 1 │ 2 │
│ 2020-06-10 │ b    │ 2 │ 1 │
│ 2020-06-11 │ a    │ 3 │ 1 │
│ 2020-06-11 │ b    │ 6 │ 8 │
│ 2020-06-12 │ c    │ 1 │ 3 │
└────────────┴──────┴───┴───┘

发现2020-06-11,b的a列合并相加了,b列取了8(因为b列为8的数据最先插入)。

4.7 DISTRIBUTED

分布式引擎,本身不存储数据, 但可以在多个服务器上进行分布式查询。 读是自动并行的。读取时,远程服务器表的索引(如果有的话)会被使用。

Distributed(cluster_name, database, table [, sharding_key])

参数解析:
cluster_name - 服务器配置文件中的集群名,在/etc/metrika.xml中配置的
database – 数据库名
table – 表名
sharding_key – 数据分片键
案例演示:
1)在hadoop102,hadoop103,hadoop104上分别创建一个表t

:)create table t(id UInt16, name String) ENGINE=TinyLog;

2)在三台机器的t表中插入一些数据

:)insert into t(id, name) values (1, 'zhangsan');
:)insert into t(id, name) values (2, 'lisi');

3)在hadoop102上创建分布式表

:)create table dis_table(id UInt16, name String) ENGINE=Distributed(perftest_3shards_1replicas, default, t, id);

4)往dis_table中插入数据

:) insert into dis_table select * from t

5)查看数据量

:) select count() from dis_table 
FROM dis_table 

┌─count()─┐
│       8 │
└─────────┘
:) select count() from t

SELECT count()
FROM t 

┌─count()─┐
│       3 │
└─────────┘

可以看到每个节点大约有1/3的数据

5 CLICKHOUSE用户

ClickHouse的用户设置包括用户和密码,密码有两种,一种是明文,一种是写sha256sum的Hash值。ClickHouse默认提供了有个default用户,拥有所有权限。与Mysql不同的是,mysql的用户在user表中,而clickhouse的用户在/etc/clickhouse-server/user.xml配置文件中。
生成密文密码的方式:

[zhouchen@hadoop103 etc]$ PASSWORD=chpw123; echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
chpw123
329942425a7e924264fce9d3aa0bd1eb47cc3446a5453b35c066f1bf089a984f

/etc/clickhouse-server/user.xml

<?xml version="1.0"?>
<yandex>
    <!-- Profiles of settings. 一个Profile就是一堆配置(settings)的集合-->
    <profiles>
        <!-- default组是必须的 -->
        <default>         
            <!-- 副本之间负载均衡的配置,可选项有random,nearest_hostname,in_order,first_or_random -->
            <load_balancing>nearest_hostname</load_balancing>
        </default>

        <!-- readonly组 -->
        <readonly>
            <readonly>1</readonly>
        </readonly>
    </profiles>

    <!-- Users and ACL. -->
    <users>
        <!-- If user name was not specified, 'default' user is used. -->
        <default>
            <!-- Password could be specified in plaintext or in SHA256 (in hex format).
                 If you want to specify password in plaintext (not recommended), place it in 'password' element.
                 Example: <password>qwerty</password>.
                 Password could be empty.
                 If you want to specify SHA256, place it in 'password_sha256_hex' element.
                 Example: <password_sha256_hex>65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5</password_sha256_hex>
                 Restrictions of SHA256: impossibility to connect to ClickHouse using MySQL JS client (as of July 2019).
                 If you want to specify double SHA1, place it in 'password_double_sha1_hex' element.
                 Example: <password_double_sha1_hex>e395796d6546b1b65db9d665cd43f0e858dd4303</password_double_sha1_hex>
                 How to generate decent password:
                 Execute: PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
                 In first line will be password and in second - corresponding SHA256.
                 How to generate double SHA1:
                 Execute: PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | openssl dgst -sha1 -binary | openssl dgst -sha1
                 In first line will be password and in second - corresponding double SHA1.-->
<!-- 这里采用sha256加密,密码是这样生成的:PASSWORD=000000; echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'   -->
            <password_sha256_hex>91b4d142823f7d20c5f08df69122de43f35f057a988d9619f6d3138485c9a203</password_sha256_hex>
            <!-- List of networks with open access.
                 To open access from everywhere, specify:
                    <ip>::/0</ip>    
                 To open access only from localhost, specify:
                    <ip>::1</ip>
                    <ip>127.0.0.1</ip>
                 Each element of list has one of the following forms:
                 <ip> IP-address or network mask. Examples: 213.180.204.3 or 10.0.0.1/8 or 10.0.0.1/255.255.255.0
                     2a02:6b8::3 or 2a02:6b8::3/64 or 2a02:6b8::3/ffff:ffff:ffff:ffff::.
                 <host> Hostname. Example: server01.yandex.ru.
                     To check access, DNS query is performed, and all received addresses compared to peer address.
                 <host_regexp> Regular expression for host names. Example, ^server\d\d-\d\d-\d\.yandex\.ru$
                     To check access, DNS PTR query is performed for peer address and then regexp is applied.
                     Then, for result of PTR query, another DNS query is performed and all received addresses compared to peer address.
                     Strongly recommended that regexp is ends with $
                 All results of DNS requests are cached till server restart.-->
            <networks incl="networks" replace="replace">
                <ip>::/0</ip>
            </networks>
            <!-- Settings profile for user. -->
            <profile>default</profile>
            <!-- Quota for user. -->
            <quota>default</quota>
            <!-- For testing the table filters -->
            <databases>
                <test>
                    <!-- Simple expression filter -->
                    <filtered_table1>
                        <filter>a = 1</filter>
                    </filtered_table1>

                    <!-- Complex expression filter -->
                    <filtered_table2>
                        <filter>a + b &lt; 1 or c - d &gt; 5</filter>
                    </filtered_table2>

                    <!-- Filter with ALIAS column -->
                    <filtered_table3>
                        <filter>c = 1</filter>
                    </filtered_table3>
                </test>
            </databases>
        </default>

        <!-- Example of user with readonly access. -->
        <readonly>
            <password></password>
            <networks incl="networks" replace="replace">
                <ip>::1</ip>
                <ip>127.0.0.1</ip>
            </networks>
            <profile>readonly</profile>
            <quota>default</quota>
        </readonly> 
    </users>

    <!-- Quotas. -->
    <quotas>
        <!-- Name of quota. -->
        <default>
            <!-- Limits for time interval. You could specify many intervals with different limits. -->
            <interval>
                <!-- Length of interval. -->
                <duration>3600</duration>

                <!-- No limits. Just calculate resource usage for time interval. -->
                <queries>0</queries>
                <errors>0</errors>
                <result_rows>0</result_rows>
                <read_rows>0</read_rows>
                <execution_time>0</execution_time>
            </interval>
        </default>
    </quotas>
</yandex>

在节点下添加新用户信息的节点:

<tset_user>
    <password_sha256_hex>91b4d142823f7d20c5f08df69122de43f35f057a988d9619f6d3138485c9a203</password_sha256_hex>
    <networks incl="networks" replace="replace">
        <ip>::/0</ip>
    </networks>
    <profile>default</profile>
    <quota>default</quota>
    <allow_databases>
       <database>test</database>
    </allow_databases>
</tset_user>

6 CLICKHOUSE数据导入导出

ClickHouse支持文件格式的数据导入

6.1 CLICKHOUSE数据导入

导入数据库的本机执行:cat table_name.sql | clickhouse-client --query=“INSERT INTO database.table_name FORMAT TabSeparated”

6.2 CLICKHOUSE数据导出

远程导出命令,默认分割符是tab:
echo ‘select * from table_name’ | curl ip:8123?database=mybi -uroot:password -d @- > table_name.sql

7 CLICKHOUSE常见问题分析

7.1 缺少依赖包

报错:

[zhouchen@hadoop102 software]$ sudo rpm -ivh clickhouse-common-static-19.7.3.9-1.el6.x86_64.rpm
错误:依赖检测失败:
libicudata.so.42()(64bit) 被 clickhouse-common-static-19.7.3.9-1.el6.x86_64 需要
libicui18n.so.42()(64bit) 被 clickhouse-common-static-19.7.3.9-1.el6.x86_64需要
libicuuc.so.42()(64bit) 被 clickhouse-common-static-19.7.3.9-1.el6.x86_64 需要

错误原因是缺少依赖,安装依赖包就可以了:

[zhouchen@hadoop102 software]$ sudo yum install -y libtool
[zhouchen@hadoop102 software]$ sudo yum install -y *unixODBC*
[zhouchen@hadoop102 software]$ sudo yum install perl-JSON-XS -y
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值