DoubleCloud 即将停止服务。请迁移到 ClickHouse,并享受限时免费迁移服务。立即联系我们 ->->

博客 / 产品

ClickHouse 22.1 新特性

author avatar
Alexey Milovidov
2022年1月26日

22.1 是我们新一年的第一个版本。它包含了来自 133 位贡献者的 2599 个新的提交,其中包括 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 中最重要的新特性。

模式推断

让我们以以下查询为例

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,支持数组类型的推断,包括多维数组。非统一类型的数组映射到元组。对象映射到 Map 数据类型。

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

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

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

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 和内存使用情况

图片1clickhouse-22.webp

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

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

副本上的并行查询处理

ClickHouse 是一个分布式 MPP 数据库管理系统。它可以扩展以利用一台服务器上的所有 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 Tsyganov**、**Ivan Belyaev**、**Alexey Milovidov**。

……以及更多

阅读22.1版本的完整变更日志并关注路线图

分享此帖子

订阅我们的新闻稿

随时了解功能发布、产品路线图、支持和云产品信息!
加载表单…
关注我们
Twitter imageSlack imageGitHub image
Telegram imageMeetup imageRss image