基本介绍

什么是ClickHouse? | ClickHouse文档
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。

  1. 向量引擎:所有的操作都是为向量而不是为单个值编写的。这意味着多个操作之间的不再需要频繁的调用,并且调用的成本基本可以忽略不计。操作代码包含一个优化的内部循环。(利用 了CPU的SIMD能力https://zhuanlan.zhihu.com/p/31271788)
  2. 代码生成:生成一段代码,包含查询中的所有操作。

OLAP场景

  • 绝大多数是读请求
  • 数据以相当大的批次(> 1000行)更新,而不是单行更新;或者根本没有更新。
  • 已添加到数据库的数据不能修改。
  • 对于读取,从数据库中提取相当多的行,但只提取列的一小部分。
  • 宽表,即每个表包含着大量的列
  • 查询相对较少(通常每台服务器每秒查询数百次或更少)
  • 对于简单查询,允许延迟大约50毫秒
  • 列中的数据相对较小:数字和短字符串(例如,每个URL 60个字节)
  • 处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行)
  • 事务不是必须的
  • 对数据一致性要求低
  • 每个查询有一个大表。除了他意以外,其他的都很小。
  • 查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的RAM中

    Mac下用Docker安装ClickHouse(单机)**

    参考:

  • https://www.jianshu.com/p/362252f2284b

  • https://clickhouse.tech/docs/en/getting-started/install/#from-docker-image

    1.安装docker

    1. brew install cask docker

2.配置镜像加速

{
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "registry-mirrors": ["http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"]
}

3.安装click-house image

docker pull yandex/clickhouse-client
docker pull yandex/clickhouse-server

4.运行click house server镜像

docker run -d --name ch-server --ulimit nofile=262144:262144 -p 8123:8123 -p 9000:9000 -p 9009:9009 yandex/clickhouse-server

查看正在运行的docker容器
docker ps -a

5.进入容器

docker exec -it 82098fd75c60 /bin/bash

6.进入clickhouse-client命令行

clickhouse-client

基本操作

创建分布式视图

CREATE
    TABLE IF NOT EXISTS datamill_v5.app_dm_cate_4a_layout_profile_v5_d on cluster conf_2shard_5replica AS datamill_v5.app_dm_cate_4a_layout_profile_v5 ENGINE = Distributed
    (
         conf_2shard_5replica #cluster name,
         datamill_v5 // database name,
         app_dm_user_profile_v3 //table name,
         cateCode  
    )

创建分布式表

CREATE TABLE datamill_v5.app_dm_cate_4a_chain_flow_profile_v5 on cluster conf_2shard_5replica (
  processDate Date,
  cateCode Int32,
  startStatus Int32,
  endStatus Int32,
  tagName String,
  tagValue String,
  audienceNum Int64,
  logicDt Int64,
  startDate String,
  endDate String,
  cateType Int32
) ENGINE = ReplicatedMergeTree('/sfck02.jd.local/tables/datamill_v5/app_dm_cate_4a_chain_flow_profile_v6/{shard}', '{replica}') 
PARTITION BY (processDate, cateType) 
ORDER BY (processDate, cateCode) SETTINGS index_granularity = 8192

连接集群的每一个节点创建表

#!/usr/bin/env bash
basePath=$(cd `dirname $0`;pwd)
. ${basePath}/common.sh
init_env "04"
get_ip_list_exit_code=$?
check_env ${get_ip_list_exit_code}
statment=$1
echo $statment
echo "------------"
for i in `cat ${basePath}/ip.list`
do
{
echo $i
echo "$statment" | curl  "url" -d @-
}&
wait
done

查看集群中表的大小

SELECT table, formatReadableSize(size) as size, rows, days, formatReadableSize(avgDaySize) as avgDaySize FROM (
    SELECT
        table,
        sum(bytes) AS size,
        sum(rows) AS rows,
        min(min_time) AS min_time,
        max(max_time) AS max_time,
        toUInt32((max_time - min_time) / 86400) AS days,
        size / ((max_time - min_time) / 86400) AS avgDaySize
    FROM system.parts
    WHERE active
    GROUP BY table
    ORDER BY rows DESC
)
SELECT 
    partition AS `分区`,
    sum(rows) AS `总行数`,
    formatReadableSize(sum(data_uncompressed_bytes)) AS `原始大小`,
    formatReadableSize(sum(data_compressed_bytes)) AS `压缩大小`,
    round((sum(data_compressed_bytes) / sum(data_uncompressed_bytes)) * 100, 0) AS `压缩率`
FROM system.parts
WHERE table IN ('app_dm_rt_ord_status')
GROUP BY partition
ORDER BY partition ASC

查看集群中的机器信息

select * from system.clusters;