Clickhouse基准测试实践
1.概述
本篇博客将对MySQL、InfluxDB、Clickhouse在写入时间、聚合查询时间、磁盘使用等方面的性能指标来进行比较。
2.内容
比较的数据集,是使用的Clickhouse官网提供的6600万的数据集来进行测试比较的,当MySQL、InfluxDB、Clickhouse也分配4CPU和16GB内存的资源时,Clickhouse完全是在导入速度、磁盘使用和查询性能等方面体现非常好的效果。结论如下所示:
MySQL | InfluxDB | Clickhouse | |
导入时间 | 70分钟 | 35分钟 | 70秒 |
磁盘占用空间 | 12.35GB | 5.9GB | 2.66GB |
全表count | 24366ms | 11674ms | 100ms |
全表max/min | 27023ms | 26829ms | 186ms |
全表求平均值 | 24841ms | 12043ms | 123ms |
全表求方差 | 24600ms | OOM | 113ms |
复杂查询1 | 30260ms | OOM | 385ms |
复杂查询2 | 470ms | 200ms | 8ms |
为了保证测试结果比较准确,上面的每条SQL至少执行10次,然后取中间值。其中InfluxDB的性能比预期差,甚至比MySQL差,这可能是由于数据样本和测试用例不合适InfluxDB场景造成的。
2.1 MySQL
MySQL是Oracle的产品,是目前最流行的关系型数据库管理系统之一。它使用的SQL语言是用于访问数据库的最常见的标准化语言。采用双授权策略,分为社区版和商业版。由于体积小、速度快、总体拥有成本低,尤其是其开源特性,一般选择MySQL作为中小型网站开发的网站数据库。
MySQL并不完美,但是它足够灵活,是架构中的最佳选择之一,并且在复杂的非单一项目中总能拥有一席之地。
2.2 InfluxDB
InfluxDB是InfluxData开发的开源时序数据库,专注于海量时序数据的高性能读、高性能写、高效存储和实时分析。在数据库引擎排名时序数据库中,它位居第一,广泛应用与开发运维监控、物联网监控、实时分析等场景。
传统数据库通常记录数据的当前值,而时序数据库记录所有历史数据。在处理当前时序数据时,必须不断接收新的时序数据。同时,时序数据的查询始终是基于时间的。它重点解决以下海量数据场景:
- 时序数据的写入:如何支持每条千万条数据的写入;
- 时序数据的读取:如何支持每条千万条数据的聚合查询;
- 成本问题:海量数据存储带来的成本问题,如何以更低的成本存储这些数据。
2.3 Clickhouse
Clickhouse是由Yandex开源的基于列存储的数据库,用于实时数据分析,其处理数据的速度比传统方法快100~1000倍。Clickhouse优于当前市场上类似的面向列的DBMS,每台服务器每秒处理数亿到超过10亿行和超过10GB的数据。
它是一个用于在线分析(OLAP)的列式数据库管理系统(DBMS),对OLTP和OLAP的做如下区别介绍:
- OLTP:它是一个传统的关系型数据库,主要操作增删改查,强调交易一致性,比如银行系统、电子商务系统等;
- OLAP:是一个仓库型的数据库,主要用于读取数据,做复杂的数据分析,专注于技术决策支持,提供直观简单的结果。
Clickhouse用于OLAP的适用场景如下:
- 读取多于写入;
- 一个大的宽表读取大量的行和很少的列,同时导入较小的结果集;
- 数据时分批写入的,数据不更新或者更新频率很低;
- 无需事务,数据一致性要求较低;
- 灵活多变,不适合模型预构建(类似Kylin的Cube)
3.测试数据准备
直接使用Clickhouse提供的测试数据地址:https://clickhouse.com/docs/en/getting-started/example-datasets/opensky/,这个数据集中的数据是从完整的OpenSky数据集中导出和清洗过的。
该数据集涵盖了自2019年1月1日以来,该网络2500多名成员看到的所有航班信息。
3.1 下载数据
执行如下命令:
wget -O- https://zenodo.org/record/5092942 | grep -oP 'https://zenodo.org/record/5092942/files/flightlist_\d+_\d+\.csv\.gz' | xargs wget
在互联网连接良好的情况下,下载大约需要 2 分钟。共有 30 个文件,总大小为 4.3 GB。
3.2 创建表Clickhouse
执行如下SQL命令:
CREATE TABLE opensky
(
callsign String,
number String,
icao24 String,
registration String,
typecode String,
origin String,
destination String,
firstseen DateTime,
lastseen DateTime,
day DateTime,
latitude_1 Float64,
longitude_1 Float64,
altitude_1 Float64,
latitude_2 Float64,
longitude_2 Float64,
altitude_2 Float64
) ENGINE = MergeTree ORDER BY (origin, destination, callsign);
3.2.1 导入数据
将数据导入到Clickhouse中,执行如下所示命令:
ls -1 flightlist_*.csv.gz | xargs -P100 -I{} bash -c 'gzip -c -d "{}" | clickhouse-client --date_time_input_format best_effort --query "INSERT INTO opensky FORMAT CSVWithNames"'
- 在这里,我们将文件列表 ( ls -1 flightlist_*.csv.gz)传递xargs给以进行并行处理。 xargs -P100指定最多使用 100 个并行工作器,但由于我们只有 30 个文件,工作器的数量将只有 30 个;
- 对于每个文件,xargs将运行一个带有bash -c. 该脚本以 of 的形式进行替换,{}并且该xargs命令将文件名替换为它(我们已经要求它xargs使用-I{});
- 该脚本会将文件 ( gzip -c -d "{}") 解压缩到标准输出 (-c参数) 并将输出重定向到clickhouse-client
- 我们还要求使用扩展解析器 ( --date_time_input_format best_effort ) 解析DateTime字段,以识别具有时区偏移的 ISO-8601 格式
最后,clickhouse-client会做插入。它将以CSVWithNames格式读取输入数据。并行上传需要 24 秒。如果不想使用并行上传,还可以使用顺序上传,可能需要的时间长一点,大概 75 秒,具体执行命令如下:
for file in flightlist_*.csv.gz; do gzip -c -d "$file" | clickhouse-client --date_time_input_format best_effort --query "INSERT INTO opensky FORMAT CSVWithNames"; done
完整代码如下:
$ clickhouse-client
$ create database test;
$ use test;
$ CREATE TABLE opensky(callsign String,number String,icao24 String,registration String,typecode String,origin String,destination String,firstseen DateTime,lastseen DateTime,day DateTime,latitude_1 Float64,longitude_1 Float64,altitude_1 Float64,latitude_2 Float64,longitude_2 Float64,altitude_2 Float64) ENGINE = MergeTree ORDER BY (origin, destination, callsign);
$ exit # Import data (about 75 seconds)
$ cd /tmp/flightlist
$ for file in flightlist_*.csv; do cat "$file" | clickhouse-client --date_time_input_format best_effort --query "INSERT INTO test.opensky FORMAT CSVWithNames"; done # Check if the data was imported successfully
$ clickhouse-client
$ SELECT count() FROM test.opensky;
3.3 创建MySQL
完整代码如下:
# Link MySQL to build database and table
$ mysql -uroot -p123456
$ use test;
$ CREATE TABLE `opensky` (`callsign` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,`number` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,`icao24` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,`registration` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,`typecode` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,`origin` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,`destination` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,`firstseen` datetime DEFAULT NULL,`lastseen` datetime DEFAULT NULL,`day` datetime DEFAULT NULL,`latitude_1` double DEFAULT NULL,`longitude_1` double DEFAULT NULL,`altitude_1` double DEFAULT NULL,`latitude_2` double DEFAULT NULL,`longitude_2` double DEFAULT NULL,`altitude_2` double DEFAULT NULL,KEY `idx_callsign` (`callsign`),KEY `idx_origin` (`origin`),KEY `idx_destination` (`destination`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; # Import data (about 70 minutes)
$ load data local infile 'flightlist_20190101_20190131.csv' into table opensky character set utf8mb4 fields terminated by ',' lines terminated by '\n' ignore 1 lines;
# Omit the other 29 import commands:load data local infile 'flightlist_*_*.csv' into table opensky character set utf8mb4 fields terminated by ',' lines terminated by '\n' ignore 1 lines; # Check if the data was imported successfully
$ select count(*) from test.opensky;
3.4 创建InfluxDB
完整代码如下:
# Import data (about 30 minutes)
$ influx -username 'admin' -password 'admin123456' -import -path=/tmp/flightlist/flightlist_20190101_20190131.txt -precision=ns;
# Omit the other 29 import commands:influx -username 'admin' -password 'admin123456' -import -path=/tmp/flightlist/flightlist_*_*.txt -precision=ns; # Check if the data was imported successfully
$ influx -username 'admin' -password 'admin123456'
$ select count(latitude_1) from test.autogen.opensky;
4.测试场景
4.1 MySQL测试维度
从不同的维度,对MySQL来进行测试,具体实现代码如下所示:
$ mysql -uroot -p123456
$ use test;
-- Enable performance analysis
set profiling = 1;
-- query disk space
select table_rows as `total_lines`, (data_length + index_length)/1024/1024/1024 as `disk_usage(G)` from information_schema.`TABLES` where table_name = 'opensky';
-- full table count
select count(latitude_1) from opensky;
-- full table max/min
select max(longitude_1),min(altitude_1) from opensky;
-- full table average
select avg(latitude_2) from opensky;
-- full table variance
select var_pop(longitude_2) from opensky;
-- Complex query 1: Aggregate query of multiple fields in the whole table
select count(latitude_1),max(longitude_1),min(altitude_1),avg(latitude_2) from opensky;
-- Complex query 2: Number of flights departing from the three main Moscow airports
SELECT origin, count(1) AS c FROM opensky WHERE origin IN ('UUEE', 'UUDD', 'UUWW') GROUP BY origin;
-- output analysis results
show profiles;
4.2 InfluxDB测试维度
从不同的维度,对InfluxDB来进行测试,具体实现代码如下所示:
$ influx -username 'admin' -password 'admin123456'
$ use test;
-- Time-consuming statistics,queryReqDurationNs is the cumulative query time, and the subtraction of the time of the two tasks is the time-consuming
select queryReq,queryReqDurationNs/1000/1000,queryRespBytes from _internal."monitor".httpd order by time desc limit 10;
-- query disk space
select sum(diskBytes) / 1024 / 1024 /1024 from _internal."monitor"."shard" where time > now() - 10s group by "database";
-- full table count
select count(latitude_1) from opensky;
-- full table max/min
select max(longitude_1),min(altitude_1) from opensky;
-- full table average
select mean(latitude_2) from opensky;
-- full table variance
select stddev(longitude_2) from opensky;
-- Complex query 1: Aggregate query of multiple fields in the whole table
select count(latitude_1),max(longitude_1),min(altitude_1),mean(latitude_2) from opensky;
-- Complex query 2: Number of flights departing from the three main Moscow airports
SELECT count(latitude_1) AS c FROM opensky WHERE origin =~/^UUEE|UUDD|UUWW$/ GROUP BY origin;
4.3 Clickhouse测试维度
从不同的维度,对Clickhouse来进行测试,具体实现代码如下所示:
$ clickhouse-client
$ use test;
-- Time-consuming statistics
select event_time_microseconds,query_duration_ms,read_rows,result_rows,memory_usage,query from system.query_log where query like '%opensky%' and query_duration_ms <> 0 and query not like '%event_time_microseconds%' order by event_time_microseconds desc limit 5;
-- query disk space
SELECT formatReadableSize(total_bytes) FROM system.tables WHERE name = 'opensky';
-- full table count
select count(latitude_1) from opensky;
-- full table max/min
select max(longitude_1),min(altitude_1) from opensky;
-- full table average
select avg(latitude_2) from opensky;
-- full table variance
select var_pop(longitude_2) from opensky;
-- Complex query 1: Aggregate query of multiple fields in the whole table
select count(latitude_1),max(longitude_1),min(altitude_1),avg(latitude_2) from opensky;
-- Complex query 2: Number of flights departing from the three main Moscow airports
SELECT origin, count() AS c FROM opensky WHERE origin IN ('UUEE', 'UUDD', 'UUWW') GROUP BY origin;
5.为什么Clickhouse这么快
5.1 列式存储
- 数据存储在列中,数据就是索引;
- 查询只访问涉及的列,减少了系统 I/O;
- 每列由一个线程处理,有效利用 CPU 资源;
- 它还为矢量化执行奠定了基础。
5.2 数据压缩
数据压缩的本质是按照一定的步长对数据进行匹配扫描,发现重复数据时进行编码转换。
因为是列式存储,数据特性非常相似,所以数据中存在很多重复,压缩率越高,数据量越小,磁盘I/O压力越低,网络传输越快。
5.3 矢量化执行引擎
单指令多数据是指一条指令操作多条数据。是通过数据并行来提高性能的一种方式,可以简单理解为程序中数据在寄存器级别的并行处理。
Clickhouse 广泛使用 SIMD 来提高计算效率。通过使用SIMD,基本上可以带来数倍的性能提升。
5.4 多线程和分布式
分布式领域有个规律,计算移动比数据移动更划算,这就是它的核心。
数据的计算直接发送到数据所在的服务器,进行多机并行处理,然后将最终结果汇总在一起。
此外,ClickHouse 还通过线程级并行进一步提高效率,充分利用服务器资源。
5.5 各种表引擎
MergeTree 存储结构对写入的数据进行排序,然后有序存储。有序存储有两个主要优点:
- 对列存文件进行分块压缩时,排序键中的列值是连续的或重复的,这样列存分块中的数据才能得到最终的压缩比。
- 存储顺序本身可以加快查询的索引结构。根据排序键中列的等价条件或范围条件,我们可以快速找到目标的大致位置范围,而且这种索引结构不会产生额外的存储开销。
MergeTree 是 ClickHouse 表引擎中的核心引擎。其他引擎基于 MergeTree 引擎,在数据合并过程中实现不同的特性,从而形成 MergeTree 表引擎家族。
6.总结
Clickhouse的优缺点如下:
- 优势:极致的查询分析性能、低存储成本、高吞吐数据写入、多样化的表引擎、完备的DBMS功能。
- 缺点:不支持事务,不支持真正的删除/更新,分发能力弱;不支持高并发,官方推荐100 QPS。
对于非标准的SQL,join的实现比较特殊,性能不好;频繁的小批量数据操作会影响查询性能。目前还没有可以满足各种场景需求的OLAP引擎。本质原因是没有一个系统可以同时在查询效率、及时性和可维护性方面做到完美。只能说ClickHouse是为了极致的查询性能。做了一些取舍。ClickHouse 的优缺点是显而易见的。是否采用取决于与实际业务场景的契合度。适合你的架构是最好的架构。
7.结束语
这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!
另外,博主出书了《Kafka并不难学》和《Hadoop大数据挖掘从入门到进阶实战》,喜欢的朋友或同学, 可以在公告栏那里点击购买链接购买博主的书进行学习,在此感谢大家的支持。关注下面公众号,根据提示,可免费获取书籍的教学视频。
Clickhouse基准测试实践的更多相关文章
- 字节跳动基于ClickHouse优化实践之“多表关联查询”
更多技术交流.求职机会.试用福利,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 相信大家都对大名鼎鼎的ClickHouse有一定的了解了,它强大的数据分析性能让人印象深刻.但在字节大量 ...
- clickhouse在风控-风险洞察领域的探索与实践
一.风险洞察平台介绍 以Clickhouse+Flink实时计算+智能算法为核心架构搭建的风险洞察平台, 建立了全面的.多层次的.立体的风险业务监控体系,已支撑欺诈风险.信用风险.企业风险.小微风险. ...
- Clickhouse副本表以及分布式表简单实践
集群配置: 192.168.0.106 node3 192.168.0.101 node2 192.168.0.103 node1 zookeeper配置忽略,自行实践! node1配置: <? ...
- 从 ClickHouse 到 ByteHouse:实时数据分析场景下的优化实践
本文来自火山引擎公众号,原文发布于2021-09-06. 近日,字节跳动旗下的企业级技术服务平台火山引擎正式对外发布「ByteHouse」,作为 ClickHouse 企业版,解决开源技术上手难 &a ...
- ClickHouse在大数据领域应用实践
一.序言 面向大数据量查询数据库,优点是在较大数据量(千万级)的前提下具有较好的查询性能. 1.应用场景 ClickHouse应用于OLAP(在线分析处理)领域,具体来说满足如下特点使用此技术比较合适 ...
- JuiceFS 在 Elasticsearch/ClickHouse 温冷数据存储中的实践
企业数据越存越多,存储容量与查询性能.以及存储成本之间的矛盾对于技术团队来说是个普遍难题.这个难题在 Elasticsearch 与 ClickHouse 这两个场景中尤为突出,为了应对不同热度数据对 ...
- Flink 实践教程:入门(6):读取 PG 数据写入 ClickHouse
作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接.亚 ...
- ClickHouse与Elasticsearch压测实践
1 需求分析 1.1 分析压测对象 1)什么是ClickHouse 和Elasticsearch ClickHouse 是一个真正的列式数据库管理系统(DBMS).在 ClickHouse 中,数据始 ...
- 【MySQL】容器集群支持数据库实践
京东容器数据库系统,管理1800台物理计算节点,生产1W+ 多MySQL Docker容器实例.架构简单可靠,Docker容器计算平台与MySQL集群管理平台解耦处理.为描述方便,京东容器化数据库系统 ...
随机推荐
- VM Ware 给Centos虚拟机配置静态IP
前言:在大家的日常运维工作中,肯定多多少少都会用到虚拟机,但是默认情况下VMware创建的虚拟机每次启动都有可能更换IP这就对我们的工作造成了一定的麻烦,下面我就给大家介绍下,如何给centos虚拟机 ...
- 基于InsightFace的高精度人脸识别,可直接对标虹软
一.InsightFace简介 InsightFace 是一个 2D/3D 人脸分析项目.InsightFace 的代码是在 MIT 许可下发布的. 对于 acadmic 和商业用途没有限制. 包含注 ...
- DNS 系列(一):为什么更新了 DNS 记录不生效?
我们在上网时如果想要访问到另一台机器上的内容,通常只需要直接输入一串地址,例如:www.upyun.com,就能够准确访问到自己想要访问的网站.但是实际上这只是方便我们记忆的字符形式网络标识,真正让我 ...
- 注意力机制最新综述:A Comprehensive Overview of the Developments in Attention Mechanism
(零)注意力模型(Attention Model) 1)本质:[选择重要的部分],注意力权重的大小体现选择概率值,以非均匀的方式重点关注感兴趣的部分. 2)注意力机制已成为人工智能的一个重要概念,其在 ...
- 攻防世界MISC—进阶区11-20
11.János-the-Ripper 得到未知类型的文件,010 Editor打开后看到pk,得知是真加密的zip文件. 密码在文件中没有提示,根据题目名字,János-the-Ripper Ján ...
- Webpack干货系列 | 怎么运用 Webpack 5 处理css/scss/sass、less、stylus样式资源
程序员优雅哥简介:十年程序员,呆过央企外企私企,做过前端后端架构.分享vue.Java等前后端技术和架构. 本文摘要:主要讲解webpack 5 如何高效处理CSS 资源.scss/sass 资源.l ...
- AtCoder Beginner Contest 261E // 按位思考 + dp
题目链接:E - Many Operations (atcoder.jp) 题意: 给定一个数x,以及n个操作(ti,ai): 当 t = 1 时,将 x & a 当 t = 2 时,将 x ...
- Windows环境安装Hadoop环境
1,下载Hadoop,解压 2,配置Hadoop环境变量 右键此电脑--属性 高级系统设置 环境变量 新建一个HADOOP_HOME 添加到path 3,cmd窗口查看安装情况:hadoop vers ...
- 基于mpvue的框架开发微信小程序(搭建环境)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_103 美团很早就开源了mpvue这个项目,如此看来,美团可不仅仅是一家团购网站,真正的技术驱动型企业,使得我们多了一种用来开发微信 ...
- 见微知著,细节上雕花:SVG生成矢量格式网站图标(Favicon)探究
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_215 Favicon是favorites icon的缩写,也被称为website icon(站点图标).page icon(页面图 ...