ClickHouse简介

OLAP与ClickHouse的定位

OLAP的核心概念

  • OLTP:服务于高并发、低延迟的短事务操作(如银行转账、订单支付),强调数据的增删改查(CRUD)和事务一致性(ACID)。

  • OLAP:专注于大规模数据的复杂聚合分析(如统计报表多维分析),要求高吞吐/性能的批量查询,通常涉及全表扫描和多表关联。

  • OLAP的典型特征

    • 数据量大:TB/PB级数据存储。
    • 查询复杂:涉及GROUP BY、JOIN、窗口函数等聚合操作。
    • 读多写少:数据批量写入,极少单行更新。
    • 高吞吐低延迟:即使数据量极大,仍需快速响应分析请求。

ClickHouse的定位

  • 列式存储的极致优化

    • 列式存储:数据按列而非行存储,同一列的数据类型相同,天然适合高压缩率(如LZ4、ZSTD算法),减少I/O和内存占用。
    • 向量化查询:利用SIMD指令集(单指令多数据)对整列数据进行批量处理,大幅提升CPU利用率。
    • 数据预聚合:通过MergeTree引擎的预排序(Primary Key)、跳数索引(Skipping Index)和物化视图(Materialized View)加速聚合查询。
  • 分布式架构的天然支持

    • 分片与副本:数据可水平分片(Sharding)存储,副本(Replication)机制通过ZooKeeper协调实现高可用。
    • 分布式查询:支持跨节点并行执行查询,自动路由和合并结果,用户无需感知分片细节。
  • 实时分析能力

    • 高写入吞吐:通过类LSM-Tree(Log-Structured Merge-Tree)结构实现高效写入(如批量插入、后台合并)。
    • 准实时查询:数据写入后通常在毫秒到秒级即可查询,适合实时报表和监控场景。
  • 灵活性不足但性能优先

    • 牺牲事务支持:不支持ACID事务,不适合需要强一致性的OLTP场景。
    • 弱化单点更新:单行更新(UPDATE/DELETE)效率低,需通过ALTER TABLE实现批量更新。
    • 复杂JOIN的局限:大表JOIN性能较差,建议通过预计算或宽表规避。

ClickHouse与其他OLAP技术的对比

技术/产品核心优势局限性适用场景
ClickHouse 极致查询性能、高压缩率、实时分析 JOIN能力弱、事务支持差 实时日志分析、用户行为分析
Apache Hive 生态完善、兼容Hadoop 延迟高(分钟级)、依赖MapReduce/Tez 离线批处理、数据仓库
Apache Druid 高并发低延迟、时间序列优化 架构复杂、存储成本高 实时监控、事件驱动分析
Elasticsearch 全文检索、近实时查询 聚合性能差、存储成本高 日志检索、文本分析
Snowflake 全托管、弹性扩展、多云支持 成本高昂、定制化能力弱 企业级云数仓

ClickHouse的诞生背景与核心优势

诞生背景

  • 初衷是为了解决其内部海量数据分析的瓶颈。
  • 核心业务(如搜索引擎、广告系统、用户行为分析)需要实时处理PB级数据。
  • 传统数据库(如MySQL)和Hadoop生态工具(如Hive)无法满足低延迟、高吞吐的分析需求。

核心优势

  • 列式存储与高效压缩:数据按列存储,同类型数据紧密排列,压缩率极高(节省存储和I/O),适合聚合查询(仅读取相关列)。
  • 向量化查询引擎:利用CPU的SIMD指令并行处理整列数据,大幅提升计算效率(相比逐行处理)。
  • 分布式架构:天然支持分片和副本,数据可水平扩展,查询自动并行化,轻松应对PB级数据。
  • 实时写入与查询:写入吞吐高(百万级/秒),数据写入后毫秒级可查,支持实时分析场景(如监控、日志)。
  • 高性能聚合计算:预排序、跳数索引、物化视图等机制,复杂聚合(GROUP BY、窗口函数)比传统数据库快10-100倍。
  • 易用性与SQL兼容:支持标准SQL语法,学习成本低,且提供丰富扩展函数(如近似计算、地理数据处理)。
  • 开源与社区生态:完全开源,社区活跃,支持与Kafka、Hadoop、Spark等工具无缝集成。

ClickHouse的适用场景与局限性

ClickHouse的适用场景

  • 实时日志分析:Nginx访问日志、应用错误日志的实时聚合统计(PV/UV、错误率)。
  • 用户行为分析:用户点击流分析、漏斗转化计算、留存率统计。
  • 时序数据存储与监控:物联网(IoT)设备指标、服务器性能监控(Prometheus长期存储替代)。
  • 大数据实时报表:电商实时销售额看板、广告点击效果分析(支持TB级数据秒级响应)。
  • 联机分析处理(OLAP) :复杂聚合查询(GROUP BY、窗口函数)、多维数据分析。

ClickHouse的局限性

  • 不适用于OLTP场景:不支持事务(ACID)、高并发单行更新/删除效率极低。
  • 不适合频繁单行更新/删除:数据更新需通过批量ALTER TABLE实现,延迟高。
  • JOIN性能较弱:大表JOIN容易成为性能瓶颈,建议预计算宽表或使用非规范化设计。
  • 高并发点查询支持有限:默认设计面向高吞吐分析查询,单点查询(如按主键查单行)性能不如MySQL/Redis。
  • 存储成本与数据冷热分离:全量数据存储成本较高,需自行管理冷热数据分层(如结合S3)。

数据类型与表引擎简介

数据类型

  • 基础类型

    类别类型示例描述
    整数 Int8, UInt32 有符号/无符号整数(位数可选8/16/32/64),如UInt32表示0~4294967295。
    浮点数 Float32, Float64 单精度(32位)和双精度(64位)浮点数。
    字符串 String, FixedString(N) String存储任意长度文本,FixedString(N)定长字符串(适合枚举值,如国家代码)。
    日期时间 Date, DateTime Date精确到天(如2023-10-01),DateTime精确到秒(如2023-10-01 10:00:00)。
    布尔值 Bool 实际存储为UInt8(0或1),但支持true/false语法。
    枚举 Enum8, Enum16 预定义值的字符串映射(如Enum8('success' = 1, 'fail' = 2)),节省存储空间。
  • 复合类型

    类型描述
    Array(T) 同类型元素数组(如Array(String)存储多个字符串)。
    Tuple(T1, T2) 异构元素的元组(如Tuple(String, UInt32)存储名称和年龄)。
    Nested 嵌套表结构(类似子表),需与Array结合使用(如Nested(tag String, value Float64))。
  • 特殊类型

    类型描述
    LowCardinality 低基数优化类型(如重复值多的字符串字段),自动压缩存储(类似字典编码)。
    Decimal(P, S) 高精度浮点数(如Decimal(18, 4)表示小数点后4位,适合金融金额)。
    UUID 128位全局唯一标识符(如UUID类型存储设备ID)。
    IPv4/IPv6 优化存储IP地址(IPv4UInt32IPv6FixedString(16))。

表引擎

  • 基础引擎

    引擎特点
    TinyLog 无索引,数据不压缩,适用于小表或临时测试(写入后不可修改)。
    Log 按列存储,支持并行查询,适合中等规模静态数据(写入后不可修改)。
    Memory 数据仅存储在内存中,重启后丢失,适合高速缓存或中间结果暂存。
  • MergeTree引擎家族

    引擎特点
    MergeTree 基础引擎,支持主键索引、数据分区(PARTITION BY)和后台合并(Merge)。
    ReplacingMergeTree 在MergeTree基础上,自动去重相同排序键的数据(保留最后写入版本)。
    SummingMergeTree 自动合并时对数值列求和(如统计相同维度的指标累加)。
    AggregatingMergeTree 合并时预聚合数据,需配合AggregateFunction类型使用,适合实时OLAP。
    CollapsingMergeTree 通过标记字段(sign)合并时折叠数据(如删除旧版本记录)。
    VersionedCollapsingMergeTree 在折叠基础上支持版本控制(如按时间戳保留最新状态)。
  • 集成引擎

    引擎特点
    Kafka 从Kafka主题消费数据(需指定Broker、Topic和格式),实时写入ClickHouse。
    MySQL 映射MySQL表到ClickHouse(类似外部表),支持读写操作(但性能不如原生表)。
    HDFS 直接读取HDFS文件(如Parquet/ORC格式),适合离线分析。
    JDBC/ODBC 通过JDBC或ODBC协议连接外部数据库(如PostgreSQL)。

引擎选择

  • 默认选择:优先使用MergeTree系列引擎(90%场景适用)。
  • 实时聚合AggregatingMergeTree + 物化视图实现预计算。
  • 外部数据:临时分析使用MySQLHDFS引擎,长期存储建议导入本地表。
  • 日志场景:高吞吐写入选择MergeTree,小数据量测试用TinyLog
全部评论

相关推荐

1.Spark架构1、使用spark-submit命令提交Spark作业时,如果指定为YARN Client模式,那么就会在本地运行启动Driver进程。2、Driver启动后向ResourceManager建立通讯申请启动ApplicationMaster;3、ResourceManage 接收到这个请求后,就会在集群中选一个合适的 NodeManager并分配一个Container资源容器,在这个Container中启动ApplicationMaster。4、ApplicationMaster启动之后,向ResourceManager建立通讯并申请额外的Container用于运行Executor进程。ResourceManager基于集群状况继续分配Container给NodeManager。5、然后ApplicationMaster对指定的NodeManager发出启动Executor进程请求。6、Executor进程启动后会向Driver反向注册,全部注册完成后,Driver开始执行解析执行提交的spark应用程序的代码(SparkContext),构建DAG有向无环图,当执行到行动算子,就会触发Job,由DAG调度器根据宽窄依赖从后往前划分stage,划分完毕之后,每个Stage有多个task,这些任务被组织成形成task集合发送给任务调度器,最后将Task发送到对应的Executor执行。7、spark应用程序运行完成后,ApplicationMaster向ResourceManager申请注销自己并释放相关资源。2. yarn提交流程(包括提交流程, 资源调度三种模型) yarn提交流程1.客户端通过yarn jar命令或API向ResourceManager提交作业申请启动ApplicationMaster。(RM返回一个Application ID作为作业的唯一标识)2.RM收到请求后,分配一个Container资源容器到NM,在Container中启动AM。AM负责作业的生命周期管理,包括资源协商和任务监控。3.AM启动之后向RM申请运行任务所需的资源(如CPU、内存)。RM根据调度策略(如Capacity/Fair)分配资源,返回NM位置信息。4.然后AM与NodeManager通信,在分配的容器中启动任务(如MapTask\ReduceTask)。5.任务完成后,AM向RM注销并释放资源。资源调度三种模型  yarn-site.xml设置答:分别是先进先出调度器、容量调度器、公平调度器,先进先出调度器的资源分配策略就是按作业提交顺序分配资源,先到先得。但是在多用户环境下,如果有大作业先提交,可能会导致小作业长时间等待,所以资源利用率比较低,不利于它的资源的高效共享,适用于作业提交顺序有严格要求,且对资源共享要求不高的场景。容量调度器资源分配策略是将集群资源划分成多个队列,每个队列配置一定比例的集群资源,队列之间相互独立,每个队列内部采用先进先出或者优先级调度资源。在多用户环境下,不同用户的作业可以提交到不同队列,可以避免单个大作业占用全部资源而其他用户作业长时间等待的情况,提高资源利用率,适用于有一定资源隔离需求,希望保障不同用户或作业组基本资源份额的场景。公平调度器资源分配策略是让所有正在运行的作业公平地共享集群资源。动态灵活分配资源,当新作业提交时,会尽量为其分配与已运行作业相当的资源量,实现作业之间的公平性。在多用户环境中,无论作业大小,都能获得相对公平的资源使用机会,防止小作业被大作业长时间阻塞。如果某个用户没有作业运行,其资源会被其他有作业的用户临时借用,进一步提高了资源的利用率。公平调度器适用于多用户环境下对资源公平性要求较高,希望资源能高效共享的场景。3.数仓怎么分层、每层作用职责回答:传统的数仓主要就是分五层 ODS数据贴源层  ,DIM维度层 ,DWD明细数据层,DWS汇总数据层,ADS 数据应用层1.数据贴源层,数仓架构的最底层,根据表的数据量级和更新频率选择增量/全量同步策略从业务操作系统中抽取数据,几乎不做修改,储存原始的数据副本。2.DIM维度层就是整合多源系统中的维度属性(如客户服务系统、外部数据源系统、催收管理系统等),存放一致性维度信息表。3.DWD层就是先对ODS层的数据进行数据清洗转换操作来保持基本的可用健康数据,然后采用维度建模方法,以业务过程为建模驱动,基于每个具体的业务过程,构建最细粒度的明细层事实表,并且结合业务数据使用特点,将维度表的某些属性字段退化到事实表,减少关联成本,提高模型易用性。4.DWS层基于上层应用需求,对DWD层数据进行多维度聚合指标加工,生成公共粒度的汇总指标表,为上层提供各种开箱即用的汇总指标。5.ADS 数据应用层是数据仓库架构中的上层,通过整合DWD层明细数据和DWS层汇总指标数据为业务端、管理层直接提供业务高度聚合、场景化的数据服务,比如数据查询分析报告、业务报表可视化展示等。6.DM数据集市层:针对特定的业务部门或主题领域,从 DWD 层、DWS 层或其他相关数据源中提取、整合和汇总数据。它是一个面向特定应用场景的数据集合,具有较高的针对性和易用性,能够快速满足特定业务部门的数据分析需求,例如销售数据集市、财务数据集市等。
查看5道真题和解析
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务