作为Write for DOnations计划的一部分,作者选择了免费和开源基金来接受捐赠。
介绍
ClickHouse是Yandex为OLAP和大数据用例创建的开源、面向列的分析数据库。ClickHouse 对实时查询处理的支持使其适用于需要亚秒级分析结果的应用程序。ClickHouse 的查询语言是SQL 的一种方言,它支持强大的声明式查询功能,同时为最终用户提供熟悉度和更小的学习曲线。
面向列的数据库将记录存储在按列而不是行分组的块中。通过不为查询中不存在的列加载数据,面向列的数据库在完成查询时读取数据的时间更少。因此,对于某些工作负载(例如 OLAP),这些数据库可以比传统的基于行的系统更快地计算和返回结果。
在线分析处理(OLAP) 系统允许组织大量数据并执行复杂查询。它们能够管理 PB 级数据并快速返回查询结果。通过这种方式,OLAP 可用于数据科学和业务分析等领域的工作。
在本教程中,您将在您的机器上安装 ClickHouse 数据库服务器和客户端。您将使用 DBMS 执行典型任务,并可选择启用来自另一台服务器的远程访问,以便您能够从另一台机器连接到数据库。然后,您将通过建模和查询示例网站访问数据来测试 ClickHouse。
先决条件
-
一台
sudo
启用了非 root 用户和防火墙设置的Ubuntu 20.04 服务器。服务器应至少有 2GB 的 RAM。您可以按照初始服务器设置教程创建用户并设置防火墙。 -
(可选)具有
sudo
启用的非 root 用户和防火墙设置的辅助 Ubuntu 20.04 服务器。
第 1 步 – 安装 ClickHouse
在本节中,您将使用apt
.
首先,运行以下命令通过 SSH 连接到您的服务器:
- ssh sammy@your_server_ip
Yandex 维护一个 APT 存储库,其中包含最新版本的 ClickHouse。添加存储库的 GPG 密钥,以便您能够安全地下载经过验证的 ClickHouse 包:
- sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E0C56BD4
您将看到类似于以下内容的输出:
OutputExecuting: /tmp/apt-key-gpghome.JkkcKnBAFY/gpg.1.sh --keyserver keyserver.ubuntu.com --recv E0C56BD4
gpg: key C8F1E19FE0C56BD4: public key "ClickHouse Repository Key <[email protected]>" imported
gpg: Total number processed: 1
gpg: imported: 1
输出确认它已成功验证并添加了密钥。
通过执行以下命令将存储库添加到您的 APT 存储库列表中:
- echo "deb http://repo.yandex.ru/clickhouse/deb/stable/ main/" | sudo tee /etc/apt/sources.list.d/clickhouse.list
在这里,您已通过管道传输echo
to的输出,sudo tee
以便此输出可以打印到根拥有的文件。
现在,更新您的软件包:
- sudo apt update
在clickhouse-server
与clickhouse-client
包现在可用于安装。安装它们:
- sudo apt install clickhouse-server clickhouse-client
在安装过程中,系统会要求您为默认 ClickHouse 用户设置密码。
您已成功安装 ClickHouse 服务器和客户端。您现在已准备好启动数据库服务并确保它正确运行。
第 2 步 – 启动服务
clickhouse-server
您在上一节中安装的包创建了一个systemd
服务,该服务执行诸如启动、停止和重新启动数据库服务器之类的操作。systemd
是一个用于 Linux 初始化和管理服务的 init 系统。在本节中,您将启动服务并验证它是否成功运行。
clickhouse-server
通过运行启动服务:
- sudo service clickhouse-server start
上一个命令不会显示任何输出。要验证服务是否成功运行,请执行:
- sudo service clickhouse-server status
您将看到类似于以下内容的输出:
Output● clickhouse-server.service - ClickHouse Server (analytic DBMS for big data)
Loaded: loaded (/etc/systemd/system/clickhouse-server.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-09-16 05:18:54 UTC; 5s ago
Main PID: 2697 (clickhouse-serv)
Tasks: 46 (limit: 1137)
Memory: 459.7M
CGroup: /system.slice/clickhouse-server.service
└─2697 /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml --pid-file=/run/clickhouse-server/clickhouse-server.pid
输出表明服务器正在运行。
您已成功启动 ClickHouse 服务器,现在可以使用clickhouse-client
CLI 程序连接到服务器。
第 3 步 – 创建数据库和表
在 ClickHouse 中,您可以通过直接在交互式数据库提示中执行 SQL 语句来创建和删除数据库。语句由遵循特定语法的命令组成,这些命令告诉数据库服务器执行请求的操作以及所需的任何数据。您可以使用语法创建数据库。要创建数据库,首先通过运行以下命令启动客户端会话:CREATE DATABASE table_name
- clickhouse-client --password
您将被要求输入您在安装过程中设置的密码 – 输入密码以成功启动客户端会话。
前面的命令将使您登录到客户端提示符,您可以在其中运行 ClickHouse SQL 语句来执行以下操作:
-
创建、更新和删除数据库、表、索引、分区和视图。
-
执行查询以检索使用各种条件进行可选过滤和分组的数据。
在这一步中,随着 ClickHouse 客户端准备好插入数据,您将创建一个数据库和表。出于本教程的目的,您将创建一个名为 的数据库test
,并在其中创建一个名为visits
跟踪网站访问持续时间的表。
现在您已进入 ClickHouse 命令提示符,请test
通过执行以下命令来创建数据库:
- CREATE DATABASE test;
您将看到以下输出,表明您已创建数据库:
OutputCREATE 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 中,引擎确定底层数据的物理结构、表的查询能力、并发访问模式以及对索引的支持。不同的发动机类型适用于不同的应用要求。最常用和广泛适用的发动机类型是MergeTree
.
现在您对表创建有了一个概述,您将创建一个表。首先确认您要修改的数据库:
- USE test;
您将看到以下输出,表明您已从test
数据库切换到default
数据库:
OutputUSE 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 语句时,您将看到以下输出:
OutputCREATE 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');
您将看到针对每个插入语句重复的以下输出。
OutputINSERT 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;
您将看到类似于以下内容的输出:
OutputALTER TABLE visits
ADD COLUMN
location String
Ok.
0 rows in set. Elapsed: 0.014 sec.
输出显示您已location
成功添加列。
从版本 19.13.3 开始,由于实施限制,ClickHouse 不支持更新和删除单个数据行。但是,ClickHouse 支持批量更新和删除,并且为这些操作提供了独特的 SQL 语法以突出它们的非标准用法。
以下语法是批量更新行的示例:
ALTER TABLE table_name UPDATE column_1 = value_1, column_2 = value_2 ... WHERE filter_conditions;
您将运行以下语句来更新url
aduration
小于 15的所有行的列。将其输入到数据库提示符中以执行:
- ALTER TABLE visits UPDATE url = 'http://example2.com' WHERE duration < 15;
批量更新语句的输出如下:
OutputALTER 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;
要测试删除数据,请运行以下语句以删除所有 aduration
小于 的行5
:
- ALTER TABLE visits DELETE WHERE duration < 5;
批量删除语句的输出类似于:
OutputALTER 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
确认您已删除该列的输出将如下所示:
OutputALTER 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;
您将看到以下输出:
OutputSELECT
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;
您将看到类似于以下内容的输出:
OutputSELECT SUM(duration)
FROM visits
┌─SUM(duration)─┐
│ 63.7 │
└───────────────┘
1 rows in set. Elapsed: 0.010 sec.
现在,通过执行计算前两个 URL:
- SELECT topK(2)(url) FROM visits;
您将看到类似于以下内容的输出:
OutputSELECT 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;
您将看到以下输出,表明您已成功删除表:
outputDROP TABLE visits
Ok.
0 rows in set. Elapsed: 0.005 sec.
您可以使用语法删除数据库。要删除数据库,请执行以下语句:DROP database table_name
test
- DROP DATABASE test;
结果输出显示您已成功删除数据库。
OutputDROP DATABASE test
Ok.
0 rows in set. Elapsed: 0.003 sec.
您已在此步骤中删除表和数据库。现在您已经在 ClickHouse 实例中创建、更新和删除了数据库、表和数据,您将在下一节中启用对数据库服务器的远程访问。
步骤 7 — 设置防火墙规则(可选)
如果您打算仅在本地将 ClickHouse 与在同一服务器上运行的应用程序一起使用,或者您的服务器上没有启用防火墙,则无需完成此部分。如果相反,您将远程连接到 ClickHouse 数据库服务器,则应执行此步骤。
目前,您的服务器启用了防火墙,禁止您的公共 IP 地址访问所有端口。您将完成以下两个步骤以允许远程访问:
-
修改 ClickHouse 的配置并允许它侦听所有接口。
-
添加允许传入连接到 port 的防火墙规则
8123
,这是 ClickHouse 服务器运行的 HTTP 端口。
如果您在数据库提示符中,请键入退出它CTRL+D
。
通过执行以下命令编辑配置文件:
- sudo nano /etc/clickhouse-server/config.xml
然后取消注释包含 的行<!-- <listen_host>0.0.0.0</listen_host> -->
,如以下文件:
...
<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>
-->
...
保存文件并退出。对于要应用的新配置,通过运行以下命令重新启动服务:
- sudo service clickhouse-server restart
您不会看到此命令的任何输出。ClickHouse 的服务器侦听8123
HTTP 连接的端口9000
和来自clickhouse-client
. 使用以下命令允许访问第二台服务器 IP 地址的两个端口:
- sudo ufw allow from second_server_ip/32 to any port 8123
- sudo ufw allow from second_server_ip/32 to any port 9000
您将看到两个命令的以下输出,表明您已启用对两个端口的访问:
OutputRule added
现在可以从您添加的 IP 访问 ClickHouse。如果需要,可以随意添加其他 IP,例如本地计算机的地址。
要验证您是否可以从远程计算机连接到 ClickHouse 服务器,请首先在第二台服务器上执行本教程第 1 步中的步骤,并确保clickhouse-client
在其上安装了 。
现在您已经登录到第二台服务器,通过执行以下命令启动客户端会话:
- clickhouse-client --host your_server_ip --password
您将看到以下输出,表明您已成功连接到服务器:
OutputClickHouse client version 19.13.3.26 (official build).
Password for user (default):
Connecting to your_server_ip:9000 as user default.
Connected to ClickHouse server version 19.13.3 revision 54425.
hostname :)
在此步骤中,您已通过调整防火墙规则启用了对 ClickHouse 数据库服务器的远程访问。
结论
您已在服务器上成功设置了 ClickHouse 数据库实例,并创建了数据库和表、添加了数据、执行了查询并删除了数据库。在 ClickHouse 的文档中,您可以阅读他们针对其他开源和商业分析数据库以及一般参考文档的基准测试。
ClickHouse 提供的更多功能包括跨多个服务器的分布式查询处理,以通过将数据存储在不同的分片上来提高性能并防止数据丢失。