首页 > 其他分享 >大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge

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

时间:2024-09-24 16:53:29浏览次数:11  
标签:场景 Log 写入 Merge 引擎 136 table 数据 读取


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

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(正在更新···)

章节内容

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

  • 测试连接集群
  • 数据类型学习
  • 整型 浮点型 Decimal 等等

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

简单介绍

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

  • 数据的存储方式和位置,写到哪里以及从哪里读取数据
  • 支持哪些查询以及如何支持
  • 并发数据访问
  • 索引的使用(如果存在)
  • 是否可以执行多线程请求
  • 数据复制参数

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');

运行结果如下所示:

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


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

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

运行结果如下图:

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


文件列表的解释:

  • 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;

执行结果如下图所示:

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

插入数据

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 文件中创建两个数据块。

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

查询数据

ClickHouse 在查询数据时使用多线程,每个线程读取单独的数据并在完成后独立的返回结果行,这样的结果是,大多数情况下,输出中的块的顺序和输入时相应块的顺序是不同的,例如:

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

执行的结果如下图:

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

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;

执行结果如下图所示:

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

插入数据

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');

执行结果如下图:

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

建立链接

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

执行结果如下图所示:

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


标签:场景,Log,写入,Merge,引擎,136,table,数据,读取
From: https://blog.51cto.com/wuzikang/12100914

相关文章

  • cnblogs的GitHub同步markdown文件的blog如何识别文章的唯一性(身份ID如何判定)
    本篇blog是写在GitHub的对应的仓库中的。cnblogs会给终身用户提供一个把GitHub仓库中的markdown文件同步到cnblogs上的一个服务,本文就是使用这个服务同步到个人blog地址的:https://cnblogs.com/xyz问题1:何时触发blogs的同步?当仓库中的markdown文件有更新时,cnblogs会自动同......
  • git误操作带来的麻烦-merge
    git误操作带来的麻烦-merge我想将一个分支的内容完全覆盖远程另外一个分支的内容怎么做如果你想将一个本地分支(我们称之为source-branch)的内容完全覆盖远程的另一个分支(我们称之为target-branch),可以按照以下步骤操作。但请注意,这种方法会永久性地改变target-branch的提交历史,所......
  • WGCAT基本使用 - 如何设置系统名称和LOGO
    WGCAT工单管理系统,支持设置系统名称和LOGO,只需要修改下配置文件就可以了打开配置文件config/application.yml,设置如下配置项#server/logo/下的ico图标名称,建议32*32,如favicon.png,此功能需升级到专业版icoName:#server/logo/下的logo图标名称,建议120*120,如logo.png,此功能需......
  • AI6012: Machine Learning Methodologie Applications
    AI6012:MachineLearningMethodologies&pplicationsAssignment(25points)Importantnotes:tofinishthisassignment,youareallowedtolookuptextbooksorsearchmaterialsviaGoogleforreference.NOplagiarismfromclassmatesisallowed.Thesubm......
  • 【Binlog实战】:基于Spring监听Binlog日志
    【Binlog实战】:基于Spring监听Binlog日志binlog的三种模式MySQL的二进制日志(binlog)有三种不同的格式,通常被称为binlog模式。这三种模式分别是Statement模式、Row模式和Mixed模式。Statement模式:在Statement模式下,MySQL记录每个会更改数据的SQL语句。binlog记录的是执......
  • logging模块
    importlogging#第一种方式,只能选择控制台输出或文件输出日志#logging.basicConfig(level=logging.DEBUG,#format="%(asctime)s%(filename)s%(lineno)d%(levelname)s%(message)s",#日志输出格式asctime表示时间,filename表示文件名,lineno表......
  • .net core 使用QRCoder在linux 下生成带logo的二维码
    1使用nuget安装QRCoder、SkiaSharp、SkiaSharp.NativeAssets.Linux.NoDependenciespublicIActionResultQrCode(stringcontent,intpixel){content=HttpUtility.UrlDecode(content);stringlogoPath=Path.Combine(AppContext.BaseDirectory,"wwwroot"......
  • ORA-38500: USING CURRENT LOGFILE option not available without stand
    在dataguard启用实时恢复的时候,报如下错误:ORA-38500:USINGCURRENTLOGFILEoptionnotavailablewithoutstand实际操作:SQL>alterdatabaserecovermanagedstandbydatabaseusingcurrentlogfiledisconnectfromsession;alterdatabaserecovermanagedstandbydata......
  • Logback使用问题汇总
    如何在logback配置中使用application.yml中属性SpringBoot中logback.xml使用application.yml中属性示例模板:<?xmlversion="1.0"encoding="UTF-8"?><configuration><!--读取spring.application.name中的属性来生成日志文件名--><springPropertyscop......
  • 【idea】log4j和slf4j配合使用问题(2024-9-23最新版本)!
    1、slf4j<!--https://mvnrepository.com/artifact/org.slf4j/slf4j-simple--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version......