博客 / 产品

ClickHouse 22.1 版本新特性

author avatar
Alexey Milovidov
2022年1月26日 - 分钟阅读

22.1 是我们在新年的第一个版本。它包含了来自 133 位贡献者的 2,599 个新提交,其中包括 44 位新贡献者

13DaGGeR, Adri Fernandez, Alexey Gusev, Anselmo D. Adams, Antonio Andelic, Ben, Boris Kuschel, Christoph Wurm, Chun-Sheng, Li, Dao, DimaAmega, Dmitrii Mokhnatkin, Harry-Lee, Justin Hilliard, MaxTheHuman, Meena-Renganathan, Mojtaba Yaghoobzadeh, N. Kolotov, Niek, Orkhan Zeynalli, Rajkumar, Ryad ZENINE, Sergei Trifonov, Suzy Wang, TABLUM.IO, Vitaly Artemyev, Xin Wang, Yatian Xu, Youenn Lebras, dalei2019, fanzhou, gulige, lgbo-ustc, minhthucdao, mreddy017, msirm, olevino, peter279k, save-my-heart, tekeri, usurai, zhoubintao, 李扬.

不要忘记在您的生产服务器上运行 SELECT * FROM system.contributors

让我们描述一下 22.1 中最重要的新功能。

Schema Inference

让我们看下面的查询示例

SELECT * FROM url('https://datasets.clickhouse.com/github_events_v2.native.xz', Native,
$$
    file_time DateTime,
    event_type Enum('CommitCommentEvent' = 1, 'CreateEvent' = 2, 'DeleteEvent' = 3, 'ForkEvent' = 4,
                    'GollumEvent' = 5, 'IssueCommentEvent' = 6, 'IssuesEvent' = 7, 'MemberEvent' = 8,
                    'PublicEvent' = 9, 'PullRequestEvent' = 10, 'PullRequestReviewCommentEvent' = 11,
                    'PushEvent' = 12, 'ReleaseEvent' = 13, 'SponsorshipEvent' = 14, 'WatchEvent' = 15,
                    'GistEvent' = 16, 'FollowEvent' = 17, 'DownloadEvent' = 18, 'PullRequestReviewEvent' = 19,
                    'ForkApplyEvent' = 20, 'Event' = 21, 'TeamAddEvent' = 22),
    actor_login LowCardinality(String),
    repo_name LowCardinality(String),
    created_at DateTime,
    updated_at DateTime,
    action Enum('none' = 0, 'created' = 1, 'added' = 2, 'edited' = 3, 'deleted' = 4, 'opened' = 5, 'closed' = 6, 'reopened' = 7, 'assigned' = 8, 'unassigned' = 9,
                'labeled' = 10, 'unlabeled' = 11, 'review_requested' = 12, 'review_request_removed' = 13, 'synchronize' = 14, 'started' = 15, 'published' = 16, 'update' = 17, 'create' = 18, 'fork' = 19, 'merged' = 20),
    comment_id UInt64,
    body String,
    path String,
    position Int32,
    line Int32,
    ref LowCardinality(String),
    ref_type Enum('none' = 0, 'branch' = 1, 'tag' = 2, 'repository' = 3, 'unknown' = 4),
    creator_user_login LowCardinality(String),
    number UInt32,
    title String,
    labels Array(LowCardinality(String)),
    state Enum('none' = 0, 'open' = 1, 'closed' = 2),
    locked UInt8,
    assignee LowCardinality(String),
    assignees Array(LowCardinality(String)),
    comments UInt32,
    author_association Enum('NONE' = 0, 'CONTRIBUTOR' = 1, 'OWNER' = 2, 'COLLABORATOR' = 3, 'MEMBER' = 4, 'MANNEQUIN' = 5),
    closed_at DateTime,
    merged_at DateTime,
    merge_commit_sha String,
    requested_reviewers Array(LowCardinality(String)),
    requested_teams Array(LowCardinality(String)),
    head_ref LowCardinality(String),
    head_sha String,
    base_ref LowCardinality(String),
    base_sha String,
    merged UInt8,
    mergeable UInt8,
    rebaseable UInt8,
    mergeable_state Enum('unknown' = 0, 'dirty' = 1, 'clean' = 2, 'unstable' = 3, 'draft' = 4),
    merged_by LowCardinality(String),
    review_comments UInt32,
    maintainer_can_modify UInt8,
    commits UInt32,
    additions UInt32,
    deletions UInt32,
    changed_files UInt32,
    diff_hunk String,
    original_position UInt32,
    commit_id String,
    original_commit_id String,
    push_size UInt32,
    push_distinct_size UInt32,
    member_login LowCardinality(String),
    release_tag_name String,
    release_name String,
    review_state Enum('none' = 0, 'approved' = 1, 'changes_requested' = 2, 'commented' = 3, 'dismissed' = 4, 'pending' = 5)
$$)

在这个查询中,我们使用 url 表函数导入数据。数据以 .native.xz 文件的形式发布在 HTTP 服务器上。这个查询最烦人的部分是我们必须指定数据结构和这个文件的格式。

在新的 ClickHouse 22.1 版本中,这变得更加容易

SELECT * FROM url('https://datasets.clickhouse.com/github_events_v2.native.xz')

不能再简单了!这怎么可能?

首先,我们从文件扩展名自动检测数据格式。这里是 .native.xz,所以我们知道数据被 xz (LZMA2) 压缩,并且以 Native 格式表示。Native 格式已经包含了关于列的类型和名称的所有信息,我们只需要读取和使用它。

它适用于每个包含数据类型信息的格式:NativeAvroParquetORCArrow 以及 CSVWithNamesAndTypesTSVWithNamesAndTypes

它适用于每个读取文件的表函数:s3filehdfsurls3ClusterhdfsCluster

底层发生了很多神奇的事情。它不需要将整个文件读取到内存中。例如,Parquet 格式在文件末尾有元数据。因此,我们首先读取头部以找到元数据的位置,然后进行范围请求以读取关于列及其类型的元数据,然后继续读取请求的列。如果文件很小,它将通过单个请求读取。

如果您想从文件中提取结构而不进行数据处理,可以使用 DESCRIBE 查询

DESCRIBE url('https://datasets.clickhouse.com/github_events_v2.native.xz')

数据结构也可以从 JSONEachRowCSVTSVCSVWithNamesTSVWithNamesMsgPackValuesRegexp 格式自动推断。

对于 CSV,推断为 Float64 或 String。对于 JSONEachRow,支持数组类型推断,包括多维数组。非统一类型的数组映射到 Tuples。对象映射到 Map 数据类型。

如果格式没有列名(例如没有标题行的 CSV),则使用名称 c1c2、…。

文件格式从文件扩展名检测:csvtsvnativeparquetpbndjsonorc… 例如,.ndjson 文件被识别为 JSONEachRow 格式,.csv 在 ClickHouse 中被识别为无标题行的 CSV 格式,如果您想要 CSVWithNames,您可以显式指定格式。

我们支持“按需模式”查询。例如,TSV 格式的自动检测数据类型是 Strings,但您可以使用 :: 运算符在查询中细化类型

SELECT c1 AS domain, uniq(c2::UInt64), count() AS cnt
  FROM file('hits.tsv')
  GROUP BY domain ORDER BY cnt DESC LIMIT 10

作为奖励,LineAsStringRawBLOB 格式也获得了类型推断。尝试这个查询,看看我如何喜欢阅读我最喜欢的网站

SELECT extractTextFromHTML(*)
  FROM url('https://news.ycombinator.com/', LineAsString);

模式自动检测也适用于创建 MergeDistributedReplicatedMegreTree 表。当您创建第一个副本时,您必须指定表结构。但是在创建所有后续副本时,您只需要 CREATE TABLE hits ENGINE = ReplicatedMegreTree(…) 而无需列出列 - 定义将从另一个副本复制。

此功能由 Pavel Kruglov 实现,灵感来自 Igor Baliuk 的初步工作,并由 ZhongYuanKai 进行了补充。

clickhouse-client 中的实时资源使用情况

clickhouse-client 是我最喜欢的 ClickHouse 用户界面。它是一个友好的命令行应用程序的典范。

现在它直接在进度条中显示查询的实时 CPU 和内存使用情况

Image1clickhouse-22.webp

对于分布式查询,我们同时显示总内存使用量和每个主机的最大内存使用量。

此功能的实现得益于 Dmitry Novik 实现的分布式指标转发。我已将这个小的可视化添加到 clickhouse-client 中,现在可以在每个使用原生 ClickHouse 协议的客户端中添加类似的信息。

副本上的并行查询处理

ClickHouse 是一种分布式 MPP DBMS。它可以扩展以使用一台服务器上的所有 CPU 核心,并横向扩展以使用集群中多个分片的计算资源。

但是每个分片通常包含多个副本。默认情况下,ClickHouse 仅使用每个分片上的一个副本的资源。例如,如果您有一个由 6 台服务器组成的集群,其中包含 3 个分片,每个分片上有两个副本,则查询将仅使用三台服务器,而不是全部六台。

有一个选项可以启用 max_parallel_replicas,但该选项需要指定“采样键”,使用起来不方便,并且扩展性不好。

现在我们有一个设置来启用新的并行处理算法:allow_experimental_parallel_reading_from_replicas。如果启用此设置,副本将动态选择并在它们之间分配工作。

即使副本具有较低或较高的计算资源量,它也能完美工作。即使某些副本过时,它也能给出完整的结果。

此功能由 Nikita Mikhaylov 实现

服务发现

在集群中添加或删除节点时,现在您无需在每台服务器上编辑配置。只需使用自动集群,服务器将自行注册

<allow_experimental_cluster_discovery>1
</allow_experimental_cluster_discovery>

<remote_servers>
    <auto_cluster>
        <discovery>
            <path>/clickhouse/discovery/auto_cluster</path>
            <shard>1</shard>
        </discovery>
    </auto_cluster>
</remote_servers>

添加新副本时无需编辑配置!

此功能由 Vladimir Cherkasov 实现。

列的稀疏编码

如果列主要包含零,我们可以以稀疏格式对其进行编码,并自动优化计算!

这是一种特殊的列编码,类似于 LowCardinality,但它是完全透明的并且自动工作。

CREATE TABLE test.hits …
ENGINE = MergeTree ORDER BY …
SETTINGS ratio_of_defaults_for_sparse_serialization = 0.9

它允许更好地压缩数据并优化计算,因为稀疏列中的数据将直接以内存中的稀疏格式处理。

稀疏或完整格式的选择基于在插入时计算并在后台合并时更新的列统计信息。

Anton Popov 开发。

我们还希望使 LowCardinality 编码自动化,敬请期待!

ClickHouse 的诊断工具

这是 Yandex Cloud 团队的礼物。他们有一个工具来收集关于 ClickHouse 实例的报告,以提供支持所需的所有信息。他们决定将此工具贡献给开源!

您可以在这里找到该工具:utils/clickhouse-diagnostics

Alexander Burmak 开发。

集成

22.1 中添加了许多新的集成

Hive 集成作为 SELECT 查询的外部表引擎,由 Taiyang Li 贡献,并由 Ksenia Sumarokova 审核。

Azure Blob Storage 集成,类似于 S3,由 Jakub Kuklis 贡献,并由 Ksenia Sumarokova 审核。

支持类似于 s3ClusterhdfsCluster 表函数,由 Zhichang Yu 贡献,并由 Nikita Mikhailov 审核。

统计函数

我希望您一直梦想在 ClickHouse 中计算 Cramer’s V 和 Theil’s U 系数,因为现在我们为您提供了这些函数,您必须处理它。

:) SELECT cramersV(URL, URLDomain) FROM test.hits

0.98

:) SELECT cramersV(URLDomain, ResolutionWidth) FROM test.hits

0.27

它可以计算分类(离散)值之间某种程度的依赖关系。您可以这样想象:有一个相关函数 corr,但它仅适用于线性依赖关系;有一个秩相关函数 rankCorr,但它仅适用于有序值。现在有一些函数可以计算离散值的某些东西。

开发者:Artem TsyganovIvan BelyaevAlexey Milovidov

… 以及更多

阅读 完整更新日志 以了解 22.1 版本,并关注 路线图

分享这篇文章

订阅我们的新闻邮件

及时了解功能发布、产品路线图、支持和云服务!
正在加载表单...
关注我们
X imageSlack imageGitHub image
Telegram imageMeetup imageRss image