0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

火山引擎:ClickHouse增强计划之“多表关联查询”

jf_ro2CN3Fa 来源:芋道源码 作者:芋道源码 2022-10-10 17:00 次阅读

相信大家都对大名鼎鼎的ClickHouse有一定的了解了,它强大的数据分析性能让人印象深刻。但在字节大量生产使用中,发现了ClickHouse依然存在了一定的限制。例如:

• 缺少完整的upsert和delete操作

• 多表关联查询能力弱

• 集群规模较大时可用性下降(对字节尤其如此)

• 没有资源隔离能力

因此,我们决定将ClickHouse能力进行全方位加强,打造一款更强大的数据分析平台。后面我们将从五个方面来和大家分享,此前为大家介绍了字节是如何为ClickHouse补全更新删除能力的,本篇将详细介绍我们是如何加强ClickHouse多表关联查询能力。

大宽表的局限

数据分析的发展历程,可以看作是不断追求分析效率和分析灵活的过程。分析效率是非常重要的,但是并不是需要无限提升的。1秒返回结果和1分钟返回结果的体验是天壤之别,但是0.1秒返回结果和1秒返回结果的差距就没那么大了。因此,在满足了一定时效的情况下,分析的灵活性就显得额外重要了。

起初,数据分析都采用了固定报表的形式,格式更新频率低,依赖定制化的开发,查询逻辑是写死的。对于业务和数据需求相对稳定、不会频繁变化的场景来说固定报表确实就足够了,但是以如今的视角来看,完全固定的查询逻辑不能充分发挥数据的价值,只有通过灵活的数据分析,才能帮助业务人员化被动为主动,探索各数据间的相关关系,快速找到问题背后的原因,极大地提升工作效率。。

后面,基于预计算思想的cube建模方案被提出。通过将数据ETL加工后存储在cube中,保证领导和业务人员能够快速得到分析结果基础上,获得了一定的分析灵活性。不过由于维度固定,以及数据聚合后基本无法查询明细数据,依然无法满足Adhoc这类即席查询的场景需求。

近些年,以ClickHouse为代表的具备强大单表性能的查询引擎,带来了大宽表分析的风潮。所谓的大宽表,就是在数据加工的过程中,将多张表通过一些关联字段打平成一张宽表,通过一张表对外提供分析能力。基于ClickHouse单表性能支撑的大宽表模式,既能提升分析时效性又能提高数据查询和分析操作的灵活性,是目前非常流行的一种模式。

然而大宽表依然有它的局限性,具体有:

• 生成每一张大宽表都需要数据开发人员不小的工作量,而且生成过程也需要一定的时间

• 生成宽表会产生大量的数据冗余

刚才有提到,数据分析的发展历程可以看作是不断追求分析效率和分析灵活的过程,那么大宽表的下一个阶段呢?如果ClickHouse的多表关联查询能力足够强,是不是连“将数据打平成宽表”这个步骤也可以省略,只需要维护好对外服务的接口,任何业务人员的需求都现场直接关联查询就可以了呢?

ByteHouse是如何强化多表关联查询能力的?

ClickHouse 的执行模式相对比较简单,其基本查询模式分为 2 个阶段:

902ab146-4857-11ed-a3b6-dac502259ad0.png

ByteHouse 进行多表关联的复杂查询时,采用分 Stage 的方式,替换目前 ClickHouse的2阶段执行方式。将一个复杂的 Query 按照数据交换情况切分成多个 Stage,Stage 和 Stage 之间通过 exchange 完成数据的交换,单个 Stage 内不存在数据交换。Stage 间的数据交换主要有以下三种形式:

• 按照单(多)个 key 进行 Shuffle

• 由 1 个或者多个节点汇聚到一个节点 (我们称为 gather)

• 同一份数据复制到多个节点(也称为 broadcast 或者说广播)

单个 Stage 执行会继续复用 ClickHouse 的底层的执行方式。

按照不同的功能切分不同的模块,设计目标如下:

各个模块约定好接口,尽量减少彼此的依赖和耦合。一旦某个模块有变动不会影响别的模块,例如 Stage 生成逻辑的调整不影响调度的逻辑。

模块采用插件的架构,允许模块根据配置灵活支持不同的策略。

根据数据的规模和分布,ByteHouse支持了多种关联查询的实现,目前已经支持的有:

Shuffle Join,最通用的 Join

Broadcast Join,针对大表 Join 小表的场景,通过把右表广播到左表的所有 worker 节点来减少左表的传输

Colocate Join,针对左右表按照 Join key 保持相通分布的场景,减少左右表数据传输

Join 算子通常是 OLAP 引擎中最耗时的算子。如果想优化 Join 算子,可以有两种思路,一方面可以提升 Join 算子的性能,例如更好的 Hash Table 实现和 Hash 算法,以及更好的并行。另一方面可以尽可能减少参与 Join 计算的数据。

Runtime Filter 在一些场景特别是事实表 join 维度表的星型模型场景下会有比较大的效果。因为这种情况下通常事实表规模比较大,而大部分过滤条件都在维度表上,事实表可能要全量 join 维度表。Runtime Filter 的作用是通过在 Join 的 probe 端(就是左表)提前过滤掉那些不会命中 Join 的输入数据来大幅减少 Join 中的数据传输和计算,从而减少整体的执行时间。以下图为例,

9044200e-4857-11ed-a3b6-dac502259ad0.png

改善后的效果

以SSB 100G测试集为例,不把数据打成大宽表的情况下,分别使用 ClickHouse 22.2.3.1版本和ByteHouse 2.0.1版本,在相同硬件环境下进行测试。(无数据表示无法返回结果或超过60s)

90ce4702-4857-11ed-a3b6-dac502259ad0.png

可以看到大多数测试中,ClickHouse都会发生报错无法返回结果的情况,而ByteHouse能够稳定的在1s内跑出结果。

只看SSB的多表测试有些抽象,下面从两个具体的case来看一下优化后的效果:。

Case1:Hash Join 右表为大表

经过优化后,query 执行时间从17.210s降低至1.749s。

lineorder 是一张大表,通过 shuffle 可以将大表数据按照 join key shuffle 到每个 worker 节点,减少了右表构建的压力。

SELECT
sum(LO_REVENUE)-sum(LO_SUPPLYCOST)ASprofit
FROM
customer
INNERJOIN
(
SELECT
LO_REVENUE,
LO_SUPPLYCOST,
LO_CUSTKEY
from
lineorder
WHEREtoYear(LO_ORDERDATE)=1997andtoMonth(LO_ORDERDATE)=1
)aslineorder
ONLO_CUSTKEY=C_CUSTKEY
WHEREC_REGION='AMERICA'

Case 2:5张表 Join(未开启runtime filter)

经优化后,query 执行时间从8.583s降低至4.464s。

所有的右表可同时开始数据读取和构建。为了和现有模式做对比,ByteHouse这里并没有开启 runtime filter,开启 runtime filter 后效果会更快。

SELECT
D_YEAR,
S_CITY,
P_BRAND,
sum(LO_REVENUE)-sum(LO_SUPPLYCOST)ASprofit
FROMssb1000.lineorder
INNERJOIN
(
SELECTC_CUSTKEY
FROMssb1000.customer
WHEREC_REGION='AMERICA'
)AScustomerONLO_CUSTKEY=C_CUSTKEY
INNERJOIN
(
SELECT
D_DATEKEY,
D_YEAR
FROMdate
WHERE(D_YEAR=1997)OR(D_YEAR=1998)
)ASdatesONLO_ORDERDATE=toDate(D_DATEKEY)
INNERJOIN
(
SELECT
S_SUPPKEY,
S_CITY
FROMssb1000.supplier
WHERES_NATION='UNITEDSTATES'
)ASsupplierONLO_SUPPKEY=S_SUPPKEY
INNERJOIN
(
SELECT
P_PARTKEY,
P_BRAND
FROMssb1000.part
WHEREP_CATEGORY='MFGR#14'
)ASpartONLO_PARTKEY=P_PARTKEY
GROUPBY
D_YEAR,
S_CITY,
P_BRAND
ORDERBY
D_YEARASC,
S_CITYASC,
P_BRANDASC
SETTINGSenable_distributed_stages=1,exchange_source_pipeline_threads=32

经过多表关联查询能力的增强,ByteHouse能够更加全面的支撑各类业务,用户可以根据场景选择是否将数据打成大宽表,均能获得非常良好的分析体验。

之所以ByteHouse在多表关联场景表现如此出色,其中一大原因就是因为字节自研了查询优化器,弥补了社区ClickHouse的一大不足。查询优化器都能带来哪些体验上的优化?字节是如何实现查询优化器的?我们会在下一期为大家详细介绍。

ByteHouse已经全面对外服务,并且提供各种版本以满足不同类型用户的需求。在ByteHouse官网上提交试用信息即可免费试用

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3441

    浏览量

    92421
  • 引擎
    +关注

    关注

    1

    文章

    344

    浏览量

    22280
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66814
  • 数据分析
    +关注

    关注

    2

    文章

    1353

    浏览量

    33738
  • Join
    +关注

    关注

    0

    文章

    9

    浏览量

    3105

原文标题:火山引擎:ClickHouse增强计划之“多表关联查询”

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    《Visual C# 2008程序设计经典案例设计与实现》---多表连接条件查询

    《Visual C# 2008程序设计经典案例设计与实现》---多表连接条件查询.zip
    发表于 06-21 22:55

    《Visual C# 2008程序设计经典案例设计与实现》---多表连接条件查询

    《Visual C# 2008程序设计经典案例设计与实现》---多表连接条件查询.zip
    发表于 06-25 16:30

    聚合查询与分组查询

    Django模型层之多表操作(五)聚合查询与分组查询
    发表于 09-19 11:21

    多表查询和子查询

    多表查询查询
    发表于 03-06 16:14

    Centos7下如何搭建ClickHouse列式存储数据库

    查询。不支持窗口函数和相关子查询。按照主键对数据进行排序,这将帮助ClickHouse以几十毫秒的低延迟对数据进行特定值查找或范围查找。(7)向量引擎为了高效的使用CPU,数据不仅仅
    发表于 01-05 18:03

    基于关联规则与聚类算法的查询扩展算法

    基于关联规则与聚类算法的查询扩展算法:针对信息检索中查询关键词与文档用词不匹配的问题,提出一种基于关联规则与聚类算法的查询扩展算法。该算法在
    发表于 10-17 23:00 12次下载

    基于多表的动态查询模块设计与实现

    查询是信息管理系统中使用涉及用户最多使用最频繁的功能。为了提高用户查询的灵活性与查询效率,设计了基于多表的动态查询模块,使得用户可以自己选择
    发表于 04-20 10:13 25次下载
    基于<b class='flag-5'>多表</b>的动态<b class='flag-5'>查询</b>模块设计与实现

    火山引擎视频云科技原力峰会于2月25日顺利召开

    2月25日,火山引擎视频云科技原力峰会顺利召开。 火山引擎视频云是如何发展起来的?火山引擎要做什
    的头像 发表于 03-02 14:30 966次阅读
    <b class='flag-5'>火山</b><b class='flag-5'>引擎</b>视频云科技原力峰会于2月25日顺利召开

    火山引擎ClickHouse增强计划之“Upsert”

    性能下降严重,ReplacingMergeTree采用的是写优先的设计逻辑,这导致读性能损失严重。表现是在进行查询时性能较ClickHouse其他引擎的性能下降严重,涉及ReplacingMergeTree的
    的头像 发表于 09-22 14:26 1368次阅读

    如何为ClickHouse增强高可用能力

    相信大家都对大名鼎鼎的ClickHouse有一定的了解了,它强大的数据分析性能让人印象深刻。但在字节大量生产使用中,发现了ClickHouse依然存在了一定的限制。例如:
    的头像 发表于 10-31 15:00 879次阅读

    深度解读火山引擎官方操作系统veLinux

    面向希望获得火山引擎上极致操作系统体验的用户,针对火山引擎公有云环境进行了深度定制与优化,适用于各种云场景工作负载,尤其针对高并发、高 I/O 和混部场景进行优化适配。
    的头像 发表于 11-03 15:03 978次阅读

    ClickHouse增强计划之“资源隔离”

    ClickHouse的资源管控能力不够完善,在 insert、select 并发高的场景下会导致执行失败,影响用户体验。这是因为社区版ClickHouse目前仅提供依据不同用户的最大内存控制,在超过阈值时会杀死执行的 query。
    的头像 发表于 11-07 10:25 590次阅读

    如何使用原生ClickHouse函数和表引擎在两个数据库之间迁移数据

    将展示如何使用 Postgres 表引擎将分析查询的结果从 ClickHouse 推回 Postgres。当用户需要在终端用户应用程序中显示汇总数据,但又
    的头像 发表于 05-26 11:38 450次阅读
    如何使用原生<b class='flag-5'>ClickHouse</b>函数和表<b class='flag-5'>引擎</b>在两个数据库之间迁移数据

    英特尔助力火山引擎 推动数据飞轮加速运转

    驱动的新范 会上,火山引擎提出了数据驱动的新范式——数据飞轮。针对以往企业“有数据,但不驱动”的问题,数据飞轮以数据消费为核心,使企业数据流充分融入业务流,增强业务发展动力。 如今,大模型技术的发展,将为数据飞轮带来新的升级。通
    的头像 发表于 10-13 21:10 784次阅读
    英特尔助力<b class='flag-5'>火山</b><b class='flag-5'>引擎</b> 推动数据飞轮加速运转

    sql关联查询中的主表和从表

    SQL关联查询是数据库中非常重要的一项操作,用于联合多个表中的数据,并根据指定的条件进行筛选和整合,从而得到更加丰富和准确的结果集。在关联查询中,主表和从表起着不同的作用,通过合理的关联方式和条件
    的头像 发表于 11-23 11:41 509次阅读