如何在 Ubuntu 18.04 上安装和使用 ClickHouse

x33g5p2x  于2021-10-27 转载在 ClickHouse  
字(9.8k)|赞(0)|评价(0)|浏览(1166)

介绍

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

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

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

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

先决条件

  • 一台启用了 sudo 的非 root 用户和防火墙设置的 Ubuntu 18.04 服务器。您可以按照初始服务器设置教程创建用户并设置防火墙。
    *(可选)具有 sudo 启用非 root 用户和防火墙设置的辅助 Ubuntu 18.04 服务器。您可以按照初始服务器设置教程进行操作。

第 1 步 - 安装 ClickHouse

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

首先,运行以下命令通过 SSH 连接到您的服务器:

ssh sammy@your_server_ip

Yandex 维护一个 APT 存储库,其中包含最新版本的 ClickHouse。添加存储库的 GPG 密钥,以便您能够安全地下载经过验证的 ClickHouse 包:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E0C56BD4

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

Output
Executing: /tmp/apt-key-gpghome.JkkcKnBAFY/gpg.1.sh --keyserver keyserver.ubuntu.com --recv E0C56BD4

gpg: key C8F1E19FE0C56BD4: public key "ClickHouse Repository Key <milovidov@yandex-team.ru>" 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 的输出通过管道传输到 sudo tee,以便此输出可以打印到根拥有的文件。

现在,运行 apt-get update 来更新你的包:

sudo apt-get update

clickhouse-serverclickhouse-client 软件包现在可供安装。安装它们:

sudo apt-get install -y clickhouse-server clickhouse-client

您已成功安装 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 Sat 2018-12-22 07:23:20 UTC; 1h 9min ago
 Main PID: 27101 (ClickHouse-serv)
    Tasks: 34 (limit: 1152)
   CGroup: /system.slice/ClickHouse-server.service
           └─27101 /usr/bin/ClickHouse-server --config=/etc/ClickHouse-server/config.xml

输出表示服务器正在运行。

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

第 3 步 - 创建数据库和表

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

clickhouse-client

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

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

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

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

CREATE DATABASE test;

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

Output
CREATE DATABASE test

Ok.

0 rows in set. Elapsed: 0.003 sec.

ClickHouse 表类似于其他关系数据库中的表;它拥有一组相关数据n 结构化格式。您可以指定列及其类型、添加数据行以及对表执行不同类型的查询。

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

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

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

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

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

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

USE test;

您将看到以下输出,表明您已从 default 数据库切换到 test 数据库:

Output
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 family 推荐用于生产数据库,因为它优化了对大型实时插入的支持、整体健壮性和查询支持。此外,MergeTree 引擎支持按主键对行进行排序、行分区以及复制和采样数据。

如果您打算使用 ClickHouse 来归档不经常查询的数据或存储临时数据,您可以使用引擎的 Log family 来针对该用例进行优化。

在列定义之后,您将定义其他表级选项。 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');

您将看到针对每个插入语句重复的以下输出。

Output
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;

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

OutputALTER TABLE visits
    ADD COLUMN
    location String


Ok.

0 rows in set. Elapsed: 0.014 sec.

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

从版本 19.3.6 开始,由于实施限制,ClickHouse 不支持更新和删除单个数据行。但是,ClickHouse 支持批量更新和删除,并且为这些操作提供了独特的 SQL 语法以突出它们的非标准用法。

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

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

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

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

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

Output
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;

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

Output
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 输出将如下所示:

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;

执行以下语句以检索 urlhttp://example.com 的行的 urlduration 值。

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;

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

Output
SELECT 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;

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

Output
DROP DATABASE test

Ok.

0 rows in set. Elapsed: 0.003 sec.

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

步骤 7 — 设置防火墙规则(可选)

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

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

修改 ClickHouse 的配置并允许它侦听所有接口。
*
添加防火墙规则,允许传入连接到端口 8123,这是 ClickHouse 服务器运行的 HTTP 端口。

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

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

sudo nano /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>
    -->
...

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

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

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

OutputClickHouse client version 19.3.6.
Connecting to your_server_ip:9000 as user default.
Connected to ClickHouse server version 19.3.6 revision 54415.

hostname :)

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

结论

您已在服务器上成功设置了 ClickHouse 数据库实例,并创建了数据库和表、添加了数据、执行了查询并删除了数据库。在 ClickHouse 的文档中,您可以阅读他们针对其他开源和商业分析数据库的 benchmarks 以及一般参考 documents。此外,features ClickHouse 产品包括跨多个服务器的分布式查询处理,通过将数据存储在不同的分片上来提高性能并防止数据丢失。

相关文章