乐趣区

关于数据仓库:篇一ClickHouse快速入门

ClickHouse 简介

ClickHouse 是一个用于联机剖析 (OLAP) 的列式数据库管理系统(DBMS)。ClickHouse 最后是一款名为 Yandex.Metrica 的产品,次要用于 WEB 流量剖析。ClickHouse 的全称是Click Stream,Data WareHouse,简称 ClickHouse。

ClickHouse 十分实用于商业智能畛域,除此之外,它也可能被广泛应用于广告流量、Web、App 流量、电信、金融、电子商务、信息安全、网络游戏、物联网等泛滥其余畛域。ClickHouse 具备以下特点:

  • 反对齐备的 SQL 操作
  • 列式存储与数据压缩
  • 向量化执行引擎
  • 关系型模型(与传统数据库相似)
  • 丰盛的表引擎
  • 并行处理
  • 在线查问
  • 数据分片

    ClickHouse 作为一款高性能 OLAP 数据库,存在以下有余。

  • 不反对事务。
  • 不善于依据主键按行粒度进行查问(尽管反对),故不应该把 ClickHouse 当作 Key-Value 数据库应用。
  • 不善于按行删除数据(尽管反对)

单机装置

下载 RPM 包

本文装置形式抉择的是离线装置,能够在上面的链接中下载对应的 rpm 包,也能够间接百度云下载

-- rpm 包地址
https://packagecloud.io/Altinity/clickhouse
-- 百度云地址
链接:https://pan.baidu.com/s/1pFR66SzLvPYMfcpuPJww5A 
提取码:gh5a

在咱们装置的软件中蕴含这些包:

  • clickhouse-client 包,蕴含 clickhouse-client 应用程序,它是交互式 ClickHouse 控制台客户端。
  • clickhouse-common 包,蕴含一个 ClickHouse 可执行文件。
  • clickhouse-server 包,蕴含要作为服务端运行的 ClickHouse 配置文件。

总共蕴含四个 RPM 包,

clickhouse-client-19.17.4.11-1.el7.x86_64.rpm
clickhouse-common-static-19.17.4.11-1.el7.x86_64.rpm
clickhouse-server-19.17.4.11-1.el7.x86_64.rpm
clickhouse-server-common-19.17.4.11-1.el7.x86_64.rpm

尖叫提醒:如果装置过程中,报错:依赖检测失败,示意短少依赖包

能够先手动装置 libicu-50.2-4.el7_7.x86_64.rpm 依赖包

敞开防火墙

## 查看防火墙状态。systemctl status firewalld
## 长期敞开防火墙命令。重启电脑后,防火墙主动起来。systemctl stop firewalld
## 永恒敞开防火墙命令。重启后,防火墙不会主动启动。systemctl disable firewalld

零碎要求

ClickHouse 能够在任何具备 x86_64,AArch64 或 PowerPC64LE CPU 架构的 Linux,FreeBSD 或 Mac OS X 上运行。尽管预构建的二进制文件通常是为 x86 _64 编译并利用 SSE 4.2 指令集,但除非另有阐明,否则应用反对它的 CPU 将成为额定的零碎要求。这是查看以后 CPU 是否反对 SSE 4.2 的命令:

grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
SSE 4.2 supported

要在不反对 SSE 4.2 或具备 AArch64 或 PowerPC64LE 体系结构的处理器上运行 ClickHouse,应该通过源构建 ClickHouse 进行适当的配置调整。

装置 RPM 包

## 将 rpm 包上传至 /opt/software 目录下
## 执行如下命令进行装置
[root@cdh06 software]# rpm -ivh *.rpm
谬误:依赖检测失败:libicudata.so.50()(64bit) 被 clickhouse-common-static-19.17.4.11-1.el7.x86_64 须要
        libicui18n.so.50()(64bit) 被 clickhouse-common-static-19.17.4.11-1.el7.x86_64 须要
        libicuuc.so.50()(64bit) 被 clickhouse-common-static-19.17.4.11-1.el7.x86_64 须要
        libicudata.so.50()(64bit) 被 clickhouse-server-19.17.4.11-1.el7.x86_64 须要
        libicui18n.so.50()(64bit) 被 clickhouse-server-19.17.4.11-1.el7.x86_64 须要
        libicuuc.so.50()(64bit) 被 clickhouse-server-19.17.4.11-1.el7.x86_64 须要
## 下面装置报错,短少相应的依赖包,## 须要下载绝对应的依赖包
## 下载 libicu-50.2-4.el7_7.x86_64.rpm 进行装置即可

查看装置信息

目录构造

  • /etc/clickhouse-server:服务端的配置文件目录,包含全局配置 config.xml 和用户配置 users.xml 等。
  • /etc/clickhouse-client:客户端配置,包含 conf.d 文件夹和 config.xml 文件。
  • /var/lib/clickhouse:默认的数据存储目录(通常会批改默认门路配置,将数据保留到大容量磁盘挂载的门路)。
  • /var/log/clickhouse-server:默认保留日志的目录(通常会批改门路配置,将日志保留到大容量磁盘挂载的门路)。

配置文件

  • /etc/security/limits.d/clickhouse.conf:文件句柄数量的配置
[root@cdh06 clickhouse-server]# cat /etc/security/limits.d/clickhouse.conf 
clickhouse      soft    nofile  262144
clickhouse      hard    nofile  262144

该配置也能够通过 config.xml 的 max_open_files 批改

 <!-- Set limit on number of open files (default: maximum). This setting makes sense on Mac OS X because getrlimit() fails to retrieve correct maximum value. -->
    <!-- <max_open_files>262144</max_open_files> -->
  • /etc/cron.d/clickhouse-server:cron:定时工作配置,用于复原因异样起因中断的 ClickHouse 服务过程,其默认的配置如下。
[root@cdh06 cron.d]# cat /etc/cron.d/clickhouse-server
#*/10 * * * * root (which service > /dev/null 2>&1 && (service clickhouse-server condstart ||:)) || /etc/init.d/clickhouse-server condstart > /dev/null 2>&1

可执行文件

最初是一组在 /usr/bin 门路下的可执行文件:

  • clickhouse:主程序的可执行文件。
  • clickhouse-client:一个指向 ClickHouse 可执行文件的软链接,供客户端连贯应用。
  • clickhouse-server:一个指向 ClickHouse 可执行文件的软链接,供服务端启动应用。
  • clickhouse-compressor:内置提供的压缩工具,可用于数据的正压反解。

启动 / 敞开服务

## 启动服务
[root@cdh06 ~]# service clickhouse-server start
Start clickhouse-server service: Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/
DONE
## 敞开服务
[root@cdh06 ~]# service clickhouse-server stop

客户端连贯

[root@cdh06 ~]# clickhouse-client 
ClickHouse client version 19.17.4.11.
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 19.17.4 revision 54428.

cdh06 :) show databases;

SHOW DATABASES

┌─name────┐
│ default │
│ system  │
└─────────┘

2 rows in set. Elapsed: 0.004 sec. 

基本操作

创立数据库

  • 语法
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)]
  • 例子
CREATE DATABASE IF NOT EXISTS tutorial

默认状况下,ClickHouse 应用的是原生的数据库引擎 Ordinary(在此数据库下能够应用任意类型的 表引擎 在绝大多数状况下都只需应用默认的数据库引擎 )。当然也能够应用Lazy 引擎和 MySQL 引擎,比方应用 MySQL 引擎,能够间接在 ClickHouse 中操作 MySQL 对应数据库中的表。假如 MySQL 中存在一个名为 clickhouse 的数据库,能够应用上面的形式连贯 MySQL 数据库。

-- -------------------------- 语法 -----------------------------------
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')
-- -------------------------- 示例 ------------------------------------
CREATE DATABASE mysql_db ENGINE = MySQL('192.168.200.241:3306', 'clickhouse', 'root', '123qwe');
-- --------------------------- 操作 -----------------------------------
cdh06 :) use mysql_db;
cdh06 :) show tables;

SHOW TABLES

┌─name─┐
│ test │
└──────┘

1 rows in set. Elapsed: 0.005 sec. 

cdh06 :) select * from test;

SELECT *
FROM test

┌─id─┬─name──┐
│  1 │ tom   │
│  2 │ jack  │
│  3 │ lihua │
└────┴───────┘

3 rows in set. Elapsed: 0.047 sec. 

创立表

  • 语法
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [compression_codec] [TTL expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [compression_codec] [TTL expr2],
    ...
) ENGINE = engine
  • 示例
-- 留神首字母大写
-- 建表
create table test(
    id Int32,
    name String
) engine=Memory;

下面命令创立了一张内存表,即应用 Memory 引擎。表引擎决定了数据表的个性,也决定了数据将会被如何存储及加载。Memory 引擎是 ClickHouse 最简略的表引擎,数据只会被保留在内存中,在服务重启时数据会失落。

集群装置

装置步骤

下面介绍了单机装置的根本步骤和 ClickHouse 客户端的根本应用。接下来将介绍集群的装置形式。ClickHouse 集群装置非常简单,首先反复下面步骤,别离在其余机器上装置 ClickHouse,而后再别离配置一下 /etc/clickhouse-server/config.xml/etc/metrika.xml两个文件即可。值得注意的是,ClickHouse 集群的依赖于Zookeeper,所以要保障先装置好 Zookeeper 集群,zk 集群的装置步骤非常简单,本文不会波及。本文演示三个节点的 ClickHouse 集群装置,具体步骤如下:

  • 首先,反复单机装置的步骤,别离在另外两台机器装置 ClickHouse
  • 而后,在每台机器上批改 /etc/clickhouse-server/config.xml 文件

    <!-- 如果禁用了 ipv6,应用上面配置 -->
    <listen_host>0.0.0.0</listen_host>
    <!-- 如果没有禁用 ipv6,应用上面配置
    <listen_host>::</listen_host>
    -->

    尖叫提醒(1):

    在禁用了 ipv6 时,如果应用 <listen_host>::</listen_host> 配置,会报如下谬误

    <Error> Application: DB::Exception: Listen [::]:8123 failed: Poco::Exception. Code: 1000, e.code() =0, e.displayText() = DNS error: EAI: -9

    尖叫提醒(2):

    ClickHouse 默认的 tcp 端口号是 9000,如果存在端口抵触,能够在 /etc/clickhouse-server/config.xml 文件中批改 端口号 <tcp_port>9001</tcp_port>

  • 最初在 /etc 下创立 metrika.xml 文件,内容如下,上面配置是 不蕴含正本的分片配置,咱们还能够为分片配置多个正本

    <yandex>
    <!-- 该标签与 config.xml 的 <remote_servers incl="clickhouse_remote_servers" > 保持一致
     -->    
    <clickhouse_remote_servers>
        <!-- 集群名称,能够批改 -->
        <cluster_3shards_1replicas>
            <!-- 配置三个分片,每个分片对应一台机器 -->
            <shard>
                <replica>
                    <host>cdh04</host>
                    <port>9001</port>
                </replica>
            </shard>
            <shard>
                <replica>
                    <host>cdh05</host>
                    <port>9001</port>
                </replica>
            </shard>
            <shard>
                <replica>
                    <host>cdh06</host>
                    <port>9001</port>
                </replica>
            </shard>
        </cluster_3shards_1replicas>
    </clickhouse_remote_servers>
    <!-- 该标签与 config.xml 的 <zookeeper incl="zookeeper-servers" optional="true" />
    保持一致
     --> 
    <zookeeper-servers>
        <node>
            <host>cdh02</host>
            <port>2181</port>
        </node>
        <node>
            <host>cdh03</host>
            <port>2181</port>
        </node>
        <node>
            <host>cdh06</host>
            <port>2181</port>
        </node>
    </zookeeper-servers>
    <!-- 分片和正本标识,shard 标签配置分片编号,<replica> 配置分片正本主机名
      须要批改对应主机上的配置 -->
    <macros>
        <shard>01</shard>
        <replica>cdh04</replica>
    </macros>    
    </yandex>
  • 别离在各自的机器上启动 clickhouse-server

    # service clickhouse-server start
  • (可选配置)批改 /etc/clickhouse-client/config.xml 文件

    因为 clickhouse-client 默认连贯的主机是 localhost,默认连贯的端口号是 9000,因为咱们批改了默认的端口号,所以须要批改客户端默认连贯的端口号,在该文件里增加如下内容:

     <port>9001</port>

    当然也能够不必批改,然而记得在应用客户端连贯时,加上 –port 9001 参数指明要连贯的端口号,否则会报错:

    Connecting to localhost:9000 as user default.
    Code: 210. DB::NetException: Connection refused (localhost:9000)

基本操作

验证集群

在实现上述配置之后,在各自机器上启动 clickhouse-server,并开启 clickhouse-clent

// 启动 server
# service clickhouse-server start
// 启动客户端,- m 参数反对多行输出
# clickhouse-client -m

能够查问零碎表验证集群配置是否已被加载:

cdh04 :) select cluster,shard_num,replica_num,host_name,port,user from system.clusters;

接下来再来看一下集群的分片信息(宏变量):别离在各自机器上执行上面命令:

cdh04 :) select * from system.macros;
┌─macro───┬─substitution─┐
│ replica │ cdh04        │
│ shard   │ 01           │
└─────────┴──────────────┘

cdh05 :) select * from system.macros;
┌─macro───┬─substitution─┐
│ replica │ cdh05        │
│ shard   │ 02           │
└─────────┴──────────────┘

cdh06 :) select * from system.macros;
┌─macro───┬─substitution─┐
│ replica │ cdh06        │
│ shard   │ 03           │
└─────────┴──────────────┘

分布式 DDL 操作

默认状况下,CREATE、DROP、ALTER、RENAME 操作仅仅在以后执行该命令的 server 上失效。在集群环境下,能够应用 ON CLUSTER 语句,这样就能够在整个集群发挥作用。

比方创立一张分布式表:

CREATE TABLE IF NOT EXISTS user_cluster ON CLUSTER cluster_3shards_1replicas
(
    id Int32,
    name String
)ENGINE = Distributed(cluster_3shards_1replicas, default, user_local,id);

Distributed 表引擎的定义模式如下所示:对于 ClickHouse 的表引擎,后续文章会做具体解释。

Distributed(cluster_name, database_name, table_name[, sharding_key])

各个参数的含意别离如下:

  • cluster_name:集群名称,与集群配置中的自定义名称绝对应。
  • database_name:数据库名称
  • table_name:表名称
  • sharding_key:可选的,用于分片的 key 值,在数据写入的过程中,分布式表会根据分片 key 的规定,将数据分布到各个节点的本地表。

尖叫提醒:

创立分布式表是 读时查看的机制 ,也就是说对 创立分布式表和本地表的程序并没有强制要求

同样值得注意的是,在下面的语句中应用了 ON CLUSTER 分布式 DDL,这意味着在集群的每个分片节点上,都会创立一张 Distributed 表,这样便能够从其中任意一端发动对所有分片的读、写申请。

创立实现下面的分布式表时,在每台机器上查看表,发现每台机器上都存在一张刚刚创立好的表。

接下来就须要创立本地表了,在每台机器上别离创立一张本地表:

CREATE TABLE IF NOT EXISTS user_local 
(
    id Int32,
    name String
)ENGINE = MergeTree()
ORDER BY id
PARTITION BY id
PRIMARY KEY id;

咱们先在一台机器上,对 user_local 表进行插入数据,而后再查问 user_cluster 表

-- 插入数据
cdh04 :) INSERT INTO user_local VALUES(1,'tom'),(2,'jack');
-- 查问 user_cluster 表, 可见通过 user_cluster 表能够操作所有的 user_local 表
cdh04 :) select * from user_cluster;
┌─id─┬─name─┐
│  2 │ jack │
└────┴──────┘
┌─id─┬─name─┐
│  1 │ tom  │
└────┴──────┘

接下来,咱们再向 user_cluster 中插入一些数据,察看 user_local 表数据变动,能够发现数据被扩散存储到了其余节点上了。

-- 向 user_cluster 插入数据
cdh04 :)  INSERT INTO user_cluster VALUES(3,'lilei'),(4,'lihua'); 
-- 查看 user_cluster 数据
cdh04 :) select * from user_cluster;
┌─id─┬─name─┐
│  2 │ jack │
└────┴──────┘
┌─id─┬─name──┐
│  3 │ lilei │
└────┴───────┘
┌─id─┬─name─┐
│  1 │ tom  │
└────┴──────┘
┌─id─┬─name──┐
│  4 │ lihua │
└────┴───────┘

-- 在 cdh04 上查看 user_local
cdh04 :) select * from user_local;
┌─id─┬─name─┐
│  2 │ jack │
└────┴──────┘
┌─id─┬─name──┐
│  3 │ lilei │
└────┴───────┘
┌─id─┬─name─┐
│  1 │ tom  │
└────┴──────┘
-- 在 cdh05 上查看 user_local
cdh05 :) select * from user_local;
┌─id─┬─name──┐
│  4 │ lihua │
└────┴───────┘

总结

本文首先介绍了 ClickHouse 的根本特点和应用场景,接着论述了 ClickHouse 单机版与集群版离线装置步骤,并给出了 ClickHouse 的简略应用案例。本文是 ClickHouse 的一个简略入门,在接下来的分享中,会逐渐深刻摸索 ClickHouse 的世界。

退出移动版