ClickHouse 25.8 版本发布说明

ClickHouse 25.4 Docker单机部署实战:从零搭建到备份恢复 容器化部署正在成为数据库交付的主流方式,它通过镜像封装环境依赖,让一次构建随处运行成为可能。在众多OLAP引擎中,ClickHouse凭借列式存储和极速查询性能广受青睐,而采用Docker进行单机部署,既能快速获得可用实例,又能大幅降低升级和迁移成本。本文从部署选型切入,对比Docker、二进制包与包管理器三种方式的优劣,详细解析clickhouse/clickhouse-server镜像的版本选择、compose文件核心参数、config.d与users.d配置优先级等关键细节,并给出完整的初始化、启动、 阅读详情

图片

本文字数:13006;估计阅读时间:33 分钟

作者:ClickHouse Team

本文在公众号【ClickHouseInc】首发

图片

又到了发布新版本的时刻!

发布概要

ClickHouse 25.8 版本共带来了 45 项新功能 🌻、 47 项性能优化 🏍、 以及 119 个bug修复 🐝。

这一版本的亮点包括:全新的高速 Parquet 读取器、Data Lake 相关的功能增强、支持 Hive 风格分区写入、初步支持 PromQL 查询语法等众多更新!

新晋贡献者

热烈欢迎所有在 25.8 版本中首次贡献的开发者!ClickHouse 社区的蓬勃发展令人感动,我们始终感谢每一位为 ClickHouse 增添力量的贡献者。

以下是本次版本中新加入的贡献者名单:

Alexei Fedotov、Bulat Sharipov、Casey Leask、Chris Crane、Dan Checkoway、Denny(Innervate 的 DBA)、Evgenii Leko、Felix Mueller、Huanlin Xiao、Konstantin Dorichev、László Várady、Maruth Goyal、Nick、Rajakavitha Kodhandapani、Renat Bilalov、Rishabh Bhardwaj、RuS2m、Sahith Vibudhi、Sam Radovich、Shaohua Wang、Somrat Dutta、Stephen Chi、Tom Quist、Vladislav Gnezdilov、Vrishab V Srivatsa、Yunchi Pang、Zakhar Kravchuk、Zypperia、ackingliu、albertchae、alistairjevans、craigfinnelly、cuiyanxiang、demko、dorki、mlorek、rickykwokmeraki、romainsalles、saurabhojha、somratdutta、ssive7b、sunningli、xiaohuanlin、ylw510

Parquet reader v3

贡献者:Michael Kolupaev

虽然 ClickHouse 是围绕其原生 MergeTree 表设计的,但它同样支持直接查询超过 70 种外部数据格式,包括 Parquet、JSON、CSV 和 Arrow 等,无需先导入数据。与多数数据库需要先将外部文件加载成原生格式不同,ClickHouse 可跳过这一步,依然支持完整的 SQL 功能,比如连接查询、窗口函数、170 多种聚合函数等。

在所有这些格式中,Parquet 占据着特殊的位置。它是现代 Lakehouse 表格式(如 Iceberg 和 Delta Lake)的核心存储格式。因此,近年来我们在 Parquet 支持方面持续加大优化力度,目标是让 ClickHouse 成为全球最快的 Parquet 查询引擎。

此次发布带来了全新原生实现的 Parquet 读取器(目前处于实验阶段),相比旧版大幅提速。此前,ClickHouse 的 Parquet 读取依赖 Apache Arrow 库:Parquet 文件会先被解析为 Arrow 格式,然后通过流式传输转换为 ClickHouse 的内存格式进行执行。而新版读取器跳过了这一步,能够直接将 Parquet 文件读取为 ClickHouse 内存格式,从而提升了并发能力和 I/O 效率。

在我们内部,这个项目被戏称为“另一个 Parquet 读取器”,因为这已经是第三个版本。第一次尝试(input_format_parquet_use_native_reader)启动后未能完成;第二次(v2)提交了 Pull Request 但没有合并。而这次,v3 终于正式落地,实现了完整集成的原生 Parquet 读取器。

那么这个新版读取器到底带来了什么?答案是:更强的并行能力与更高效的 I/O 性能。

并行能力提升

下图(摘自我们之前的深度解析(https://clickhouse.com/blog/clickhouse-and-parquet-a-foundation-for-fast-lakehouse-analytics))展示了 Parquet 文件在磁盘上的物理结构:

图片

我们在这里不会展开太多细节(建议阅读我们的深度解析了解更多),这里只做简要说明:

Parquet 文件采用分层结构:

① 行组(Row groups)—— 水平分区,通常包含约 100 万行,或约 500 MB 的数据。  

② 列块(Column chunks)—— 垂直切片,每个行组中每一列对应一个列块。  

③ 页面(Pages)—— 最小的存储单元,约为 1 MB 大小,存储经过编码的值。

基于这种结构,ClickHouse 能够将 Parquet 查询任务在多个 CPU 核心上并行执行。

旧版读取器已经支持并行扫描多个行组,但新版进一步优化:它不仅可以并行处理整个行组,还能在同一个行组内部并发读取多个列,在行组数量较少的情况下也能充分利用 CPU 资源。

此外,ClickHouse 引擎在查询执行的每个阶段(如过滤、聚合、排序)都已实现并行化,因此新版读取器能够自然融入整个端到端的并行执行模型:

图片

① 预取线程(Prefetch threads)—— 并行加载多个列  

② 解析线程(Parsing threads)—— 并行解码各列数据  

③ 文件流处理(File streams)—— 同时处理多个 Parquet 文件  

④ 执行通道(Processing lanes)—— 多核并行执行过滤、聚合和排序操作

需要特别指出的是,新版读取器的预取机制更加智能:它运行在独立的线程池中,仅加载真正需要的数据。例如,非 PREWHERE 子句所涉及的列会在 PREWHERE 执行完成、明确哪些页面需要读取之后再进行预取,从而避免了无效的数据读取。(下一节我们将详细讲解 PREWHERE。)

Parquet 数据的并行处理显著提升了查询性能,但影响性能的另一个关键因素是读取数据的总量。在这方面,新版 Parquet 读取器也做得更高效!

I/O 效率提升 

并行处理可以提升查询速度,而更智能的过滤机制则能在源头减少需要处理的数据量。

下图展示了 Parquet 文件中用于数据过滤的元数据结构:

图片

① 字典(Dictionaries)—— 用于低基数字段的唯一值映射  

② 页面级统计信息(Page stats)—— 每个页面的最小值和最大值  

③ 布隆过滤器(Bloom filters)—— 每列的辅助信息,用于跳过无关数据

④ 行组统计信息(Row group stats)—— 整个行组的最小值和最大

此前的 ClickHouse Parquet 读取器已经支持基于行组级最小/最大值和布隆过滤器进行跳过读取操作,以减少无效扫描。

而新版原生读取器则进一步加入了页面级最小/最大值过滤支持,并首次引入了 PREWHERE 子句优化,使得数据读取更加精准高效。我们将在下一节中演示这一点。

Parquet 读取器性能

总体来看,新版 Parquet 读取器使 ClickBench (https://benchmark.clickhouse.com/)查询的平均性能提升了 1.81 倍,也就是说,在直接读取 Parquet 文件时的执行速度几乎提升了近一倍:

图片

Demo

为了展示改进后的 parquet 读取器性能,我们将在 ClickBench 使用的数据集上运行一个查询。

Step 1: 创建一个目录,用来存放 ClickBench 匿名化的网站分析数据集(Parquet 格式)(https://clickhouse.com/docs/getting-started/example-datasets/metrica)

mkdir ~/hits_parquet
cd ~/hits_parquet

Step 2: 下载 Parquet 格式的数据集:

wget --continue --progress=dot:giga 'https://datasets.clickhouse.com/hits_compatible/hits.parquet'

Step 3: 下载最新版本的 ClickHouse:

curl https://clickhouse.com/ | sh

Step 4: 以交互模式运行 clickhouse-local:

./clickhouse local

首先,我们用旧版本的 parquet 读取器来运行一个典型的分析查询,该查询涉及 URL 和 EventTime 列:

SELECT URL, EventTime 
FROM file('./hits_parquet/hits.parquet')
WHERE URL LIKE '%google%'
ORDER BY EventTime 
LIMIT 10
FORMAT Null;
0 rows in set. Elapsed: 1.513 sec. Processed 99.57 million rows, 14.69 GB (65.82 million rows/s., 9.71 GB/s.)
Peak memory usage: 1.36 GiB.

可以看到,这次查询扫描并处理了 9957 万行数据,14.69 GB,总耗时 1.513 秒。

接着,我们启用新的 parquet 读取器,再次运行相同的查询:

SELECT URL, EventTime 
FROM file('./hits_parquet/hits.parquet')
WHERE URL LIKE '%google%'
ORDER BY EventTime 
LIMIT 10
FORMAT Null
SETTINGS
    input_format_parquet_use_native_reader_v3 = 1
0 rows in set. Elapsed: 0.703 sec. Processed 14.82 thousand rows, 6.67 MB (21.07 thousand rows/s., 9.48 MB/s.)
Peak memory usage: 1.91 GiB.

这次查询只处理了 4.82K 行数据,6.67 MB,用时 0.703 秒,性能提升约 2 倍。

这种加速得益于页面级别的 min/max 过滤与 PREWHERE 的结合。

  • 利用页面级统计信息,ClickHouse 可以直接跳过那些不可能满足 URL 列 WHERE 条件的整个 Parquet 页面。

  • 而通过 PREWHERE(https://clickhouse.com/docs/optimize/prewhere),ClickHouse 只会在页面粒度上扫描 EventTime 值,用于匹配 URL。

为什么这很重要?

高效的 Parquet 处理是 ClickHouse 作为 Lakehouse 引擎的核心基础。像 Apache Iceberg(以及 Delta Lake、Hudi 等)这样的开放表格式,都依赖 Parquet 作为存储层:

图片

这意味着,每次查询 Iceberg 表时,最终都取决于引擎能否高效地读取和处理 Parquet 文件。

通过加速和优化 Parquet 的读取能力,我们让 ClickHouse 成为数据湖场景的高性能选择:能够在开放格式上,直接发挥出我们原生引擎的极速优势。

支持 Hive 风格分区写入

贡献者:Arthur Passos

ClickHouse 现在支持 Hive 风格的分区写入。这意味着数据会按目录进行拆分,目录结构对应分区键的值。

我们来看看它在 S3 表引擎(https://clickhouse.com/docs/engines/table-engines/integrations/s3#partition-by)中的使用方式。这里我们用 MinIO 在本地测试,所以先安装 MinIO 客户端和服务端:

brew install minio/stable/minio
brew install minio/stable/mc

接着启动服务器:

minio server hive-data

然后创建一个 bucket:

mc alias set minio http://127.0.0.1:9000 minioadmin minioadmin
mc mb minio/taxis

Added `minio` successfully.
Bucket created successfully `minio/taxis`.

接下来,从纽约出租车数据集中下载一些 Parquet 文件:

curl "https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-06.parquet" -o yellow_tripdata_2023-06.parquet

现在,我们创建一张表,并按照 PULocationID 和 DOLocationID 进行分区,分别表示上车和下车地点。

CREATE TABLE taxis
(
    VendorID              Int64,
    tpep_pickup_datetime  DateTime64(6),
    tpep_dropoff_datetime DateTime64(6),
    passenger_count       Float64,
    trip_distance         Float64,
    RatecodeID            Float64,
    store_and_fwd_flag    String,
    PULocationID          Int64,
    DOLocationID          Int64,
    payment_type          Int64,
    fare_amount           Float64,
    extra                 Float64,
    mta_tax               Float64,
    tip_amount            Float64,
    tolls_amount          Float64,
    improvement_surcharge Float64,
    total_amount          Float64,
    congestion_surcharge  Float64,
    airport_fee           Float64
)
ENGINE = S3(
    'http://127.0.0.1:9000/taxis',
    'minioadmin', 'minioadmin',
    format='Parquet', partition_strategy = 'hive'
)
PARTITION BY (PULocationID, DOLocationID);

接着插入这些 Parquet 文件:

INSERT INTO taxis
SELECT *
FROM file('*.parquet');

然后我们就可以像下面这样查询表了:

SELECT DOLocationID, _path, avg(fare_amount)
FROM taxis
WHERE PULocationID = 199
GROUP BY ALL;
┌─DOLocationID─┬─_path───────────────────────────────────────────────────────────────┬─avg(fare_amount)─┐
│           79 │ taxis/PULocationID=199/DOLocationID=79/7368231474740330498.parquet  │             45.7 │
│          163 │ taxis/PULocationID=199/DOLocationID=163/7368231447649320960.parquet │               52 │
│          229 │ taxis/PULocationID=199/DOLocationID=229/7368231455001935873.parquet │             37.3 │
│          233 │ taxis/PULocationID=199/DOLocationID=233/7368231484399812609.parquet │             49.2 │
│           41 │ taxis/PULocationID=199/DOLocationID=41/7368231474941657088.parquet  │             31.7 │
│          129 │ taxis/PULocationID=199/DOLocationID=129/7368231437356498946.parquet │               10 │
│           70 │ taxis/PULocationID=199/DOLocationID=70/7368231504532471809.parquet  │                3 │
│          186 │ taxis/PULocationID=199/DOLocationID=186/7368231493912494080.parquet │             44.3 │
└──────────────┴─────────────────────────────────────────────────────────────────────┴──────────────────┘

数据湖功能改进

贡献者:Konstantin Vedernikov 

ClickHouse 的数据湖功能也有所提升。借助 IcebergS3 表引擎,你现在可以创建 Apache Iceberg 表,执行插入、删除、更新操作,并调整 schema。

首先,使用 IcebergLocal 表引擎创建一张表:

CREATE TABLE demo (c1 Int32) 
ENGINE = IcebergLocal('/Users/markhneedham/Downloads/ice/');

目前对 Iceberg 的写入还处于实验阶段,因此需要设置如下配置:

SET allow_experimental_insert_into_iceberg=1;

插入一些数据:

INSERT INTO demo VALUES (1), (2), (3);

查询这张表:

SELECT * 
FROM demo;

结果如预期,共有三行数据:

┌─c1─┐
│  1 │
│  2 │
│  3 │
└────┘

接下来,删除 c1=3 的那一行:

DELETE FROM demo WHERE c1=3;

再次查询表:

┌─c1─┐
│  1 │
│  2 │
└────┘

很好,那一行已经被删除了!然后修改表的 DDL,新增一列:

ALTER TABLE demo 
ADD column c2 Nullable(String);

再次查询:

┌─c1─┬─c2───┐
│  1 │ ᴺᵁᴸᴸ │
│  2 │ ᴺᵁᴸᴸ │
└────┴──────┘

很好,新列已经创建,所有值都是 null。接着插入一条新数据:

INSERT INTO demo VALUES (4, 'Delta Kernel');

然后第三次查询表:

┌─c1─┬─c2───────────┐
│  4 │ Delta Kernel │
│  1 │ ᴺᵁᴸᴸ         │
│  2 │ ᴺᵁᴸᴸ         │
└────┴──────────────┘

接下来我们更新 c1=1 那一行的 c2 值:

ALTER TABLE demo
 (UPDATE c2 = 'Equality delete' WHERE c1 = 1);

最后再查询一次表:

┌─c1─┬─c2──────────────┐
│  1 │ Equality delete │
│  4 │ Delta Kernel    │
│  2 │ ᴺᵁᴸᴸ            │
└────┴─────────────────┘

我们还可以通过运行以下命令,查看在执行这些操作时 bucket 中生成的底层文件:

$ tree ~/Downloads/ice
/Users/markhneedham/Downloads/ice
├── data
│   ├── 8ef82353-d10c-489d-b1c4-63205e2491e4-deletes.parquet
│   ├── c5080e90-bbee-4406-9c3f-c36f0f47f89f-deletes.parquet
│   ├── data-369710b6-6b9c-4c68-bc76-c62c34749743.parquet
│   ├── data-4297610d-f152-4976-a8aa-885f0d29e172.parquet
│   └── data-b4a9533f-2c6d-4f5f-bff9-3a4b50d72233.parquet
└── metadata
    ├── 50bb92f9-1de1-4e27-98bc-1f5633b71025.avro
    ├── 842076c9-5c9a-476c-9083-b1289285518d.avro
    ├── 99ef0cd6-f702-4e5a-83e5-60bcc37a2dcf.avro
    ├── b52470e3-2c24-48c8-9ced-e5360555330a.avro
    ├── c4e99628-5eb8-43cc-a159-3ae7c3d18f48.avro
    ├── snap-1696903795-2-4ca0c4af-b3a8-4660-be25-c703d8aa88be.avro
    ├── snap-2044098852-2-e9602064-a769-475c-a1ae-ab129a954336.avro
    ├── snap-22502194-2-86c0c780-60a7-4896-9a29-a2317ad6c3f6.avro
    ├── snap-227376740-2-37010387-0c95-4355-abf7-1648282437cd.avro
    ├── snap-326377684-2-0d0d0b37-8aec-41c0-99ce-f772ab9e1f6b.avro
    ├── v1.metadata.json
    ├── v2.metadata.json
    ├── v3.metadata.json
    ├── v4.metadata.json
    ├── v5.metadata.json
    ├── v6.metadata.json
    └── v7.metadata.json

如果要删除 ClickHouse 中的表,可以运行 DROP TABLE demo,但要注意,这不会删除存储 bucket 中的底层表。

此外,数据湖功能还有以下更新:

  • 支持通过 REST 和 Glue catalog 向 Iceberg 表写入数据。

  • 支持在 REST 和 Glue catalog 中对 Iceberg 执行 DROP TABLE。

  • 支持对 Delta Lake 表进行写入和时光回溯。

Unity、REST、Glue 和 Hive Metastore catalog 已经从实验性升级为 beta 状态。

虚拟列 _table 全局可用

贡献者:Xiaozhe Yu

Merge 表函数可以同时查询多张表,并提供 _table 虚拟列,用于跟踪每一行结果来自哪个底层表。现在,这个虚拟列也能在其他查询中使用了。

比如说,我们定义了一张表 foo,如下所示:

CREATE TABLE foo
(
  c1 Int,
  c2 String,
  c3 String
)
ORDER BY c1;

INSERT INTO foo VALUES (7, 'ClickHouse', 'ClickStack');

然后对这张表和 icebergLocal 表函数执行一个查询:

SELECT c1, c2, 
FROM icebergLocal('/Users/markhneedham/Downloads/ice')
UNION ALL
SELECT c1, c2
FROM foo;
┌─c1─┬─c2──────────────┐
│  1 │ Equality delete │
│  7 │ ClickHouse      │
│  4 │ Delta Kernel    │
│  2 │ ᴺᵁᴸᴸ            │
└────┴─────────────────┘

此时我们就可以使用 _table 虚拟列,清楚地知道 UNION ALL 查询中的每一行数据分别来自哪一部分:

SELECT c1, c2, _table
FROM icebergLocal('/Users/markhneedham/Downloads/ice')
UNION ALL
SELECT c1, c2, _table
FROM foo;
┌─c1─┬─c2──────────────┬─_table───────┐
│  7 │ ClickHouse      │ foo          │
│  1 │ Equality delete │ icebergLocal │
│  4 │ Delta Kernel    │ icebergLocal │
│  2 │ ᴺᵁᴸᴸ            │ icebergLocal │
└────┴─────────────────┴──────────────┘

新增 S3 安全特性

贡献者:Artem Brustovetski

本次版本在处理存储于 S3 的数据时,增加了更多安全功能。

你现在可以在 s3 表函数中使用自定义的 IAM 角色:

SELECT * 
FROM s3('s3://mybucket/path.csv', CSVWithNames,
    extra_credentials(role_arn =
'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001'));

同时,也可以针对 S3 中的特定 URL 定义 GRANTS,而不仅仅是针对所有的 S3 bucket:

GRANT READ ON S3('s3://foo/.*') 
TO user;

Arrow Flight 集成支持

贡献者:zakr600, Vitaly Baranov

Arrow Flight(https://arrow.apache.org/docs/format/Flight.html) 是一种高性能数据交换协议,基于 Apache Arrow 的列式内存格式,并通过 gRPC 进行传输。不同于传统的行式协议,Arrow Flight 在传输过程中保持原生的列式存储格式,避免了昂贵的序列化开销,因此尤其适用于分析型工作负载。可以把它看作是 ODBC 或 JDBC 等协议的现代高效替代方案,专门为列式数据处理时代而设计。

ClickHouse 现在已经支持 Arrow Flight 的初始功能,能够在 Arrow Flight 生态系统中同时作为客户端和服务器使用。作为客户端,ClickHouse 可以通过 arrowflight 表函数查询远程的 Arrow Flight 数据源;作为服务器,它可以将数据提供给支持 Arrow Flight 协议的客户端,比如 PyArrow 或其他兼容系统。

这一功能为集成提供了一条新的路径,使 ClickHouse 能够与日益增长的 Arrow 原生工具和应用生态系统互操作。虽然目前仍处于早期阶段,但 Arrow Flight 支持标志着 ClickHouse 正在向更广泛的列式数据处理工作流兼容性迈出第一步。

我们先来看看如何将 ClickHouse 作为 Arrow Flight 服务器来使用。需要先指定运行端口。如果不指定 listen_host,可能会默认尝试监听 IPv6 地址,而这在部分系统上并不受支持。

arrowflight_port: 6379
arrowflight:
  enable_ssl: false
listen_host: "127.0.0.1"

接下来启动 ClickHouse Server:

./clickhouse server

你应该会看到类似下面的输出:

Application: Listening for Arrow Flight compatibility protocol: 127.0.0.1:6379

然后启动 ClickHouse Client:

./clickhouse client

基于纽约出租车数据集创建一张表:

CREATE TABLE taxis
ORDER BY VendorID
AS SELECT *
FROM url('https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-06.parquet')
SETTINGS schema_inference_make_columns_nullable = 0;

完成之后,启动 iPython REPL,并将 pyarrow 作为依赖:

uv run --with pyarrow --with ipython ipython

然后运行以下代码,计算平均小费和乘客数量:

import pyarrow.flight as fl

client = fl.FlightClient("grpc://localhost:6379")
token = client.authenticate_basic_token("default", "")

ticket = fl.Ticket(b"SELECT avg(tip_amount), avg(passenger_count) FROM taxis LIMIT 10")
call_options = fl.FlightCallOptions(headers=[token])

try:
    reader = client.do_get(ticket, call_options)

    table = reader.read_all()
    print("Table shape:", table.shape)
    print("Schema:", table.schema)
    print("nData:")
    print(table)
except Exception as e:
    print(f"Error: {e}")
Table shape: (1, 2)
Schema: avg(tip_amount): double not null
avg(passenger_count): double not null

Data:
pyarrow.Table
avg(tip_amount): double not null
avg(passenger_count): double not null
----
avg(tip_amount): [[3.5949154187456926]]
avg(passenger_count): [[1.327664447087808]]

正如前面提到的,ClickHouse 也可以作为 Arrow Flight 客户端使用。这可以通过 arrowFlight 表函数或 ArrowFlight 表引擎来实现。

接着我们就可以像下面这样去查询 Arrow Flight 服务器:

SELECT * 
FROM arrowflight('localhost:6379', 'dataset');

提供初步的 PromQL 支持

贡献者:Vitaly Baranov

本次版本新增了对 PromQL(Prometheus Query Language)的初步支持。你可以在 ClickHouse 客户端中设置 dialect='promql',并通过 promql_table_name='X' 指定一个时间序列表,然后就可以运行类似下面这样的查询:

rate(ClickHouseProfileEvents_ReadCompressedBytes[1m])[5m:1m]

你还可以在 SQL 语句中嵌入 PromQL 查询:

SELECT * 
FROM prometheusQuery('up', ...)

在 25.8 版本中,目前仅支持 rate、delta 和 increase 三个函数。

Azure Blob Storage 性能改进

贡献者:Alexander Sapin

像 AWS S3、GCP 和 Azure Blob Storage 这样的对象存储,本质上都是复杂的分布式系统,各自也有一些“脾气”。延迟问题尤其容易带来麻烦——我们曾观测到偶发的延迟峰值,最高可达 5 秒、10 秒、甚至 15 秒……

几年前,我们通过自研的 HTTP 客户端解决了 AWS 和 GCP 的延迟问题,核心方法包括:

  • 同时使用多个连接访问多个端点

  • 轮换端点以实现更均衡的负载分布

  • 一旦出现软超时,就立即发起第二个请求

  • 通过积极的推测性重试来保障稳定性

现在,我们在 Azure SDK 中也替换了 HTTP 客户端,复用了与 AWS S3 相同的激进重试逻辑,从而解决了 Azure Blob Storage 的延迟问题。

结果是:延迟峰值不复存在!

该优化在默认情况下已启用,如果想切换回之前的实现,可以通过设置 zure_sdk_use_native_client=false 来实现。

征稿启示

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

从硬件到软件:深度解析D435i USB SCP overflow错误的根源与解决方案 本文深入解析Intel RealSense D435i相机在ROS环境下常见的'USB SCP overflow'错误,特别是与`control_transfer`相关的错误提示。从硬件配置到软件优化,详细介绍了如何通过调整USB接口、优化`rs_camera.launch`参数、更新固件驱动等方法解决数据传输溢出问题,提升设备稳定性和性能。 阅读详情

相关推荐

保姆级教程:用C++逆向解析通达信shm.tnf文件(附完整代码与偏移量详解)

本文提供了一份详细的C++逆向工程教程,指导开发者如何解析通达信的shm.tnf文件。通过分析文件结构、定位关键字段并实现完整解析流程,帮助量化交易开发者高效获取沪市股票数据。教程包含完整代码示例和偏移量详解,适合金融数据本地化处理需求。

weixin_27945229的博客 523

chDB 内核升级全记录:ClickHouse 升级至 v25.8.2.29

此次将 ClickHouse 内核从 v24.4 升级至 v25.8.2.29,为 chDB 带来了显著的性能与功能提升。

ClickHouseDB的博客 1114

保姆级教程:用Unity为麒麟系统打包Linux应用(含路径权限全攻略)

本文提供了一份详细的Unity跨平台开发指南,重点介绍如何在麒麟系统上打包和部署Linux应用。从开发环境配置、路径权限处理到性能优化和常见问题解决,全面解析了Unity项目在国产操作系统上的适配流程,帮助开发者高效完成跨平台应用开发。

weixin_28692867的博客 504

ClickHouse 24.1 版本发布说明

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

ClickHouseDB的博客 2659

HIL(硬件在环)技术汇总梳理

HIL(Hardware-in-the-Loop)测试领域的知名公司有dSPACE、NI、Vector和speedgoat等,本文是针对这几家HIL技术的对比分析。

Mr.Cssust的博客 3686

STM32F4+FreeRTOS实战:手把手教你移植LWIP2.1.2(含LAN8720配置避坑指南)

本文提供了一份详尽的实战指南,手把手教你如何在STM32F4平台结合FreeRTOS实时操作系统,成功移植轻量级TCP/IP协议栈LWIP 2.1.2。文章重点剖析了硬件驱动层LAN8720 PHY芯片的配置要点与常见“坑点”,并深入讲解了LWIP与FreeRTOS的深度整合、关键配置及稳定性优化策略,旨在帮助开发者构建稳定可靠的产品级嵌入式网络功能。

ik678901234的博客 1063

ClickHouse 24.11 版本发布说明

本次ClickHouse 24.11版本包含了9个新功能🎁、15项性能优化🛷、68个bug修复🐛

ClickHouseDB的博客 1413

Gitee自动创建PR之——评审模式

一 创建PR的常规操作 本地更新主干(一般为master分支),基于主干新建一个分支并(如Dev分支)切换; 进行新的需求开发; 将这个分支推送到远端; 打开 Gitee ,进入创建 Pull Request 界面; 选定目标分支(及我们需要合并到主干分支的分支,一般即为我们的开发分支); 填写 Title 以及 Description; 点击提交 Pull Request。 二 更快的常见PR的方式— — 评审模式 现在 Gitee.

calm_encode的博客 2990

高级DBA教你ClickHouse数据库无缝升级版本方法全网最详细

安装包要去官网下载 Clickhouse卸载 rpm -qa | grep clickhouse pm -e clickhouse-client-20.12.5.14-2.noarch rpm -e clickhouse-server-20.12.5.14-2.noarch rpm -e clickhouse-common-static-20.12.5.14-2.x86_64 rm -rf /etc/clickhouse-server/ 重新安装 rpm -ivh clickhouse-common-st

nasen512的博客 2503

深入解析fio Benchmark测试:从源码到实践

本文深入解析fio Benchmark测试工具,从入门指南到源码架构分析,详细介绍了其核心模块、关键数据结构和I/O处理机制。通过实战案例展示如何优化存储性能测试,包括内存对齐、多线程调优等技巧,帮助开发者充分利用fio进行精准的存储性能评估。

weixin_42563415的博客 207

【深度学习】Progressive Distillation for Fast Sampling of Diffusion Models

这种方法通过迭代地将一个需要较多步骤的模型(称为教师模型)蒸馏成一个需要较少步骤的学生模型,每次迭代都将采样步骤减半,直到达到所需的采样步骤数量。通过渐进式蒸馏,论文将原始需要8192步采样的模型成功蒸馏为只需4步采样就能取得接近的生成质量的新模型,大幅提高了扩散模型的推理效率。这篇论文提出了一种"渐进式蒸馏"(Progressive Distillation)的方法,来大幅降低用于生成对抗网络(GAN)的扩散模型(Diffusion Model)在推理阶段的采样步数,从而提高其推理效率。

q742971636的博客 1787

ClickHouse版本迁移实战:企业级升级与回滚最佳实践

ClickHouse作为现代大数据分析型数据库管理系统,其版本迭代频率高、功能更新快,为企业用户带来性能提升的同时也带来了版本管理的挑战。本文深度解析ClickHouse版本迁移的核心策略,提供生产环境下的实战指南。 ## 版本演进与兼容性挑战 ClickHouse采用双轨发布策略:**稳定版(Stable)** 和 **长期支持版(LTS)**。根据变更日志分析,2025年已发布v25.9至

gitblog_00864的博客 484

《网络安全自学教程》- Nmap使用及扫描原理分析

使用Nmap进行端口扫描、主机发现、服务识别、操作系统识别、指定脚本、结果导出文件,使用wireshark抓包分析扫描原理。

wangyuxiang946的博客 1万+

ClickHouse 25.2 版本发布说明

ClickHouse 25.2 版本正式发布,本次更新带来了12项全新功能🐣、15项性能优化🥚、72个bug修复🌷

ClickHouseDB的博客 1913

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

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ClickHouse 25.10 版本发布说明

ClickHouse 25.10 版本正式上线,本次更新带来了 20 项新功能 👻、30 项性能优化 🔮 以及 103 个 Bug 修复 🎃

ClickHouseDB的博客 1159

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ClickHouse 25.11 版本发布说明

本次发布新增了 ACME 集成、小型 GROUP BY 的并行合并、投影作为辅助索引等多项实用功能!

ClickHouseDB的博客 997

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ClickHouse 24.10 版本发布说明

本文字数:13817;估计阅读时间:35 分钟作者:ClickHouse Team本文在公众号【ClickHouseInc】首发又到了新版本发布的时间!本次ClickHouse 24.10 版本包含了🎁、🛷、🐛在本次发布中,clickhouse-local 更加实用,新增了复制和计算器模式。可刷新物化视图已达到生产就绪标准,远程文件支持缓存,表克隆操作也得到了简化。正如往常,我们热烈欢迎所有 24.9 版本中的新贡献者!

ClickHouseDB的博客 1746

ClickHouse 23.11 版本发布说明

23.11版本新增25个新功能,实现了24项性能优化,修复了70处bug。

ClickHouseDB的博客 1436

ClickHouse 26.1 版本发布说明

ClickHouse 版本 26.1 包含 25 个新特性 🧤 43 项性能优化 🛷 176 个 bug 修复 ⛄

ClickHouseDB的博客 725

ClickHouse Changelog 条目编写指南:以用户为中心的发布说明写作规范与自动化落地

好的 changelog 条目能让用户快速理解「这次发布带来了什么、对我有什么影响」。本文围绕 ClickHouse 官方编写指南 [docs/changelog_entry_guidelines.md](https://link.gitcode.com/i/fd725caa4a3198e5a9664b84c3f133f8) 展开,结合仓库中的 PR 模板、changelog 自动生成脚本与 CI

gitblog_00260的博客 406

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

ClickHouse v25.9.5.21-stable 发布说明深度解析:7 个 Bug 修复的源码级解读

本文以 [v25.9.5.21-stable 变更日志](https://link.gitcode.com/i/2a88fbe0aef680e8bb81e7f8cfd5714d) 为骨架,逐条解读该稳定版中 7 个用户可见的 Bug 修复与 2 个内部改动。你可以从中掌握:Variant 子列读取、HTTP 分块流异常、Replicated 数据库恢复、`loop` 表函数访问控制、UTF-8 字

gitblog_00030的博客 9

ClickHouse v25.8.8.26-lts 版本解读:崩溃日志同步刷新与 9 项关键 Bug 修复全览

本文以 ClickHouse 官方 LTS 分支的补丁版本 v25.8.8.26-lts 的发布记录为核心,逐条解读该版本在崩溃诊断、协议兼容性、权限校验、查询语义确定性等方向上的修复内容,并结合仓库源码说明其底层实现。读完本文,你将了解本次补丁解决了哪些用户可见问题、修复影响哪些模块,以及如何验证与升级到该版本。 ## 版本概览:一个以稳定性为目标的 LTS 补丁 本次发布记录对应的补丁版本

gitblog_00319的博客 63

ClickHouse v25.8.19.20-lts 版本发布详解:LTS 补丁版 14 项缺陷修复与稳定性增强

> 本文以仓库中的官方版本记录 [docs/changelogs/v25.8.19.20-lts.md](https://link.gitcode.com/i/71bb6b538c8cf1e25fffc3ee868c631c) 为主体,结合 ClickHouse 当前仓库源码,逐条解读该 LTS 补丁版本中新增的改进、缺陷修复与构建改进,并说明每项修复背后的底层实现与影响范围,帮助运维与开发者理解

gitblog_00384的博客 24

ClickHouse 补丁发布体检:诊断 AutoReleases 流水线为何静默停发,并手动补齐缺失的补丁版本

ClickHouse 会对其支持版本(最近 3 个大版本 + 最新 LTS)按约两周一次的节奏自动发布 stable **补丁版本**,驱动者是每日调度的 `AutoReleases` 工作流。但这条流水线会"静默卡死":某个未合并的 version-bump PR 或一个失联的自托管 runner 就能让所有分支停发,而不会有任何显式报错。本文以仓库中的技能文档 [.claude/skills/

gitblog_00013的博客 260

ClickHouse v25.8.25.37-lts 发布解读:安全加固、格式解析器健壮性与备份恢复修复全览

v25.8.25.37-lts 是 ClickHouse 25.8 LTS 分支的一个补丁版本(对比基线为 v25.8.24.21-lts),全部变更均通过官方 backport(回移植)机制进入稳定分支。本版的核心主题是**安全与健壮性**:修复了 HTTP 响应头 CRLF 注入、复制表部件获取协议的路径遍历等多个安全漏洞;针对 Arrow、Parquet、ORC、Avro、MsgPack、J

gitblog_00322的博客 12
上一篇: 我们是如何为 ClickHouse 列式存储构建快速 UPDATE 的 Part3/3:基准测试 1000 倍提速
下一篇: AI 上岗:大模型能否接管 SRE 的值班?
ClickHouseDB
博客等级 码龄3年 1707粉丝 320原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值