ClickHouse实时分析(一)- ClickHouse入门

2023-11-18

原文地址:https://program-park.github.io/2022/03/21/clickhouse_1/

1. 什么是ClickHouse

  ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库(DBMS),使用 C++ 语言编写,主要用于在线分析处理查询(OLAP),能够使用 SQL 查询实时生成分析数据报告。

1.1 OLAP场景的关键特征

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

  很容易可以看出,OLAP 场景与其他通常业务场景(例如,OLTP 或 K/V)有很大的不同, 因此想要使用 OLTP 或 Key-Value 数据库去高效的处理分析查询场景,并不是非常完美的适用方案。例如,使用 OLAP 数据库去处理分析请求通常要优于使用 MongoDB 或 Redis 去处理分析请求。

1.2 列式数据库更适合OLAP场景的原因

  列式数据库更适合于 OLAP 场景(对于大多数查询而言,处理速度至少提高了 100 倍),下面通过图片详细解释原因:

  行式:
在这里插入图片描述
  列式:
在这里插入图片描述
  下面将详细介绍为什么会发生这种情况。

1.2.1 输入/输出

  • 针对分析类查询,通常只需要读取表的一小部分列。在列式数据库中你可以只读取你需要的数据。例如,如果只需要读取 100 列中的 5 列,这将帮助你最少减少 20 倍的 IO 消耗;
  • 由于数据总是打包成批量读取的,所以压缩是非常容易的。同时数据按列分别存储这也更容易压缩,这进一步降低了 IO 的体积;
  • 由于 IO 的降低,这将帮助更多的数据被系统缓存;

  例如,查询统计每个广告平台的记录数量需要读取广告平台ID这一列,它在未压缩的情况下需要 1 个字节进行存储。如果大部分流量不是来自广告平台,那么这一列至少可以以十倍的压缩率被压缩。当采用快速压缩算法,它的解压速度最少在十亿字节(未压缩数据)每秒。换句话说,这个查询可以在单个服务器上以每秒大约几十亿行的速度进行处理。这实际上是当前实现的速度。

1.2.2 CPU

  由于执行一个查询需要处理大量的行,因此在整个向量上执行所有操作将比在每一行上执行所有操作更加高效。同时这将有助于实现一个几乎没有调用成本的查询引擎。如果你不这样做,使用任何一个机械硬盘,查询引擎都不可避免的停止 CPU 进行等待。所以,在数据按列存储并且按列执行是很有意义的。
  有两种方法可以做到这一点:

  • 向量引擎:所有的操作都是为向量而不是为单个值编写的。这意味着多个操作之间的不再需要频繁的调用,并且调用的成本基本可以忽略不计。操作代码包含一个优化的内部循环;
  • 代码生成:生成一段代码,包含查询中的所有操作;

  这是不应该在一个通用数据库中实现的,因为这在运行简单查询时是没有意义的。但是也有例外,例如,MemSQL 使用代码生成来减少处理 SQL 查询的延迟(只是为了比较,分析型数据库通常需要优化的是吞吐而不是延迟)。
  为了提高 CPU 效率,查询语言必须是声明型的(SQL 或 MDX), 或者至少一个向量 (J, K)。 查询应该只包含隐式循环,允许进行优化。

2. ClickHouse的特点

2.1 列式存储

  以下面的表为例:

Id Name Age
1 张三 18
2 李四 22
3 王五 34
  • 采用行式存储时,数据在磁盘上的组织结构为:
1 张三 18 2 李四 22 3 王五 34

  好处是想查某个人所有的属性时,可以通过一次磁盘查找加顺序读取就可以。但是当想查所有人的年龄时,需要不停的查找,或者全表扫描才行,遍历的很多数据都是不需要的。

  • 采用列式存储时,数据在磁盘上的组织结构为:
1 2 3 张三 李四 王五 18 22 34

  这时想查所有人的年龄只需把年龄那一列拿出来就可以了。

  • 列式储存的好处:
    • 对于列的聚合,计数,求和等统计操作原因优于行式存储;
    • 由于某一列的数据类型都是相同的,针对于数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,大大提高了数据的压缩比重;
    • 由于数据压缩比更好,一方面节省了磁盘空间,另一方面对于 cache 也有了更大的发挥空间;

  在一个真正的列式数据库管理系统中,除了数据本身外不应该存在其他额外的数据。这意味着为了避免在值旁边存储它们的长度number,你必须支持固定长度数值类型。例如,10亿 个 UInt8 类型的数据在未压缩的情况下大约消耗 1GB 左右的空间,如果不是这样的话,这将对 CPU 的使用产生强烈影响。即使是在未压缩的情况下,紧凑的存储数据也是非常重要的,因为解压缩的速度主要取决于未压缩数据的大小。
  这是非常值得注意的,因为在一些其他系统中也可以将不同的列分别进行存储,但由于对其他场景进行的优化,使其无法有效的处理分析查询。例如:HBase,BigTable,Cassandra,HyperTable。在这些系统中,你可以得到每秒数十万的吞吐能力,但是无法得到每秒几亿行的吞吐能力。
  需要说明的是,ClickHouse 不单单是一个数据库, 它是一个数据库管理系统。因为它允许在运行时创建表和数据库、加载数据和运行查询,而无需重新配置或重启服务。

2.2 数据压缩

  在一些列式数据库管理系统中(例如:InfiniDB CE 和 MonetDB)并没有使用数据压缩。但是, 若想达到比较优异的性能,数据压缩确实起到了至关重要的作用。
  除了在磁盘空间和 CPU 消耗之间进行不同权衡的高效通用压缩编解码器之外,ClickHouse 还提供针对特定类型数据的专用编解码器,这使得 ClickHouse 能够与更小的数据库(如时间序列数据库)竞争并超越它们。
  更多信息可参考下方链接:https://clickhouse.com/docs/zh/sql-reference/statements/create/#create-query-specialized-codecs

2.3 数据的磁盘存储

  许多的列式数据库(如 SAP HANA,Google PowerDrill)只能在内存中工作,这种方式会造成比实际更多的设备预算。
  ClickHouse 被设计用于工作在传统磁盘上的系统,它提供每 GB 更低的存储成本,但如果可以使用 SSD 和内存,它也会合理的利用这些资源。

2.4 DBMS的功能

  数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS
  ClickHouse 支持一种基于 SQL 的声明式查询语言,它在许多情况下与ANSI SQL标准相同,几乎覆盖了标准 SQL 的大部分语法,包括 DDL 和 DML,以及配套的各种函数,用户管理及权限管理,数据的备份与恢复。
  更多信息可参考下方链接:https://clickhouse.com/docs/zh/sql-reference/
  ClickHouse SQL与 ANSI SQL 的兼容性可参考下方链接:https://clickhouse.com/docs/zh/sql-reference/ansi/

2.5 多样化引擎

  ClickHouse 和 MySQL 类似,把表级的存储引擎插件化,根据表的不同需求可以设定不同的存储引擎。目前包括合并树、日志、接口和其他四大类 20 多种引擎。

2.6 高吞吐写入能力

  ClickHouse 采用类LSM Tree的结构,数据写入后定期在后台 Compaction。通过类 LSM tree 的结构,ClickHouse 在数据导入时全部是顺序 append 写,写入后数据段不可更改,在后台 compaction 时也是多个段 merge sort 后顺序写回磁盘。顺序写的特性,充分利用了磁盘的吞吐能力,即便在 HDD 上也有着优异的写入性能。
  官方公开 benchmark 测试显示能够达到 50MB-200MB/s 的写入吞吐能力,按照每行 100Byte 估算,大约相当于 50W-200W条/s 的写入速度。

2.7 数据分区与线程级并行

  ClickHouse 将数据划分为多个 partition,每个 partition 再进一步划分为多个 index granularity(索引粒度),然后通过多个 CPU 核心分别处理其中的一部分来实现并行数据处理。在这种设计下,单条Query就能利用整机所有CPU。极致的并行处理能力,极大的降低了查询延时。
  所以,ClickHouse 即使对于大量数据的查询也能够化整为零平行处理。但是有一个弊端就是对于单条查询使用多 cpu,就不利于同时并发多条查询。所以对于高 qps 的查询业务, ClickHouse 并不是强项。

2.8 适合在线查询

  在线查询意味着在没有对数据做任何预处理的情况下以极低的延迟处理查询并将结果加载到用户的页面中。

2.9 支持近似计算

  ClickHouse 提供各种各样在允许牺牲数据精度的情况下对查询进行加速的方法:

  • 用于近似计算的各类聚合函数,如:distinct values, medians, quantiles;
  • 基于数据的部分样本进行近似查询。这时,仅会从磁盘检索少部分比例的数据;
  • 不使用全部的聚合条件,通过随机选择有限个数据聚合条件进行聚合。这在数据聚合条件满足某些分布条件下,在提供相当准确的聚合结果的同时降低了计算资源的使用;

2.10 Adaptive Join Algorithm

  ClickHouse 支持自定义 JOIN 多个表,它更倾向于散列连接算法,如果有多个大表,则使用合并-连接算法。
  更多信息参考下方链接:https://clickhouse.com/docs/zh/sql-reference/statements/select/join/

2.11 支持数据复制和数据完整性

  ClickHouse 使用异步的多主复制技术。当数据被写入任何一个可用副本后,系统会在后台将数据分发给其他副本,以保证系统在不同副本上保持相同的数据。在大多数情况下 ClickHouse 能在故障后自动恢复,在一些少数的复杂情况下需要手动恢复。
  更多信息参考下方链接:https://clickhouse.com/docs/zh/engines/table-engines/mergetree-family/replication/

2.12 角色的访问控制

  ClickHouse 使用 SQL 查询实现用户帐户管理,并允许角色的访问控制,类似于 ANSI SQL 标准和流行的关系数据库管理系统。
  更多信息参考下方链接:https://clickhouse.com/docs/zh/operations/access-rights/

2.13 性能对比

  单表查询:

在这里插入图片描述
  关联查询:

在这里插入图片描述
  结论:ClickHouse 像很多 OLAP 数据库一样,单表查询速度优于关联查询,而 ClickHouse 的两者差距更为明显。

2.14 ClickHouse的限制

  • 没有完整的事务支持;
  • 缺少高频率,低延迟的修改或删除已存在数据的能力。仅能用于批量删除或修改数据,但这符合 GDPR;
  • 稀疏索引使得 ClickHouse 不适合通过其键检索单行的点查询;

参考文献

  【1】https://clickhouse.com/docs/zh/
  【2】https://www.bilibili.com/video/BV1Yh411z7os?from=search&seid=4579023877699743987&spm_id_from=333.337.0.0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ClickHouse实时分析(一)- ClickHouse入门 的相关文章

  • 机器学习中的知识共享:模型与数据的交流与协作

    1 背景介绍 机器学习 Machine Learning 是一种通过数据学习模式和规律的计算机科学领域 在过去的几年里 机器学习技术在各个领域得到了广泛应用 如图像识别 自然语言处理 推荐系统等 随着数据规模的不断增长 单个机器学习模型的复
  • 【计算机毕业设计】个人日常事务管理系统

    进入21世纪网络和计算机得到了飞速发展 并和生活进行了紧密的结合 目前 网络的运行速度以达到了千兆 覆盖范围更是深入到生活中的角角落落 这就促使 管理系统的发展 管理系统可以实现远程处理事务 远程工作信息和随时追踪工作的状态 网上管理系统给
  • 【计算机毕业设计】航空信息管理系统

    传统信息的管理大部分依赖于管理人员的手工登记与管理 然而 随着近些年信息技术的迅猛发展 让许多比较老套的信息管理模式进行了更新迭代 飞机票信息因为其管理内容繁杂 管理数量繁多导致手工进行处理不能满足广大用户的需求 因此就应运而生出相应的航空
  • 2024年华数杯国际赛B题:光伏发电功率 思路模型代码解析

    2024年华数杯国际赛B题 光伏发电功率 Photovoltaic Power 一 问题描述 中国的电力构成包括传统能源发电 如煤 油和天然气 可再生能源发电 如水电 风能 太阳能和核能 以及其他形式的电力 这些发电模式在满足中国对电力的巨
  • python超详细基础文件操作【建议收藏】

    文章目录 前言 发现宝藏 1 文件操作 1 1 文件打开与关闭 1 1 1 打开文件 1 1 2 关闭文件 1 2 访问模式及说明 2 文件读写 2 1 写数据 write 2 2 读数据 read 2 3 读数据 readlines 2
  • 大数据毕业设计:python微博舆情分析系统+可视化+情感分析+爬虫+机器学习(源码)✅

    博主介绍 全网粉丝10W 前互联网大厂软件研发 集结硕博英豪成立工作室 专注于计算机相关专业 毕业设计 项目实战6年之久 选择我们就是选择放心 选择安心毕业 感兴趣的可以先收藏起来 点赞 关注不迷路 毕业设计 2023 2024年计算机毕业
  • 电商数据api拼多多接口获取商品实时数据价格比价api代码演示案例

    拼多多商品详情接口 接口接入入口 它的主要功能是允许卖家从自己的系统中快速获取商品详细信息 通过这个接口 卖家可以提取到商品的各类数据 包括但不限于商品标题 价格 优惠价 收藏数 下单人数 月销售量等 此外 还可以获取到商品的SKU图 详情
  • 扬帆证券:突发利好!外资重大转变,A股收到多份喜报

    A股财报季 利好音讯密集传来 1月16日晚间 A股多家上市公司披露了成绩预告 其间成绩预增 扭亏等利好公告数量占比超80 其间 普瑞眼科公告 估计2023年净赢利同比添加高达1163 98 1285 51 别的 多家上市公司公告称 估计20
  • 【计算机毕业设计】二手家电管理平台

    时代在飞速进步 每个行业都在努力发展现在先进技术 通过这些先进的技术来提高自己的水平和优势 二手家电管理平台当然不能排除在外 二手家电管理平台是在实际应用和软件工程的开发原理之上 运用java语言以及前台VUE框架 后台SpringBoot
  • 【计算机毕业设计】宝鸡文理学院学生成绩动态追踪系统

    研究开发宝鸡文理学院学生成绩动态追踪系统的目的是让使用者可以更方便的将人 设备和场景更立体的连接在一起 能让用户以更科幻的方式使用产品 体验高科技时代带给人们的方便 同时也能让用户体会到与以往常规产品不同的体验风格 与安卓 iOS相比较起来
  • 【ES6】解构语句中的冒号(:)

    在解构赋值语法中 冒号 的作用是为提取的字段指定一个新的变量名 让我们以示例 const billCode code version route query 来说明 billCode code version 表示从 route query
  • 2024 人工智能与大数据专业毕业设计(论文)选题指导

    目录 前言 毕设选题 选题迷茫 选题的重要性 更多选题指导 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生
  • 做测试不会 SQL?超详细的 SQL 查询语法教程来啦!

    前言 作为一名测试工程师 工作中在对测试结果进行数据比对的时候 或多或少要和数据库打交道的 要和数据库打交道 那么一些常用的sql查询语法必须要掌握 最近有部分做测试小伙伴表示sql查询不太会 问我有没有sql查询语法这一块的文档可以学习
  • 面试官问,如何在十亿级别用户中检查用户名是否存在?

    面试官问 如何在十亿级别用户中检查用户名是否存在 前言 不知道大家有没有留意过 在使用一些app注册的时候 提示你用户名已经被占用了 需要更换一个 这是如何实现的呢 你可能想这不是很简单吗 去数据库里查一下有没有不就行了吗 那么假如用户数量
  • Redis分布式锁--java实现

    文章目录 Redis分布式锁 方案 SETNX EXPIRE 基本原理 比较好的实现 会产生四个问题 几种解决原子性的方案
  • 温室气体排放更敏感的模型(即更高的平衡气候敏感性(ECS))在数年到数十年时间尺度上也具有更高的温度变化(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • 光波导结构

    摘要 增强现实和混合现实 AR MR 领域的新应用引起了人们对带有光栅区域的光波导系统的越来越多的关注 这些光波导系统用于输入和输出耦合以及扩瞳目的 VirtualLab Fusion为这类系统的仿真和设计提供了几个强大的工具 其中一个是具
  • 对中国手机作恶的谷歌,印度CEO先后向三星和苹果低头求饶

    日前苹果与谷歌宣布合作 发布了 Find My Device Network 的草案 旨在规范蓝牙追踪器的使用 在以往苹果和谷歌的生态形成鲜明的壁垒 各走各路 如今双方竟然达成合作 发生了什么事 首先是谷歌安卓系统的市场份额显著下滑 数年来
  • Python 使用 NoSQL 数据库的优选方案

    NoSQL 数据库因其高性能 可扩展性和灵活性而风靡一时 然而 对于 Python 程序员而言 选择合适的 NoSQL 数据库可能会令人困惑 因为有多种选择可供选择 那么 哪种 NoSQL 数据库最适合 Python 呢 2 解决方案 根据
  • 在 Spark 中将带有 MapType 列的 DataFrame 写入数据库

    我正在尝试使用 clickhouse native jdbc 驱动程序将带有 MapType 列的数据帧保存到 Clickhouse 架构中也包含地图类型列 并遇到以下错误 Caused by java lang IllegalArgume

随机推荐

  • 程序员应了解的那些事(5)C++迭代器之iterator_traits/iterator_category

    lt 1 gt traits 所谓traits 可以理解为 萃取机 作用就是 你丢给他什么东西 他会给你拿出你想要的特性 迭代器的特性 iterator traits lt gt lt 2 gt 迭代器的属性迭代器是沟通算法和容器的桥梁 一
  • 小程序获取链接中的参数

    onLoad function options if options null options undefined options sharetype null options sharetype gt 0 console log opti
  • 【Android入门到项目实战-- 7.3】—— 如何调用手机摄像头和相册

    目录 一 调用摄像头拍照 二 打开相册选择照片 学完本篇文章可以收获如何调用手机的摄像头和打开手机相册选择图片功能 一 调用摄像头拍照 先新建一个CameraAlbumTest项目 修改activity main xml 代码如下 按钮打开
  • 零基础学习hadoop到上手工作线路指导(不断更新)

    本帖最后由 pig2 于 2014 2 23 10 22 编辑 零基础学习hadoop 没有想象的那么困难 也没有想象的那么容易 在刚接触云计算 曾经想过培训 但是培训机构的选择就让我很纠结 所以索性就自己学习了 整个过程整理一下 给大家参
  • python处理excel数据

    文章目录 前言 一 用到的模块是什么 二 execl表格的样式 三 模块的使用 1 引入模块 2 读取excel表数据 3 将写入excel表 四 代码分析 1 代码逻辑 2 选出有用的股票号并与回报率关联 3 将全部数据按照所需要的股票号
  • safari无法打开网页是什么原因?mac上的Safari浏览器打不开网页怎么办?

    只要是MacOS系统的都会附带一个Safari浏览器 完美兼容Mac PC 及 iPod touch iPhone iPad 功能和性能自然是不错的 但是也会出现如safari浏览器无法打开网页的情况 那么safari无法打开网页是什么原因
  • 快速构建一个免费的IP代理池

    文章使用的代理ip链接为 云代理 http www ip3366 net stype 1 page 1 验证IP网站为 http http httpbin org ip get方式请求进去 要设置好请求头 cookie self faker
  • 2019上半年勒索病毒专题报告

    2019上半年由勒索病毒攻击造成的国内外大小事件 可发现伴随着传统行业逐渐数字化 网络化 智能化 逐步拥抱产业互联网化的大浪潮中 暴露出一系列网络安全问题 勒索病毒也乘机发难 疯狂敛财 影响日渐扩大 全球范围内的交通 能源 医疗等社会基础服
  • thinkpad计算机快捷键,Thinkpad笔记本键盘F1-F12功能键详细介绍

    Thinkpad笔记本电脑F1 F12快捷键的功能是什么 笔记本电脑F1 F12总共12个功能键 每个键的作用不一样 同一个键 不同机型的作用也不一样 通过这些快捷键可以快速调整音量 亮度 开启无线功能等等 Thinkpad笔记本电脑机型特
  • 看小白如何解决ajax跨域问题

    由于此前很少写前端的代码 哈哈 不合格的程序员啊 最近项目中用到json作为系统间交互的手段 自然就伴随着众多ajax请求 随之而来的就是要解决ajax的跨域问题 本篇将讲述一个小白从遇到跨域不知道是跨域问题 到知道是跨域问题不知道如何解决
  • elementui把上传的图片转为base64

    使用组件 然后on change绑定一个方法来获取文件信息 auto upload设置为false即可
  • 具有文件操作和滤波功能的Open3D软件界面(附python pyqt 代码)

    安装依赖 pip install pyqtgraph i https pypi tuna tsinghua edu cn simple pip install pyopengl i https pypi tuna tsinghua edu
  • python 100以内的质数

    可以使用for循环 求100以内的质数 i 2 for j in range 1 101 如果100以内的数字除以2的余数等于0 if j i 0 如果是就跳过 继续下一个循环 continue print j 要找出从1到100之间的质数
  • 在 Python 中打印变量之间没有空格

    文章目录 使用 sep 参数打印变量之间没有空格 使用加法 运算符打印不带空格的变量 在 Python 中不使用换行符或空格打印 使用格式化的字符串文字来打印没有空格的变量 例如 print f hello variable 1 格式化字符
  • oracle 重设redo log 和倒入

    重设redo log alter system set allow resetlogs corruption true scope spfile recover database until cancel using bakcup cont
  • [RK3288][Android6.0] 调试笔记 --- 系统第一次开机进入Recovery模式原因

    Platform ROCKCHIP OS Android 6 0 Kernel 3 10 92 描述 当系统全部download开机后 会默认进入Recovery模式 这个其实是misc分区里的内容在作怪 misc分区 misc img是R
  • String、StringBuffer、StringBuilder的区别

    转载 极客时间 JAVA核心技术36讲 https www cnblogs com ygj0930 p 6581009 html 一 String创建机制 JAVA语言在创建一个字符串时 首先检查池中是否有值相同的字符串对象 如果有则不需要
  • 朴素贝叶斯--matlab自带工具箱的使用

    朴素贝叶斯分类使用条件 其数据点的维数 即特征之间相互独立 当属性之间相关性较小时 分类效率好 当属性之间相关性较大时 分类不如决策树 属性之间的相关性获得 用协方差矩阵 matlab自带函数cov获得 1 nb NaiveBays fit
  • git pull时报错Filename too long

    在git bash窗口执行以下命令 全局设置git支持长文件名 git config global core longpaths true
  • ClickHouse实时分析(一)- ClickHouse入门

    目录 1 什么是ClickHouse 1 1 OLAP场景的关键特征 1 2 列式数据库更适合OLAP场景的原因 1 2 1 输入 输出 1 2 2 CPU 2 ClickHouse的特点 2 1 列式存储 2 2 数据压缩 2 3 数据的