ClickHouse 24.8 LTS 版本发布说明

Ubuntu20安装clickhouse最新版本详细教程 文章目录环境说明:安装步骤:第1步:检查是否支持SSE4.2(一般都支持)第2步:为apt添加clickhouse仓库第3步:添加依赖并更新apt数据库第4步:安装clickhouse服务端及客户端第5步:启动clickhouse第6步:客户端连接测试第7步:DBeaver客户端连接clickhouse 环境说明: 系统版本:Ubuntu20.04 LTS 64位 clickhouse版本:21.2.3.15 说明:以下所有操作都是在有sudo权限的普通用户(wedo)下操作的,你若使用root用户操作的话 阅读详情
AI摘要

本文介绍了ClickHouse 24.8版本的更新内容,包括19个新功能、18项性能优化和65个bug修复。新功能有全新JSON数据类型、时序表引擎、全新Kafka引擎等;还对连接功能进行改进,如支持更多不等条件连接类型、对连接表执行OPTIMIZE查询降低内存占用等。

图片

本文字数:13885;估计阅读时间:35 分钟

作者:ClickHouse Team

本文在公众号【ClickHouseInc】首发

图片

时间飞逝,又到了新版本发布的时刻!

发布概要

本次ClickHouse 24.8 版本包含了19个新功能🎁、18项性能优化🛷、65个bug修复🐛

这个版本是长期支持 (LTS) 版本,发布后将获得长达 12 个月的支持。如果你想了解稳定版本和 LTS 版本的区别,可以查阅文档。

本次更新包括全新升级的 JSON 类型、针对时间序列数据的表引擎、Kafka 消息的精准一次性处理,当然也少不了对表连接操作的优化!

新贡献者

一如既往,我们热烈欢迎 24.9 版本中的所有新贡献者!ClickHouse 能有今天的流行,离不开社区的辛勤付出。看到这个社区日益壮大,真的让人倍感自豪。

以下是新贡献者名单:

Graham Campbell, Halersson Paris, Jacob Reckhard, Lennard Eijsackers, Miсhael Stetsyuk, Peter Nguyen, Ruihang Xia, Samuele Guerrini, Sasha Sheikin, Vladimir Varankin, Zhukova, Maria, heguangnan, khodyrevyurii, sakulali, shiyer7474, xc0derx, zoomxi

JSON 数据类型

由 Pavel Kruglov 贡献

本次发布中,我们实验性地引入了全新的 JSON 数据类型。这个功能开发已久,之前版本的发布中,我们也提到过它依赖的几种类型——Variable 和 Dynamic。

JSON 数据类型专为存储半结构化数据而设计,适用于每行数据结构可能不同或不希望将其拆分为单独列的情况。

我们将使用 StatsBomb 提供的足球数据集来试验这个功能。数据集包括比赛、阵容和事件信息。

对于此次实验,最有趣的数据是事件信息。事件可能包括传球、解围、封堵等比赛中发生的各种行为。虽然相同类型的事件具有相同的结构,但不同类型事件的字段却不尽相同。

如果你希望亲自操作,可以通过运行以下命令下载数据集:

wget https://github.com/statsbomb/open-data/archive/refs/heads/master.zip

接下来,快速查看我们将要处理的数据。我们会使用 JsonAsObject (对象化 JSON) 格式读取数据,这样 ClickHouse 就不会尝试推断 JSON 中各属性的类型。

SELECT
    replaceRegexpAll(splitByRegexp('/', _file)[-1], '.json', '') AS matchId,
    json
FROM file('master.zip :: **/data/events/*.json', JSONAsObject)
LIMIT 1
FORMAT Vertical

Row 1:
──────
matchId: 15946
json:    {"duration":0,"id":"9f6e2ecf-6685-45df-a62e-c2db3090f6c1","index":"1","minute":"0","period":"1","play_pattern":{"id":"1","name":"Regular Play"},"possession":"1","possession_team":{"id":"217","name":"Barcelona"},"second":"0","tactics":{"formation":"442","lineup":[{"jersey_number":"1","player":{"id":"20055","name":"Marc-André ter Stegen"},"position":{"id":"1","name":"Goalkeeper"}},{"jersey_number":"2","player":{"id":"6374","name":"Nélson Cabral Semedo"},"position":{"id":"2","name":"Right Back"}},{"jersey_number":"3","player":{"id":"5213","name":"Gerard Piqué Bernabéu"},"position":{"id":"3","name":"Right Center Back"}},{"jersey_number":"23","player":{"id":"5492","name":"Samuel Yves Umtiti"},"position":{"id":"5","name":"Left Center Back"}},{"jersey_number":"18","player":{"id":"5211","name":"Jordi Alba Ramos"},"position":{"id":"6","name":"Left Back"}},{"jersey_number":"5","player":{"id":"5203","name":"Sergio Busquets i Burgos"},"position":{"id":"9","name":"Right Defensive Midfield"}},{"jersey_number":"4","player":{"id":"5470","name":"Ivan Rakitić"},"position":{"id":"11","name":"Left Defensive Midfield"}},{"jersey_number":"20","player":{"id":"6379","name":"Sergi Roberto Carnicer"},"position":{"id":"12","name":"Right Midfield"}},{"jersey_number":"11","player":{"id":"5477","name":"Ousmane Dembélé"},"position":{"id":"16","name":"Left Midfield"}},{"jersey_number":"9","player":{"id":"5246","name":"Luis Alberto Suárez Díaz"},"position":{"id":"22","name":"Right Center Forward"}},{"jersey_number":"10","player":{"id":"5503","name":"Lionel Andrés Messi Cuccittini"},"position":{"id":"24","name":"Left Center Forward"}}]},"team":{"id":"217","name":"Barcelona"},"timestamp":"00:00:00.000","type":{"id":"35","name":"Starting XI"}}

这行数据代表了一场比赛的首发阵容事件,但数据集中还包含数百种其他事件类型。接下来我们看看如何将这些数据加载到 ClickHouse 中。

要使用 JSON 数据类型,需要启用以下配置:

SET allow_experimental_json_type=1;

接着,我们将创建一个事件表。该表包含一个存储事件 JSON 数据的 `json` 列,以及一个 matchId 列,用于存储从文件名中提取的比赛 ID。

在创建 ClickHouse 表时,我们需要定义一个排序键,它决定数据在磁盘上的排序方式。此处我们使用 possession_team.id 作为排序键。

目前尚不支持将嵌套字段作为排序键,不过该功能已计划在未来版本中推出。暂时,我们可以创建一个 MATERIALIZED 列,从 JSON 列中提取相应的值,并将其用作排序键。以下是创建表的查询语句:

CREATE TABLE events
(
    matchId String,
    json JSON,
    possession_team_id String MATERIALIZED getSubcolumn(json, 'possession_team.id')
)
ENGINE = MergeTree
ORDER BY possession_team_id;

接下来,我们可以复制之前的 SELECT 查询,并在其前面添加 INSERT INTO events 语句来加载数据:

INSERT INTO events 
SELECT
    replaceRegexpAll(splitByRegexp('/', _file)[-1], '.json', '') AS matchId,
    json
FROM file('master.zip :: **/data/events/*.json', JSONAsObject)

0 rows in set. Elapsed: 72.967 sec. Processed 12.08 million rows, 10.39 GB (165.60 thousand rows/s., 142.42 MB/s.)
Peak memory usage: 3.52 GiB.

加载 1200 万条事件数据大约需要一分钟时间。之后,我们可以编写一个使用 JSON 点语法的查询来找出最常见的事件类型:

SELECT
    json.type.name,
    count() AS count
FROM events
GROUP BY ALL
ORDER BY count DESC
LIMIT 10

┌─json.type.name─┬───count─┐
│ Pass           │ 3358652 │
│ Ball Receipt*  │ 3142664 │
│ Carry          │ 2609610 │
│ Pressure       │ 1102075 │
│ Ball Recovery  │  363161 │
│ Duel           │  255791 │
│ Clearance      │  157713 │
│ Block          │  130858 │
│ Dribble        │  121105 │
│ Goal Keeper    │  105390 │
└────────────────┴─────────┘

点语法在读取字面值时非常方便,但它并不适用于读取子对象。例如,下面的查询尝试统计最常见的 possession_team:

SELECT
    json.possession_team AS team,
    count()
FROM events
GROUP BY team
ORDER BY count() DESC
LIMIT 10

┌─team─┬──count()─┐
│ ᴺᵁᴸᴸ │ 12083338 │
└──────┴──────────┘

结果显示,所有值都为 null!

点语法由于性能原因,不会读取嵌套对象。数据存储方式使得通过路径读取字面值非常高效,但如果要读取所有子对象,数据量会增加,速度可能变慢。

如果我们需要返回一个对象,则需要使用 .^ 语法。这种特殊语法专用于从 JSON 数据类型字段中读取嵌套对象:

SELECT
    json.^possession_team AS team,
    count()
FROM events
GROUP BY team
ORDER BY count() DESC
LIMIT 10

┌─team──────────────────────────────────────┬─count()─┐
│ {"id":"217","name":"Barcelona"}           │ 1326515 │
│ {"id":"131","name":"Paris Saint-Germain"} │  239930 │
│ {"id":"1","name":"Arsenal"}               │  154789 │
│ {"id":"904","name":"Bayer Leverkusen"}    │  147473 │
│ {"id":"220","name":"Real Madrid"}         │  135421 │
│ {"id":"968","name":"Arsenal WFC"}         │  131637 │
│ {"id":"746","name":"Manchester City WFC"} │  131017 │
│ {"id":"971","name":"Chelsea FCW"}         │  115761 │
│ {"id":"212","name":"Atlético Madrid"}     │  110893 │
│ {"id":"169","name":"Bayern Munich"}       │  104804 │
└───────────────────────────────────────────┴─────────┘

在读取多层嵌套的子对象时,若只想返回某个子对象,只需在路径中的第一个对象使用 .^ 语法。例如:

select json.^pass.body_part AS x, toTypeName(x)
FROM events 
LIMIT 1;

┌─x───────────────────────────────┬─toTypeName(x)─┐
│ {"id":"40","name":"Right Foot"} │ JSON          │
└─────────────────────────────────┴───────────────┘

这种语法仅限于返回对象。如果试图使用它返回字面值,将得到一个空的 JSON 对象:

SELECT
    json.^possession_team.name AS team, toTypeName(team),
    count()
FROM events
GROUP BY team
ORDER BY count() DESC
LIMIT 10;

┌─team─┬─toTypeName(team)─┬──count()─┐
│ {}   │ JSON             │ 12083338 │
└──────┴──────────────────┴──────────┘

我们计划添加一个新操作符 .^$,它可以同时返回字面值和子对象,作为单一子列。

当返回字面值时,它们的类型将为 Dynamic。可以使用 dynamicType 函数来确定每个值的实际底层类型:

SELECT
    json.possession_team.name AS team,
    dynamicType(team) AS teamType,
    json.duration AS duration,
    dynamicType(duration) AS durationType
FROM events
LIMIT 1

┌─team────┬─teamType─┬─duration─┬─durationType─┐
│ Arsenal │ String   │ 0.657763 │ Float64      │
└─────────┴──────────┴──────────┴──────────────┘

我们还可以使用 .:后缀来假定数据类型,并使用::进行类型转换。

SELECT
    json.possession_team.name AS team,
    toTypeName(team),
    json.possession_team.name.:String AS teamAssume,
    toTypeName(teamAssume) AS assumeType,
    json.possession_team.name::String AS teamCast,
    toTypeName(teamCast) AS castType
FROM events
LIMIT 1;

┌─team────┬─toTypeName(team)─┬─teamAssume─┬─assumeType───────┬─teamCast─┬─castType─┐
│ Arsenal │ Dynamic          │ Arsenal    │ Nullable(String) │ Arsenal  │ String   │
└─────────┴──────────────────┴────────────┴──────────────────┴──────────┴──────────┘

最后要注意的是,JSON 数据类型的列可以进一步配置。例如,如果希望排除存储中的某些 JSON 对象部分,可以通过在 JSON 路径中使用 SKIP 和 SKIP REGEXP 跳过特定路径。

例如,以下创建表的语句跳过了 pass.body.part 路径以及任何以字母 t 开头的路径:

CREATE TABLE events2
(
    matchId String,
    json JSON(
      SKIP pass.body_part, 
      SKIP REGEXP 't.*'
    ),
    possession_team_id String MATERIALIZED getSubcolumn(json, 'possession_team.id')
)
ENGINE = MergeTree
ORDER BY possession_team_id;

在将数据导入带有额外设置的 JSON 列的表时,ClickHouse 不会自动将传入的数据转换为正确的类型,不过这一问题将在未来的版本中得到修复。目前,我们需要在导入查询中显式定义 JSON 列的类型:

INSERT INTO events2
SELECT
    replaceRegexpAll(splitByRegexp('/', _file)[-1], '.json', '') AS matchId,
    json
FROM file(
  'master.zip :: **/data/events/*.json',
  JSONAsObject,
  '`json` JSON(SKIP `pass.body_part`, SKIP REGEXP \'t.*\')'
);

0 rows in set. Elapsed: 75.122 sec. Processed 12.08 million rows, 10.39 GB (160.85 thousand rows/s., 138.33 MB/s.)
Peak memory usage: 3.52 GiB.

如果我们查询 events2 表,会发现这些子路径已经不再存在:

SELECT json.^pass AS pass
FROM events3
WHERE empty(pass) != true
LIMIT 3
FORMAT Vertical;

Row 1:
──────
pass: {"angle":-3.1127546,"end_location":[49.6,39.7],"height":{"id":"1","name":"Ground Pass"},"length":10.404326,"recipient":{"id":"401732","name":"Jaclyn Katrina Demis Sawicki"},"type":{"id":"65","name":"Kick Off"}}

Row 2:
──────
pass: {"angle":2.9699645,"end_location":[28,44.2],"height":{"id":"1","name":"Ground Pass"},"length":22.835499,"recipient":{"id":"401737","name":"Hali Moriah Candido Long"}}

Row 3:
──────
pass: {"angle":-1.7185218,"end_location":[27.1,27.1],"height":{"id":"1","name":"Ground Pass"},"length":16.984993,"recipient":{"id":"389446","name":"Jessika Rebecca Macayan Cowart"}}

我们还可以为路径提供类型注释:

CREATE TABLE events3
(
    matchId String,
    json JSON(
      pass.height.name String, 
      pass.height.id Int64 
    ),
    possession_team_id String MATERIALIZED getSubcolumn(json, 'possession_team.id')
)
ENGINE = MergeTree
ORDER BY possession_team_id;

此外,还有一些额外设置,如 max_dynamic_paths 和 max_dynamic_types。这些设置用于控制数据在磁盘上的存储方式。你可以在 JSON 数据类型的文档中了解更多详细信息【https://clickhouse.com/docs/en/sql-reference/data-types/newjson】。

合并期间投影的控制

由 ShiChao Jin 贡献

在 ClickHouse 中,表格可以有“投影”,即原始表的隐藏副本,并保持同步。投影通常会使用不同的主键(因此行的顺序也不同),并且可以在其中逐步预计算聚合值。

当用户执行查询时,ClickHouse 会决定是从原始表读取数据,还是从投影中读取。如下图所示:

图片

ClickHouse 会为每个表部分单独做出读取原始表还是投影的选择。通常,ClickHouse 会尽量减少数据读取量,并采用一些技巧,例如对部分主键进行采样,以确定最佳读取部分。在某些情况下,源表部分可能没有对应的投影部分。这可能是因为在 SQL 中创建表的投影时默认是“惰性”的——即它只会影响新插入的数据,而不会更改现有部分。

下图展示了一个更具体的例子,即计算英国售出物业按城镇和街道分组的最高价格的查询:

图片

由于其中一个投影已经包含了预先计算的聚合值,ClickHouse 会尝试从相应的投影部分读取数据,以避免在查询时再次执行聚合。如果某一部分缺少对应的投影部分,查询将回退到原始数据部分。

但是,如果原始表中的数据由于复杂的数据部分后台合并发生了显著变化,该怎么办呢?

例如,假设表是使用 ClickHouse 的 ReplacingMergeTree 表引擎存储的。如果在合并过程中检测到同一行出现在多个输入部分中,系统只会保留最新的行版本(即最近插入的部分),并丢弃所有旧版本。

同样,如果表是使用 AggregatingMergeTree 表引擎存储的,合并操作可能会将基于主键值的相同行合并为一行,以更新部分聚合状态。

在 ClickHouse v24.8 之前,投影部分可能会默默地与主数据不同步,或者某些操作(如更新和删除)根本无法执行,因为数据库在表中存在投影时会自动抛出异常。

从 v24.8 开始,新的表级别设置 deduplicate_merge_projection_mode 控制原始表部分中复杂后台合并操作的行为。

删除变异是另一种部分合并操作的例子,它会删除原始表部分中的行。自 v24.7 起,我们还有一个设置来控制轻量删除所触发的删除变异行为:lightweight_mutation_projection_mode。

deduplicate_merge_projection_mode 和 lightweight_mutation_projection_mode 都有以下几种可能的取值:

  • throw: 抛出异常,防止投影部分不同步。

  • drop: 删除受影响的投影表部分,查询将回退到原始表部分替代这些投影部分。

  • rebuild: 重建受影响的投影部分,以确保与原始表部分的数据保持一致。

我们通过两个图示来演示 drop 模式的行为。第一个图示显示,通过运行变异合并操作,原始表数据部分中的一行被删除。为了防止投影部分数据不同步,相关联的投影表数据部分也会被删除:

图片

尽管速度稍慢,示例中的聚合查询仍然能够执行——如果找不到投影部分,查询会自动回退至原始表部分。然而,如果投影部分仍然存在,查询执行会优先使用投影部分而非原始表部分:

图片

如果将 deduplicate_merge_projection_mode 设置为 rebuild,ClickHouse 会重建与修改后的原始表数据部分相关联的投影表数据部分:

图片

需要注意的是,这种行为相对于增量物化视图(incremental materialized views)有明显的优势。虽然增量物化视图与投影类似,但它仅在原始表中插入数据时进行同步。而在原始表数据发生更新、删除或替换时,物化视图会悄然失去同步。

时序表引擎

由 Vitaly Baranov 贡献

此版本引入了时序表引擎 (TimeSeries)。这个表引擎支持使用 ClickHouse 作为 Prometheus 的存储,通过远程写入协议 (remote-write) 进行数据存储。此外,Prometheus 还可以通过远程读取协议 (remote-read) 从 ClickHouse 中查询数据,如下图所示:

图片

时序表引擎目前属于实验性功能,因此需要在服务器配置文件中启用 allow_experimental_time_series_table 属性:

config.d/allow_experimental_time_series.xml

<clickhouse>
    <profiles>
        <default>
            <allow_experimental_time_series_table>1</allow_experimental_time_series_table>
        </default>
    </profiles>
</clickhouse>

同时,还需要配置 ClickHouse 的远程写入和远程读取端点,以支持 Prometheus 连接:

config.d/prometheus.xml

<clickhouse>
    <prometheus>
        <port>9092</port>
        <handlers>
            <my_rule_1>
                <url>/write</url>
                <handler>
                    <type>remote_write</type>
                    <table>default.prometheus</table>
                </handler>
            </my_rule_1>
            <my_rule_2>
                <url>/read</url>
                <handler>
                    <type>remote_read</type>
                    <table>default.prometheus</table>
                </handler>
            </my_rule_2>
        </handlers>
    </prometheus>
</clickhouse>

启动 ClickHouse 后,日志中会显示如下内容:

2024.08.27 15:41:19.970465 [ 14489686 ] {} <Information> Application: Listening for Prometheus: http://[::1]:9092
...
2024.08.27 15:41:19.970523 [ 14489686 ] {} <Information> Application: Listening for Prometheus: http://127.0.0.1:9092

接下来,使用 ClickHouse 客户端连接服务器并运行以下查询:

CREATE TABLE prometheus ENGINE=TimeSeries;

运行该查询将会创建三个目标数据表:

  • data 表:用于存储与某个标识符关联的时间序列数据。

  • tags 表:存储每个指标名称与标签组合生成的标识符。

  • metrics 表:包含已收集的指标信息,包括类型和描述。

你可以通过以下查询查看这些表的名称:

SHOW TABLES

┌─name───────────────────────────────────────────────────┐
│ .inner_id.data.bcd5b4e6-01d3-45d1-ab27-bbe9de2bc74b    │
│ .inner_id.metrics.bcd5b4e6-01d3-45d1-ab27-bbe9de2bc74b │
│ .inner_id.tags.bcd5b4e6-01d3-45d1-ab27-bbe9de2bc74b    │
│ prometheus                                             │
└────────────────────────────────────────────────────────┘

接下来,我们将启动 Prometheus,并让其以自引用的方式收集自身的数据。配置文件如下:

prometheus.yml

global:
  scrape_interval:     15s
  external_labels:
    monitor: 'codelab-monitor'

scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9090']      

remote_write:
  - url: "http://localhost:9092/write"

remote_read:
  - url: "http://localhost:9092/read"

需要重点关注的是 remote_write 和 remote_read 配置项,它们指向在 ClickHouse 服务器上运行的 HTTP 端点。下载并解压 Prometheus 后,运行以下命令即可:

./prometheus-2.54.0.darwin-amd64/prometheus --config prometheus.yml

之后,你可以在 Prometheus 中查看这些指标,或使用 ClickHouse 的表函数进行查询。这些函数以 timeSeries 为前缀,并接受 TimeSeries 表名作为参数。第一个函数是 timeSeriesMetrics,用于列出所有指标:

SELECT *
FROM timeSeriesMetrics(prometheus)
LIMIT 3
FORMAT Vertical

Query id: 07f4cce2-ad47-45e1-b0e3-6903e474d76c

Row 1:
──────
metric_family_name: go_gc_cycles_automatic_gc_cycles_total
type:               counter
unit:
help:               Count of completed GC cycles generated by the Go runtime.

Row 2:
──────
metric_family_name: go_gc_cycles_forced_gc_cycles_total
type:               counter
unit:
help:               Count of completed GC cycles forced by the application.

Row 3:
──────
metric_family_name: go_gc_cycles_total_gc_cycles_total
type:               counter
unit:
help:               Count of all completed GC cycles.

此外,还可以使用 timeSeriesData 和 timeSeriesTags,建议将这两个函数一起查询:

SELECT *
FROM timeSeriesData(prometheus) AS data
INNER JOIN timeSeriesTags(prometheus) AS tags ON tags.id = data.id
WHERE metric_name = 'prometheus_tsdb_head_chunks_created_total'
LIMIT 1
FORMAT Vertical

Row 1:
──────
id:          a869dbe8-ba86-1416-47d3-c51cda7334b1
timestamp:   2024-08-27 15:54:46.655
value:       8935
tags.id:     a869dbe8-ba86-1416-47d3-c51cda7334b1
metric_name: prometheus_tsdb_head_chunks_created_total
tags:        {'instance':'localhost:9090','job':'prometheus','monitor':'codelab-monitor'}
min_time:    2024-08-27 13:46:05.725
max_time:    2024-08-27 16:00:26.649

在未来的版本中,我们将实现 /query 端点,允许你直接在 ClickHouse 中执行 Prometheus 风格的查询。

连接功能的改进

每个 ClickHouse 版本都会包含连接功能的改进,ClickHouse v24.8 也不例外,提供了更多增强功能。

更多支持不等条件的连接类型

由 Lgbo-USTC 贡献

ClickHouse v24.5 版本中已引入 ON 子句中非相等条件的实验性支持。本次更新中,更多的连接类型(如 LEFT/RIGHT SEMI/ANTI/ANY JOIN)可以使用左表和右表列的不等条件。

对连接表执行 OPTIMIZE 查询,降低内存占用

由 Duc Canh Le 贡献

使用 Join 表引擎的 ClickHouse 表,通常会在内存中预先计算一个哈希表,以便在连接操作时直接使用右表数据。

在 ClickHouse v24.8 中,你可以对连接表运行 OPTIMIZE TABLE 语句,通过优化数据打包减少内存使用,最多可减少 30% 的内存占用。

全新的 Kafka 引擎

由 János Benjamin Antal 贡献

我们还引入了一个新的实验性 Kafka 引擎,该版本实现了 Kafka 消息的精准处理。

在现有引擎中,Kafka 偏移量同时存储在 Kafka 和 ClickHouse 中,因非原子提交导致重试时可能出现重复数据。

新版本中,偏移量由 ClickHouse Keeper 处理。如果插入失败,无论是网络问题还是服务器故障,都会重新插入同一数据块,确保数据一致性。

你可以通过以下设置启用新引擎:

CREATE TABLE ... ENGINE = Kafka(
    'localhost:19092', 'topic', 'consumer', 'JSONEachRow')
SETTINGS
    kafka_keeper_path = '/clickhouse/{database}/kafka',
    kafka_replica_name = 'r1';

征稿启示

面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com

​​联系我们

手机号:13910395701

邮箱:Tracy.Wang@clickhouse.com

满足您所有的在线分析列式数据库管理需求

ClickHouse使用介绍和部署指南 ClickHouse 是一种用于在线分析处理 (OLAP) 的高性能、面向列的 SQL 数据库管理系统 (DBMS)。它以其快速的查询性能和高效的数据压缩而闻名,并且能够处理 PB 级别的数据。1. 阅读详情

相关推荐

CentOS 7 部署 ClickHouse 22.8 LTS 实战指南

ClickHouse 是一款面向 OLAP 场景的高性能列式数据库,其核心优势在于向量化执行引擎与极致压缩比带来的亚秒级分析能力。在企业级生产环境中,CentOS 7 因其长期稳定性与广泛兼容性仍被大量政企、金融及交通监控系统采用,但其较旧的 glibc 2.17、OpenSSL 1.0.2k 和 systemd 219 等组件常导致新版 ClickHouse 安装失败或运行异常。本文聚焦于官方兼容的 22.8.12.1 LTS 版本,详解如何在最小化 CentOS 7 环境中绕过依赖冲突、SELinux

weixin_33862993的博客 523

ClickHouse 版本升级

ClickHouse 版本升级

style_boy的博客 3449

某头部能源集团“数据治理”到“数智应用”跃迁案例剖析

本次案例能源企业实现了从“数据可用”到“指标驱动”再到“智能决策”的全链条升级,标志着集团在数字化、智能化治理能力上的系统跃升,构建起面向未来的数智管理新范式。

a958014226的博客 1258

ClickHouse 23.12 版本发布说明

迎接2024年圣诞节后的第一个新版本。

ClickHouseDB的博客 2130

从Reset到Read:深入解析Rolling Shutter曝光流水线

本文深入解析Rolling Shutter(卷帘曝光)的工作原理,重点探讨Reset和Read信号在图像传感器中的关键作用。通过Reset-Read流水线机制,详细解释了曝光控制、时序调优及运动伪影补偿等核心技术,帮助读者理解卷帘曝光在高速摄影和动态场景中的应用。

weixin_42531925的博客 253

使用VLC库实现视频播放器(WPF版)

使用wpf制作一个视频播放器 一、 LibVLCSharp介绍 LibVLCSharp是基于VideoLAN的LibVLC库的.NET平台的跨平台音频和视频API。它提供了一个全面的多媒体API,可以跨移动、服务器和桌面使用,以呈现视频和输出音频。支持Mono、.NET Framework和.NET核心运行时。在vs工具中,只需要安装截图中得两个nuget包。 二、视频播放器的实现 视频播放器的实现需要用到两个比较nuget包中提供的类,MediaPlayer类。MediaPlayer类型用于控

cangqiongxiaoye的博客 1万+

ClickHouse 24.1 版本发布说明

ClickHouse 在 2024 年的首个新版本发布来了!

ClickHouseDB的博客 2659

基于FPGA的数据采集系统(一)

整体系统设计 本设计主要是对ADC和DAC的使用,主要实现功能流程为:首先通过串口向FPGA发送控制信号,控制DAC芯片tlv5618进行DA装换,转换的数据存在ROM中,转换开始时读取ROM中数据进行读取转换。其次用按键控制adc128s052进行模数转换100次,模数转换数据存储到FIFO中,再从FIFO中读取数据通过串口输出显示在pc上。其整体系统框图如下: 图1:FPGA数据采集系统框图 从图中可以看出,该系统主要包括9个模块:串口接收模块、按键消抖模块、按键控制模块、ROM模块、D..

phflovelt的博客 2万+

ClickHouse v24.8.9.95-lts 版本发布详解:合并回移植清单、关键修复与源码级解读

本指南基于官方发布说明 [docs/changelogs/v24.8.9.95-lts.md](https://link.gitcode.com/i/58486a0d020a556930cf2cf578eb9fab),系统梳理 ClickHouse 24.8 LTS 分支第 9 个补丁版本 v24.8.9.95-lts(相对 v24.8.8.17-lts)的全部变更:包括 1 项向后不兼容变更、2

gitblog_00125的博客 9

计算pi小数点后10000位

数据结构课上,老师让我们计算一下pi的10000位,复习一下面向对象。 First Try:定义一个高精度类hp(high precision),实现加减乘除,输入输出,然后随便找一个公式,比如Wallis公式,全都用hp进行计算。 现实是:大数乘大数或者大数除大数,实在是太慢了。而且Wallis公式收敛太慢。 Second Try先找到一个收敛较快的公司:BBP公式,观察公式发现,...

我的技术人生 7394

STM32F4 Flash数据的保存和读取。

STM32F4 Flash数据的保存和读取。

张一西的博客 9216

ClickHouse v23.8.7.24-lts 版本解析:LTS 维护分支的六项关键 Bug 修复与构建改进

本文基于 ClickHouse 官方发布说明([v23.8.7.24-lts](https://link.gitcode.com/i/bd3e7aee8aa07f4330ecd9b1cfd2ae2f)),系统梳理 23.8 LTS 系列这一维护版本中包含的 1 项构建/测试/打包改进、6 项用户可见的 Bug 修复,并结合当前仓库源码逐一剖析问题根因、修复思路与验证方法。读完本文,你将理解 `sy

gitblog_00425的博客 9

【系统分析师】核心考点:100个高频知识点汇总

本文系统梳理了系统分析师考试的11大领域高频考点,重点解析了计算机硬件与体系结构的7个核心知识点:计算机五大部件(CPU/存储器/总线等)、校验码类型(奇偶/海明/CRC)、CISC与RISC指令系统对比、总线分类与特性、RAID磁盘阵列级别、流水线技术原理及Flynn系统分类法。内容涵盖硬件组成、数据校验、指令架构、存储技术等关键概念,通过表格对比和公式说明,为考生提供结构化的知识框架与备考重点。

数据知道的博客 5569

ClickHouse 版本管理实战:怎么选目标版本、怎么升级、怎么安全回滚

ClickHouse 是一款面向实时分析的列式数据库,按月发布新版本,同时每隔几个月推出一个维护时间更长的 LTS 版本。版本管理说穿了就是四个问题:升到哪个版本、升级前做什么、升级时按什么顺序操作、出了状况如何回滚。本文按这条决策路径展开,每一步都给出可执行的操作依据。 ## 先定目标版本:滚动版本和 LTS 版本怎么选 ClickHouse 的版本号采用「年.月」形式,例如 25.8 表示

gitblog_01143的博客 1054

Sigrity SPEED2000 General SI Simulation模式如何进行信号仿真分析操作指导-DDR

本例是几个简单的板载DDR颗粒的结构,本例中使用General SI Simulation模式仿真DDR信号,结构拓扑如下,Addcmd,clk,cke都是T拓扑。Sigrity SPEED2000 General SI Simulation模式可以对信号进行仿真分析,仿真将电源视为理想电源,以下图为例进行说明。DQS的接收端模型设置为DQS_34_ODT60_1333。模式如何进行信号仿真分析操作指导-DDR。附带驱动和接收端的IBIS模型。

weixin_54787054的博客 512

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ClickHouse v24.8.6.70-lts 版本发布详解:LTS 分支的关键修复与稳定性保障

本文基于 ClickHouse 官方变更日志 [docs/changelogs/v24.8.6.70-lts.md](https://link.gitcode.com/i/360fadfea4480a14c7f9cd6421f94748),对 2024 年 LTS 分支的补丁版本 v24.8.6.70-lts 进行深入解读。该版本在 v24.8.5.115-lts 的基础上,通过 1 个向后不兼容

gitblog_00796的博客 18

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ClickHouse v25.8.6.11-lts 发布解析:路径包含判断、Mutation Patch 与 EmbeddedRocksDB 等五处修复的源码级解读

本篇基于官方 changelog [v25.8.6.11-lts](https://link.gitcode.com/i/9f23722109a870b4e984ad19201ed22e) 展开,逐条解析该 LTS 版本相对 v25.8.5.17-lts 引入的 4 个 Bug Fix 与 1 个内部调整,并结合当前仓库中的源码实现([src/Common/filesystemHelpers.cp

gitblog_00097的博客 508

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ClickHouse v24.8.4.13-lts 补丁版本解析:字典命名集合、JSON 类型解析与并行副本 UNION 的关键修复

本文基于官方发布的 [v24.8.4.13-lts 变更日志](https://link.gitcode.com/i/959794aa5b62c4cc5f347b7e2899cda1),深入剖析 24.8 LTS 系列这一补丁版本中包含的 1 项功能性改进与 2 项用户可见的 Bug 修复,并结合 ClickHouse 源码验证其底层实现:包括字典(Dictionary)全面改用 DDL 创建的命

gitblog_00292的博客 29

ClickHouse版本升级完整指南:5步实现零风险生产环境部署

ClickHouse作为高性能实时分析数据库管理系统,其版本迭代频繁且功能更新迅速。对于技术决策者和运维团队而言,掌握ClickHouse版本管理的核心技能至关重要,这直接关系到生产环境的稳定性和数据安全。本文将从实际问题出发,提供一套完整的ClickHouse版本升级解决方案,涵盖架构分析、实施步骤、验证方法和最佳实践,确保您能够实现零风险的版本升级与回滚。 ## 核心问题:版本升级的三大挑战

gitblog_00088的博客 754

ClickHouse 版本管理避坑清单:从“该不该升“到 4 步回滚实操

这篇文章面向管理 ClickHouse 集群的 DBA 与运维,把版本管理拆成一条决策链:先判断这次升级值不值得做,再做升级前的核查,然后按顺序执行和验证,最后准备好翻车时的回滚路径与长期版本节奏。读完你手里会有一份可勾选的升级前核查清单、一套验证命令,和一份回滚判断标准。 ## 一、🎯 该不该升:升级决策的三个信号 很多事故不是出在"怎么升",而是出在"不该升的时候升了"。先花十分钟回答下

gitblog_01039的博客 655

ClickHouse v22.3.19.6-lts 发布解读:异步插入 LOGICAL_ERROR 缺陷修复与 LTS 分支维护实践

本文基于归档变更记录 [v22.3.19.6-lts.md](https://link.gitcode.com/i/4877945bbbb7e96e8f24e9fe72a5f9f5),解读 ClickHouse 2023 年 LTS 分支上一个典型的补丁版本:它如何修复异步插入(asynchronous insert)在处理非法 `VALUES` 数据时可能触发 `LOGICAL_ERROR` 的

gitblog_00891的博客 194

ClickHouse v24.8.7.41-lts 更新解析:Docker 加固、特权降级修复与 12 项稳定性 Bug Fix

本指南以 ClickHouse 官方仓库 [v24.8.7.41-lts 变更日志](https://link.gitcode.com/i/d215fe8910ad7c55b6f0bd5a18740214) 为骨架,逐条拆解该 LTS 补丁版本中的 3 项改进、12 项用户可见 Bug 修复与构建/打包优化,并结合仓库源码(`docker/server/entrypoint.sh`、`progra

gitblog_00240的博客 6

OpenEuler 22.03 LTS 部署Clickhouse

环境说明:目前已验证: openeuler22.03 LTS SP3,openeuler22.03 LTS SP4clickhouse 版本: 24.9.2。

srebro.cn | 运维小弟 675

ClickHouse v24.8.8.17 LTS 深度解析:权限模型改进与 7 项关键修复的技术内幕

本文以 ClickHouse 官方变更日志 [v24.8.8.17-lts](https://link.gitcode.com/i/f5d9cc91a7a1e124be04ce40bb118c9b) 为骨架,逐条拆解该 LTS 补丁版本中的 1 项功能改进与 6 项用户可见 Bug 修复(另有 1 项客户端内部修复),并结合仓库源码(`src/Storages/MergeTree`、`src/Pa

gitblog_00480的博客 12

ClickHouse v25.8.24.21-lts 变更日志深度解析:性能优化、17 项 Bug 修复与升级实践指南

本文以 ClickHouse v25.8.24.21-lts(commit `497e61c6deb`)官方发布说明为骨架,系统梳理该版本相对 v25.8.23.13-lts(commit `443620d152e`)的全部变更:1 项性能改进、17 项用户可见的 Bug 修复、1 项构建/测试改进,以及若干非变更日志级的小改动。文中逐一结合当前仓库源码,解释每项修复背后的根因、影响场景、涉及的模

gitblog_00194的博客 154

clickhouse 集群从 22.5.1.2079 滚动升级到 24.8.6.70 流程步骤

当前生产使用的 22.5.1.2079 版本存在一个 bug ,即当统计 hive 引擎外部表数据会导致集群节点某个实例宕,当出现此故障时,需要手工处理解决,另该版本还存在内存溢出的问题。为解决此问题,根据 clickhouse 官方发布的补丁,显示在 24.8.6.70 LTS 版本已解决此 BUG,前期已在 clickhouse 测试环境进行验证,目前反馈正常,计划对生产环境进行升级验证。

shlei5580的专栏 832
上一篇: 在 ClickHouse 中进行机器学习数据建模
下一篇: 从 Postgres 到 ClickHouse:数据建模指南
ClickHouseDB
博客等级 码龄3年 1707粉丝 320原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值