Clickhouse 入门实战
介绍
ClickHouse 是俄罗斯的 Yandex 于2016年开源的列式存储数据库(DBMS),主要用于在线分析处理查询(OLAP)。
下面简单介绍行式存储和列式存储的区别:
行式数据库
列式数据库
列式数据库由于相同指标会存到一起, 所以可以很方便的针对 多条数据的相同指标
进行统计、分析, 而行式数据库由于基于行的存储, 需要将该行的数据都取出 ,再取出所需要的指标, 就会导致多取了很多不必要的指标, 可见行式存储的分析性能没有列式存储高.
安装
本文都是使用 docker 进行 Clickhouse 的安装.
# 使用docker启动 clickhouse
# 如果要使用自定义配置文件需要进行额外的映射, 映射到容器内的/etc/clickhouse-server/地址
docker run -d --name clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server
# 进入容器
docker exec -it clickhouse-server bash
# 使用 clickhouse-client 客户端进入, 进入后就能进行数据库操作了.
clickhouse-client
下面是结果图
数据测试
建表
创建测试的库和表, 由于创建几个表的sql太长,就不在这里粘贴, 详见 官方指引
# 创建 tutorial 库
# 使用 clickhouse-client 创建
clickhouse-client --query "CREATE DATABASE IF NOT EXISTS tutorial;"
# 如果是已经使用 clickhouse-client 连接到server, 则只需下面
CREATE DATABASE IF NOT EXISTS tutorial;
# 创建表1 hits_v
# 创建表2 visits_v1
建表成功后:
use tutorial
SHOW TABLES
Query id: xxx
┌─name──────┐
│ hits_v1 │
│ visits_v1 │
└───────────┘
导入数据
# 接下来使用官方的示例文件进行测试
curl https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv
curl https://datasets.clickhouse.com/visits/tsv/visits_v1.tsv.xz | unxz --threads=`nproc` > visits_v1.tsv
# 此处跳过一个小时 ....
# 下面是导入
clickhouse-client --query "INSERT INTO tutorial.hits_v1 FORMAT TSV" --max_insert_block_size=100000 < hits_v1.tsv
clickhouse-client --query "INSERT INTO tutorial.visits_v1 FORMAT TSV" --max_insert_block_size=100000 < visits_v1.tsv
由于此处我们需要将文件映射到容器内, 所以把容器删掉, 启动一个新的, 添加路径映射, 此时到启动命令改为:
# 增加了两个文件的映射路径到容器内的 /data
docker run -d --name clickhouse-server -v /data/demo/clickhouse/data:/data --ulimit nofile=262144:262144 clickhouse/clickhouse-server
# 由于之前没有映射 clickhouse 的数据文件到外部, 所以新建容器需要再建一次表, 见上面的 "建表"--> "这次我们依旧没有映射Clickhouse的数据映射"
# 数据导入
docker exec -it clickhouse-server bash
cd /data
# 建表
建表...
# 导入数据, 导入的过程还是挺快的
clickhouse-client --query "INSERT INTO tutorial.hits_v1 FORMAT TSV" --max_insert_block_size=100000 < hits_v1.tsv
clickhouse-client --query "INSERT INTO tutorial.visits_v1 FORMAT TSV" --max_insert_block_size=100000 < visits_v1.tsv
查询
导入数据成功后, 执行一个查询, 查询结果还是相当的快的.
SELECT
StartURL AS URL,
AVG(Duration) AS AvgDuration
FROM tutorial.visits_v1
WHERE StartDate BETWEEN '2014-03-23' AND '2014-03-30'
GROUP BY URL
ORDER BY AvgDuration DESC
LIMIT 10
集群安装
集群安装跟单机类似, 但是有一个不同的地方, 就是 metrika.xml 的配置文件, 该配置文件需要映射到容器内的 /etc/metrika.xml
<!-- 这里目前使用3分片, 1数据副本的情况, 如果是多副本, 则要在同一个 shard 下面添加该分片的其他副本 -->
<yandex>
<clickhouse_remote_servers>
<test_cluster_name>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>server01</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<internal_replication>true</internal_replication>
<host>server02</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>server03</host>
<port>9000</port>
</replica>
</shard>
</test_cluster_name>
</clickhouse_remote_servers>
<!--zookeeper相关配置-->
<zookeeper-servers>
<node index="1">
<host>zkServer01</host>
<port>2181</port>
</node>
<node index="2">
<host>zkServer02</host>
<port>2181</port>
</node>
<node index="3">
<host>zkServer03</host>
<port>2181</port>
</node>
</zookeeper-servers>
<!-- 以上的配置在多台服务器里面是一样的 -->
<!-- macros 配置在每个服务器上都不一样, 一般 shard 为分片序号, replica 为副本名称 -->
<!-- 因为这里是 3分片1副本, 所以其他两个的配置分别是 {shard=02, replica=server02}, {shard=03, replica=server03} -->
<macros>
<shard>01</shard>
<replica>server01</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>
在使用 ReplcatedMergeTree 表的时候, 就会用到 macros 的这几个属性
-- 建表语句
...
ENGINE = ReplcatedMergeTree(
'/clickhouse/tables/{shard}/hits',
'{replica}'
)
最后
本文是对 Clickhouse 入门的一个讲解, 还有其他的很多操作建议看 官方文档, 毕竟官方文档才是最权威的.
欢迎扫描下方二维码或搜索公众号 LemonCode , 一起交流!