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 , 一起交流!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值