ClickHouse是什么?

ClickHouse是一个开源的,面向列的分析数据库,由Yandex为OLAP和大数据用例创建。ClickHouse对实时查询处理的支持使其适用于需要亚秒级分析结果的应用程序。ClickHouse的查询语言是SQL的一种方言,它支持强大的声明性查询功能,同时为最终用户提供熟悉度和较小的学习曲线。

面向列的数据库将记录存储在按列而不是行分组的块中。通过不加载查询中不存在的列的数据,面向列的数据库在完成查询时花费的时间更少。因此,对于某些工作负载(如OLAP),这些数据库可以比传统的基于行的系统更快地计算和返回结果。

在线分析处理(OLAP)系统允许组织大量数据并执行复杂查询。它们能够管理数PB的数据并快速返回查询结果。通过这种方式,OLAP对于数据科学和业务分析等领域的工作非常有用。

在本教程中,您将在计算机上安装ClickHouse数据库服务器和客户端。您将使用DBMS执行典型任务,并可选择从另一台服务器启用远程访问,以便您能够从另一台计算机连接到数据库。然后,您将通过建模和查询示例网站访问数据来测试ClickHouse。

 

先决条件

一台CentOS 7服务器,拥有sudo权限的非root用户和防火墙设置权限。

 

第1步 – 安装ClickHouse

在本节中,您将使用安装ClickHouse服务器和客户端程序yum。

首先,通过运行SSH进入您的服务器:

ssh user@server_ip

安装基本依赖项:

sudo yum install -y pygpgme yum-utils

这些pygpgme包用于添加和验证GPG签名,同时yum-utils允许轻松管理源RPM。

Altinity是一家ClickHouse咨询公司,其拥有一个最新版ClickHouse的YUM存储库。您将通过创建文件来添加存储库的详细信息以安全地下载经过验证的ClickHouse包。

如果你决定不放心,可以去Github上面检查它们的构建源。

通过执行以下命令创建存储库详细信

sudo vi /etc/yum.repos.d/altinity_clickhouse.repo

接下来,将以下内容添加到文件中:

[altinity_clickhouse] name=altinity_clickhouse baseurl=https://packagecloud.io/altinity/clickhouse/el/7/$basearch repo_gpgcheck=1 gpgcheck=0 enabled=1 gpgkey=https://packagecloud.io/altinity/clickhouse/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 [altinity_clickhouse-source] name=altinity_clickhouse-source baseurl=https://packagecloud.io/altinity/clickhouse/el/7/SRPMS repo_gpgcheck=1 gpgcheck=0 enabled=1 gpgkey=https://packagecloud.io/altinity/clickhouse/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300

现在您已添加了存储库,请使用以下命令启用它们:

sudo yum -q makecache -y --disablerepo='*' --enablerepo='altinity_clickhouse'

该-q标志告诉命令以安静模式运行。该makecache命令使–enablerepo标志中指定的包可用。

执行时,您将看到类似于以下内容的输出:


Importing GPG key 0x0F6E36F6:
Userid : "https://packagecloud.io/altinity/clickhouse (https://packagecloud.io/docs#gpg_signing) <support@packagecloud.io>"
Fingerprint: 7001 38a9 6a20 6b22 bf28 3c06 ed26 58f3 0f6e 36f6
From : https://packagecloud.io/altinity/clickhouse/gpgkey

输出确认已成功验证并添加了GPG密钥。

这些clickhouse-server和clickhouse-client包现在可以安装了。安装它们:

sudo yum install -y clickhouse-server clickhouse-client

您已成功安装ClickHouse服务器和客户端。您现在已准备好启动数据库服务并确保它正常运行。

 

第2步 – 启动服务

clickhouse-server您在上一节中安装的软件包将创建一个systemd服务,该服务执行启动,停止和重新启动数据库服务器等操作。systemd是Linux初始化和管理服务的init系统。在本节中,您将启动该服务并验证它是否成功运行。

clickhouse-server运行以下命令启动服务:

sudo service clickhouse-server start

您将看到类似于以下内容的输出:

输出
Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/
DONE

要验证服务是否成功运行,请执行:

sudo service clickhouse-server status

它将打印类似于以下的输出,表示服务器正常运行:

输出
clickhouse-server service is running

您已成功启动ClickHouse服务器,现在可以使用clickhouse-clientCLI程序连接到服务器。

 

第3步 – 创建数据库和表

在ClickHouse中,您可以通过直接在交互式数据库提示符中执行SQL语句来创建和删除数据库。语句由遵循特定语法的命令组成,这些命令告诉数据库服务器执行所请求的操作以及所需的任何数据。您可以使用语法创建数据库。要创建数据库,请首先运行以下命令启动客户端会话:CREATE DATABASE table_name

clickhouse-client –multiline

此命令将使您进入客户端提示符,您可以在其中运行ClickHouse SQL语句以执行以下操作:

创建,更新和删除数据库,表,索引,分区和视图。
执行查询以检索可选地使用各种条件进行过滤和分组的数据。

该–multiline标志告诉CLI允许输入跨越多行的查询。

在此步骤中,当ClickHouse客户端准备好插入数据时,您将创建一个数据库和表。出于本教程的目的,您将创建一个名为的数据库test,在其中您将创建一个名为visits跟踪网站访问持续时间的表。

现在您在ClickHouse命令提示符下,test通过执行以下命令创建数据库:

CREATE DATABASE test

您将看到以下输出,表明您已创建数据库:

输出
CREATE DATABASE test

Ok.

0 rows in set. Elapsed: 0.003 sec.

ClickHouse表类似于其他关系数据库中的表; 它以结构化格式保存相关数据的集合。您可以指定列及其类型,添加数据行,以及对表执行不同类型的查询。

在ClickHouse中创建表的语法遵循以下示例结构:

CREATE TABLE table_name
(
    column_name1 column_type [options],
    column_name2 column_type [options],
    ...
) ENGINE = engine

该table_name和column_name值可以是任何有效的ASCII标识符。ClickHouse支持多种列类型; 一些最受欢迎的是:

UInt64:用于存储0到18446744073709551615范围内的整数值。
Float64:用于存储浮点数,如2039.23,10.5等。
String:用于存储可变长度字符。它不需要max length属性,因为它可以存储任意长度。
Date:用于存储遵循YYYY-MM-DD格式的日期。
DateTime:用于存储日期和时间,并遵循YYYY-MM-DD HH:MM:SS格式。

在列定义之后,指定用于表的引擎。在ClickHouse中,Engines确定底层数据的物理结构,表的查询功能,并发访问模式以及对索引的支持。不同的发动机类型适合不同的应用要求。最常用和广泛适用的发动机类型是MergeTree。

现在您已经了解了表创建的概述,您将创建一个表。首先确认您要修改的数据库:

USE test

您将看到以下输出显示您已从test数据库切换到default数据库:

输出
USE test

Ok.

0 rows in set. Elapsed: 0.001 sec.

本指南的其余部分将假定您正在此数据库的上下文中执行语句。

visits通过运行此命令创建表:

CREATE TABLE visits (
 	id UInt64,
 	duration Float64,
 	url String,
 	created DateTime
 	) ENGINE = MergeTree() 
 	PRIMARY KEY id 
 	ORDER BY id;

这是命令的功能细分。您创建一个名为visits有四列的表:

id:主键列。与其他RDBMS系统类似,ClickHouse中的主键列唯一标识一行; 每行应该具有此列的唯一值。
duration:一个浮点列,用于存储每次访问的持续时间(以秒为单位)。float列可以存储十进制值,如12.50。
url:一个字符串列,用于存储访问过的URL,例如http://example.com。
created:跟踪访问发生时间的日期和时间列。

在列定义之后,您将指定MergeTree为表的存储引擎。该MergeTree系列发动机的建议生产数据库由于对大型实时插入,整体坚固性和查询支持其优化的支持。此外,MergeTree引擎支持按主键对行进行排序,对行进行分区以及复制和采样数据。

如果您打算使用ClickHouse存档经常未查询的数据或存储临时数据,您可以使用Log系列引擎来优化该用例。

在列定义之后,您将定义其他表级选项。该PRIMARY KEY子句设置id为主键列,该ORDER BY子句将存储按id列排序的值。主键唯一标识行,用于有效访问单行和高效的行主机托管。

在执行create语句时,您将看到以下输出:

输出
CREATE TABLE visits
(
    id UInt64,
    duration Float64,
    url String,
    created DateTime
)
ENGINE = MergeTree()
PRIMARY KEY id
ORDER BY id

Ok.

0 rows in set. Elapsed: 0.010 sec.

在本节中,您已创建了一个数据库和一个表来跟踪网站访问数据。在下一步中,您将向表中插入数据,更新现有数据并删除该数据。

 

第4步 – 插入,更新和删除数据和列

在此步骤中,您将使用visits表来插入,更新和删除数据。以下命令是将行插入ClickHouse表的语法示例:

INSERT INTO table_name VALUES (column_1_value, column_2_value, ....);

现在,visits通过运行以下每个语句,将几行示例网站访问数据插入到表中:

INSERT INTO visits VALUES (1, 10.5, 'http://example.com', '2019-01-01 00:01:01');
INSERT INTO visits VALUES (2, 40.2, 'http://example1.com', '2019-01-03 10:01:01')
INSERT INTO visits VALUES (3, 13, 'http://example2.com', '2019-01-03 12:01:01')
INSERT INTO visits VALUES (4, 2, 'http://example3.com', '2019-01-04 02:01:01');

您将看到为每个insert语句重复以下输出:

输出

INSERT INTO visits VALUES

Ok.

1 rows in set. Elapsed: 0.004 sec.

每行的输出显示您已将其成功插入visits表中。

现在,您将向表中添加一个附加列visits。在现有表中添加或删除列时,ClickHouse支持ALTER语法。

例如,向表中添加列的基本语法如下:

ALTER TABLE table_name ADD COLUMN column_name column_type;

添加一个名为的列location,通过运行以下语句来存储访问网站的位置:

 	ALTER TABLE visits ADD COLUMN location String;

您将看到类似于以下内容的输出:

输出
ALTER TABLE visits
    ADD COLUMN
    location String


Ok.

0 rows in set. Elapsed: 0.014 sec.

输出显示您已location成功添加列。

从版本19.4.3开始,由于实现限制,ClickHouse不支持更新和删除单个数据行。但是,ClickHouse支持批量更新和删除,并且这些操作具有不同的SQL语法,以突出显示其非标准用法。

以下语法是批量更新行的示例:

ALTER TABLE table_name UPDATE  column_1 = value_1, column_2 = value_2 ...  WHERE  filter_conditions;

您将运行以下语句来更新url所有duration小于15的行的列。将其输入到数据库提示符中以执行:

 	ALTER TABLE visits UPDATE url = 'http://example2.com' WHERE duration < 15;

批量更新语句的输出如下:

输出
ALTER TABLE visits
    UPDATE url = 'http://example2.com' WHERE duration < 15


Ok.

0 rows in set. Elapsed: 0.003 sec.

输出显示您的更新查询已成功完成。该0 rows in set输出表示查询没有返回任何行; 任何更新和删除查询都是如此。

批量删除行的示例语法类似于更新行,并具有以下结构:

ALTER TABLE table_name DELETE WHERE filter_conditions;

要测试删除数据,请运行以下语句以删除所有duration小于5的行:

 	ALTER TABLE visits DELETE WHERE duration < 5;

批量删除语句的输出类似于:

输出
ALTER TABLE visits
    DELETE WHERE duration < 5


Ok.

0 rows in set. Elapsed: 0.003 sec.

输出确认您已删除持续时间少于五秒的行。

要从表中删除列,语法将遵循以下示例结构:

ALTER TABLE table_name DROP COLUMN column_name;

location通过运行以下命令删除先前添加的列:

 	ALTER TABLE visits DROP COLUMN location;

DROP COLUMN确认您已删除该列的输出如下:

输出
ALTER TABLE visits
    DROP COLUMN
    location String


Ok.

0 rows in set. Elapsed: 0.010 sec.

现在您已成功插入,更新和删除表中的行和列visits,您将继续在下一步中查询数据。

 

第5步 – 查询数据

ClickHouse的查询语言是SQL的自定义方言,具有适用于分析工作负载的扩展和功能。在此步骤中,您将运行选择和聚合查询以从visits表中检索数据和结果。

通过选择查询,您可以检索按指定条件筛选的数据行和列,以及要返回的行数等选项。您可以使用SELECT语法选择数据的行和列。SELECT查询的基本语法是:

SELECT func_1(column_1), func_2(column_2) FROM table_name WHERE filter_conditions row_options;

执行以下语句来检索url和duration值行,其中的url是http://example.com:

 	SELECT url, duration FROM visits WHERE url = 'http://example2.com' LIMIT 2;

您将看到以下输出:

输出
SELECT
    url,
    duration
FROM visits
WHERE url = 'http://example2.com'
LIMIT 2

┌─url─────────────────┬─duration─┐
│ http://example2.com │     10.5 │
└─────────────────────┴──────────┘
┌─url─────────────────┬─duration─┐
│ http://example2.com │       13 │
└─────────────────────┴──────────┘

2 rows in set. Elapsed: 0.013 sec.

输出返回了两行,与您指定的条件匹配。现在您已选择了值,您可以转到执行聚合查询。

聚合查询是对一组值进行操作并返回单个输出值的查询。在分析数据库中,这些查询经常运行,并且由数据库进行了很好的优化。ClickHouse支持的一些聚合函数是:

count:返回与指定条件匹配的行数。
sum:返回所选列值的总和。
avg:返回所选列值的平均值。

一些ClickHouse特定的聚合函数包括:

uniq:返回匹配的大致不同行数。
topK:使用近似算法返回特定列的最常值的数组。

要演示聚合查询的执行,您可以通过运行sum查询来计算访问的总持续时间:

 	SELECT SUM(duration) FROM visits;

您将看到类似于以下内容的输出:

输出
SELECT SUM(duration)
FROM visits

┌─SUM(duration)─┐
│          63.7 │
└───────────────┘

1 rows in set. Elapsed: 0.010 sec.

现在,通过执行以下方式计算前两个URL:

 	SELECT topK(2)(url) FROM visits;

您将看到类似于以下内容的输出:

输出
SELECT topK(2)(url)
FROM visits

┌─topK(2)(url)──────────────────────────────────┐
│ ['http://example2.com','http://example1.com'] │
└───────────────────────────────────────────────┘

1 rows in set. Elapsed: 0.010 sec.

现在您已成功查询visits表,您将在下一步中删除表和数据库。

 

第6步 – 删除表和数据库

在本节中,您将删除visits表和test数据库。

删除表的语法遵循以下示例:

DROP TABLE table_name;

要删除visits表,请运行以下语句:

 	DROP TABLE visits;

您将看到以下输出声明您已成功删除表:

输出
DROP TABLE visits

Ok.

0 rows in set. Elapsed: 0.005 sec.

您可以使用语法删除数据库。要删除数据库,请执行以下语句:DROP database table_nametest

 	DROP DATABASE test;

结果输出显示您已成功删除数据库:

输出
DROP DATABASE test

Ok.

0 rows in set. Elapsed: 0.003 sec.

您已在此步骤中删除了表和数据库。现在,您已在ClickHouse实例中创建,更新和删除了数据库,表和数据,您将在下一部分中启用对数据库服务器的远程访问。

 

第7步 – 设置防火墙规则(可选)

如果您打算仅在本地使用ClickHouse与在同一服务器上运行的应用程序,或者在服务器上未启用防火墙,则无需完成此部分。相反,如果您将远程连接到ClickHouse数据库服务器,则应执行此步骤。

目前,您的服务器已启用防火墙,禁用访问所有端口的公共IP地址。您将完成以下两个步骤以允许远程访问:

添加防火墙规则,允许传入连接到端口8123,即ClickHouse服务器运行的HTTP端口。

如果您在数据库提示符内,请键入以退出它CTRL+D。

执行以下命令编辑配置文件:

sudo vi /etc/clickhouse-server/config.xml

然后取消注释包含的行<!– <listen_host>0.0.0.0</listen_host> –>,如下面的文件:

/etc/clickhouse-server/config.xml
...
 <interserver_http_host>example.yandex.ru</interserver_http_host>
    -->

    <!-- Listen specified host. use :: (wildcard IPv6 address), if you want to accept connections both with IPv4 and IPv6 from everywhere. -->
    <!-- <listen_host>::</listen_host> -->
    <!-- Same for hosts with disabled ipv6: -->
    <listen_host>0.0.0.0</listen_host>

    <!-- Default values - try listen localhost on ipv4 and ipv6: -->
    <!--
    <listen_host>::1</listen_host>
    <listen_host>127.0.0.1</listen_host>
    -->
...

保存文件并退出vi。对于要应用的新配置,请运行以下命令重新启动服务:

sudo service clickhouse-server restart

您将看到此命令的以下输出:

输出
Stop clickhouse-server service:
DONE
Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/
DONE

将远程服务器的IP添加到名为public的区域:

sudo firewall-cmd –permanent –zone=public –add-source=second_server_ip/32

ClickHouse的服务器侦听端口上8123的HTTP连接和端口9000以进行连接clickhouse-client。使用以下命令允许访问第二个服务器的IP地址的两个端口:

sudo firewall-cmd –permanent –zone=public –add-port=8123/tcp
sudo firewall-cmd –permanent –zone=public –add-port=9000/tcp

您将看到两个命令的以下输出,表明您已启用对两个端口的访问:

输出
success

现在您已添加规则,请重新加载防火墙以使更改生效:

sudo firewall-cmd –reload

此命令也将输出一条success消息。现在可以从您添加的IP访问ClickHouse。如果需要,可以随意添加其他IP,例如本地计算机的地址。

要验证您是否可以从远程计算机连接到ClickHouse服务器,请首先按照本教程的步骤1中的步骤在第二台服务器上进行操作,并确保clickhouse-client已在其上安装了该服务器。

现在您已登录到第二台服务器,通过执行以下命令启动客户机会话:

clickhouse-client --host your_server_ip --multiline
 

您将看到以下输出,表明您已成功连接到服务器:

 
输出
ClickHouse client version 19.4.3.
Connecting to your_server_ip:9000 as user default.
Connected to ClickHouse server version 19.4.3 revision 54416.

hostname :)

在此步骤中,您已通过调整防火墙规则启用了对ClickHouse数据库服务器的远程访问。

 

结论

您已成功在服务器上设置ClickHouse数据库实例,并创建了数据库和表,添加了数据,执行了查询并删除了数据库。在ClickHouse的文档,你可以了解他们的基准,对其他的开源和商业分析数据库和一般的参考文献。ClickHouse提供的其他功能包括跨多个服务器的分布式查询处理,通过在不同分片上存储数据来提高性能并防止数据丢失。