大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
日志服务 SLS,月写入数据量 50GB 1个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

Hadoop(已更完)

HDFS(已更完)

MapReduce(已更完)

Hive(已更完)

Flume(已更完)

Sqoop(已更完)

Zookeeper(已更完)

HBase(已更完)

Redis (已更完)

Kafka(已更完)

Spark(已更完)

Flink(已更完)

ClickHouse(正在更新···)

章节内容

上节我们完成了如下的内容:


测试连接集群

数据类型学习

整型 浮点型 Decimal 等等

简单介绍

表引擎(即表的类型)决定了:


数据的存储方式和位置,写到哪里以及从哪里读取数据

支持哪些查询以及如何支持

并发数据访问

索引的使用(如果存在)

是否可以执行多线程请求

数据复制参数

ClickHouse 是一个列式数据库管理系统,支持多种表引擎,每种表引擎都有其特定的功能和用途。以下是一些常用的 ClickHouse 表引擎:


MergeTree 系列

MergeTree:最常用的表引擎,支持高效的分区、排序、索引等功能,适合处理大量写入和查询场景。支持主键和索引。

ReplicatedMergeTree:基于 MergeTree,但增加了复制功能,适用于分布式集群环境。

ReplacingMergeTree:允许以最新的记录覆盖旧的记录,对于需要根据特定列去重的场景非常适用。

SummingMergeTree:支持对数值列的聚合,适用于需要进行聚合计算的场景。

AggregatingMergeTree:支持更加复杂的聚合操作,适合需要预计算汇总的场景。

CollapsingMergeTree:用于处理日志式数据,通过将 “begin” 和 “end” 记录合并,以减少存储空间。

VersionedCollapsingMergeTree:在 CollapsingMergeTree 基础上,增加了版本号,用于更好地控制数据合并。

Log 系列

Log:简单的表引擎,不支持索引和分区,适合小数据量或日志式的存储场景。

TinyLog:适合嵌入式场景或测试,性能更简单,不能处理大规模数据。

StripeLog:适合 SSD 场景,按行写入,但会将数据按块组织,适合某些特定读写模式。

Memory:数据只存储在内存中,适用于需要快速读写但不需要持久化的场景。

Distributed:在分布式集群中使用,将查询分发到多个节点,适合大规模数据和高并发查询场景。

Merge:将多个表作为一个虚拟表进行查询,适合需要联合多个表进行读取的场景。

Join:预加载并存储 Join 表,用于提高连接操作的效率。

View 系列

MaterializedView:物化视图,允许通过预计算来加速查询。

View:普通视图,不会存储数据,只是查询的定义。

Buffer:将数据暂时存储在内存中,并定期批量写入到基础表中,适合需要优化写入性能的场景。

Null:将数据写入时直接丢弃,适合测试场景。

日志

TinyLog

最简单的表引擎,用于将数据存储在磁盘上,每列都存储在单独的压缩文件上,写入时,数据将附加到文件末尾。该引擎没有并发控制。


如果同时从表中读取或者写入数据,则读取操作将抛出异常

如果同时写入多个查询中的表,则数据将被破坏

这种表的引擎的典型用法 write-once:首先只写入一次数据,然后根据需要多次读取。此引擎适用于相对较小的表(建议最多1,000,000行)。如果有许多小表,则使用此表引擎是适合的,因为它需要打开的文件更少,当拥有大量小表时,可能会导致性能低下,不支持索引。


测试1

创建一个TinyLog引擎的表并插入一条数据

CREATE table t (a UInt16, b String) ENGINE = TinyLog;
INSERT INTO t (a, b) VALUES (1, 'abc');

运行结果如下所示:

此时我们去保存数据的目录下查看:

cd /var/lib/clickhouse/data/default/t
ls

运行结果如下图:

文件列表的解释:

  • a.bin 和 b.bin 是压缩过的对应列的数据
  • sizes.json 中记录了 每个 bin 的大小

Log

Log 与 TinyLog 不同的是,标记的小文件与列文件存在一起,这些标记写在每个数据块上,并且包含偏移量,这些偏移量指示从哪里开始读取文件以便跳过指定的行数。这使得可以在多个线程中读取表数据,对于并发数据访问,可以同时执行读取操作,而写入操作则阻塞读取和其他写入。

Log引擎不支持索引。

同样,如果写入表事变,则该表会被破坏,并且从该表中读取将会返回错误。Log引擎适合于临时数据,write-once表以及测试或演示目的。


StripeLog

该引擎属于日志引擎系列,在你需要写入许多小数据量(小于100百万行)的表的场景下使用这个引擎。


写数据

StripeLog引擎将所有的列存储在一个文件中,对每一个INSERT请求,ClickHouse将数据块追加在表文件的末尾,逐列写入。

ClickHouse为每张表写入如下文件:


data.bin 数据文件

index.mrk 标记文件,标记包含了已插入的每个数据块中每列的偏移量。

StripeLog引擎不支持 ALTER、UPDATE、ALTER DELETE操作。


读数据

带标记文件使得ClickHouse可以并行的读取数据,这意味着SELECT请求返回行的顺序是不可预测的,使用ORDER BY子句对行进行排练。

新增表

CREATE TABLE stripe_log_table (
  timestamp DateTime,
  message_type String,
  message String
) ENGINE = StripeLog;

执行结果如下图所示:

插入数据

INSERT INTO stripe_log_table VALUES (now(), 'REGULAR', 'The first reqular message');
INSERT INTO stripe_log_table VALUES 
(now(), 'REGULAR', 'The second regular message'),
(now(), 'WARNING', 'The first warning message');

我们使用两次 INSERT 请求从而在 data.bin 文件中创建两个数据块。

查询数据

ClickHouse 在查询数据时使用多线程,每个线程读取单独的数据并在完成后独立的返回结果行,这样

的结果是,大多数情况下,输出中的块的顺序和输入时相应块的顺序是不同的,例如:

SELECT * FROM stripe_log_table;
# 对结果排序(默认增序)
SELECT * FROM stripe_log_table ORDER BY timestamp;

执行的结果如下图:

Memory

内存引擎,数据以未压缩的原始形式直接保存在内存中,服务器重启数据就会丢失。

读写操作不会互相阻塞,不支持索引。

简单查询下有非常高的性能表现:超过10G/s

一般用到的地方不多,除了用来测试,就是需要非常高的性能,但是数据量又不能太大(上限大概1亿行)的场景。


Merge

Merge引擎(不要与MergeTree搞混)本身不存储数据,但可以用于同时从任意多个其他的表中读取数据,读是自动并行的,不支持写入。

读取时,那些被真正读取到数据的表的引擎(如果有的话)会被使用。


Merge参数:


数据库名

匹配表名的正则表达式

创建新标

CREATE table t1 (id UInt16, name String) ENGINE = TinyLog;
CREATE table t2 (id UInt16, name String) ENGINE = TinyLog;
CREATE table t3 (id UInt16, name String) ENGINE = TinyLog;

执行结果如下图所示:

插入数据

INSERT INTO t1 (id, name) VALUES (1, 'first');
INSERT INTO t2 (id, name) VALUES (2, 'second');
INSERT INTO t3 (id, name) VALUES (3, 'i am in t3');

执行结果如下图:

建立链接

CREATE TABLE t (id UInt16, name String) ENGINE = Merge(currentDatabase(), '^t');

执行结果如下图所示:

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
286 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
130 2
ClickHouse与大数据生态集成:Spark & Flink 实战
|
2月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
318 3
|
2月前
|
消息中间件 分布式计算 关系型数据库
大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他数据源 HDFS MySQL
大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他数据源 HDFS MySQL
58 0
|
1月前
|
存储 监控 数据挖掘
【Clikhouse 探秘】ClickHouse 物化视图:加速大数据分析的新利器
ClickHouse 的物化视图是一种特殊表,通过预先计算并存储查询结果,显著提高查询性能,减少资源消耗,适用于实时报表、日志分析、用户行为分析、金融数据分析和物联网数据分析等场景。物化视图的创建、数据插入、更新和一致性保证通过事务机制实现。
141 14
|
1月前
|
分布式计算 大数据 BI
ClickHouse与大数据生态整合:从ETL到BI报表
【10月更文挑战第27天】在这个数据驱动的时代,企业越来越依赖于数据来做出关键决策。而高效的数据处理和分析能力则是支撑这一需求的基础。作为一位数据工程师,我有幸参与到一个项目中,该项目旨在利用ClickHouse与Hadoop、Spark、Flink等大数据处理框架的整合,构建一个从数据提取(Extract)、转换(Transform)、加载(Load)到最终生成商业智能(BI)报表的全流程解决方案。以下是我在这个项目中的经验和思考。
78 1
|
1月前
|
存储 缓存 大数据
ClickHouse核心概念详解:表引擎与数据模型
【10月更文挑战第26天】在大数据时代,数据处理的速度和效率变得至关重要。ClickHouse,作为一个列式存储数据库系统,以其高效的查询性能和强大的数据处理能力而受到广泛欢迎。本文将从我个人的角度出发,详细介绍ClickHouse的核心概念,特别是其表引擎和数据模型,以及这些特性如何影响数据的存储和查询。
57 1
|
2月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1698 14
|
2月前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
42 0
|
2月前
|
数据可视化
Tensorboard可视化学习笔记(一):如何可视化通过网页查看log日志
关于如何使用TensorBoard进行数据可视化的教程,包括TensorBoard的安装、配置环境变量、将数据写入TensorBoard、启动TensorBoard以及如何通过网页查看日志文件。
265 0
下一篇
DataWorks