基本介绍
什么是ClickHouse? | ClickHouse文档
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。
- 向量引擎:所有的操作都是为向量而不是为单个值编写的。这意味着多个操作之间的不再需要频繁的调用,并且调用的成本基本可以忽略不计。操作代码包含一个优化的内部循环。(利用 了CPU的SIMD能力https://zhuanlan.zhihu.com/p/31271788)
- 代码生成:生成一段代码,包含查询中的所有操作。
OLAP场景
- 绝大多数是读请求
- 数据以相当大的批次(> 1000行)更新,而不是单行更新;或者根本没有更新。
- 已添加到数据库的数据不能修改。
- 对于读取,从数据库中提取相当多的行,但只提取列的一小部分。
- 宽表,即每个表包含着大量的列
- 查询相对较少(通常每台服务器每秒查询数百次或更少)
- 对于简单查询,允许延迟大约50毫秒
- 列中的数据相对较小:数字和短字符串(例如,每个URL 60个字节)
- 处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行)
- 事务不是必须的
- 对数据一致性要求低
- 每个查询有一个大表。除了他意以外,其他的都很小。
查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的RAM中
Mac下用Docker安装ClickHouse(单机)**
参考:
- https://clickhouse.tech/docs/en/getting-started/install/#from-docker-image
1.安装docker
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;