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

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

3天内不再提示

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

倩倩 来源:芋道源码 作者:芋道源码 2022-09-22 14:26 次阅读

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

• 缺少完整的upsert和delete操作

• 多表关联查询能力弱

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

• 没有资源隔离能力

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

实时人群圈选场景遇到的难题

在电商业务中,人群圈选是非常常见的一个场景。字节原有的离线圈选的方案是以T+1的方式更新数据,而不是实时更新,这很影响业务侧的体验。现在希望能够基于实时标签,在数据管理平台中构建实时人群圈选的能力。整体数据链路如下:

3b2cc968-3a3d-11ed-9e49-dac502259ad0.png

为了保证实时数据和离线数据同时提供服务,在标签接入完毕后,在ClickHouse中完成宽表加工任务。但是原生ClickHouse只支持追加写的能力,只有ReplacingMergeTree这种方案。但是选用ReplacingMergeTree引擎的限制比较多,不能满足业务的需求,主要体现在:

• 性能下降严重,ReplacingMergeTree采用的是写优先的设计逻辑,这导致读性能损失严重。表现是在进行查询时性能较ClickHouse其他引擎的性能下降严重,涉及ReplacingMergeTree的查询响应时间过慢。

• ReplacingMergeTree引擎只支持数据的更新,并不支持数据的删除。只能通过CollaspingMergeTree来实现数据清除,通过不同的表引擎分别提供更新删除能力会让系统复杂度进一步提升。

• ReplacingMergeTree中的去重是 Merge 触发的,在刚导入的数据时是不去重的,过一段时间后才会在分区内去重。

ByteHouse的解决方案:UniqueMergeTree

在这种情况下,字节在ByteHouse(火山引擎上基于ClickHouse能力增强的版本)中开发了一种支持实时更新删除的表引擎:UniqueMergeTree。UniqueMergeTree与以往的表引擎有什么差别呢?下面介绍两种支持实时更新的常见技术方案:

原生ClickHouse选择的技术方案

原生ClickHouse的更新表引擎ReplacingMergeTree使用Merge on Read的实现逻辑,整个思想比较类似LSMTree。对于写入,数据先根据key排序,然后生成对应的列存文件。每个Batch写入的文件对应一个版本号,版本号能用来表示数据的写入顺序。

同一批次的数据不包含重复key,但不同批次的数据包含重复key,这就需要在读的时候去做合并,对key相同的数据返回去最新版本的值,所以叫merge on read方案。原生ClickHouse ReplacingMergeTree用的就是这种方案。

大家可以看到,它的写路径是非常简单的,是一个很典型的写优化方案。它的问题是读性能比较差,有几方面的原因。首先,key-based merge通常是单线程的,比较难并行。其次merge过程需要非常多的内存比较和内存拷贝。最后这种方案对谓词下推也会有一些限制。大家用过ReplacingMergeTree的话,应该对读性能问题深有体会。

这个方案也有一些变种,比如说可以维护一些index来加速merge过程,不用每次merge都去做key的比较。

面向读优化的新方案

UniqueMergeTree使用的技术方案Mark-Delete + Insert方案刚好反过来,是一个读优化方案。在这个方案中,更新是通过先删除再插入的方式实现的。

3b620326-3a3d-11ed-9e49-dac502259ad0.png

Ref “Enhancements to SQLServer Column Stores”

下面以SQLServer的Column Stores为例介绍下这个方案。图中,每个RowGroup对应一个不可变的列存文件,并用Bitmap来记录每个RowGroup中被标记删除的行号,即DeleteBitmap。处理更新的时候,先查找key所属的RowGroup以及它在RowGroup中行号,更新RowGroup的DeleteBitmap,最后将更新后的数据写入Delta Store。查询的时候,不同RowGroup的扫描可以完全并行,只需要基于行号过滤掉属于DeleteBitmap的数据即可。

这个方案平衡了写和读的性能。一方面写入时需要去定位key的具体位置,另一方面需要处理write-write冲突问题。

这个方案也有一些变种。比如说写入时先不去查找更新key的位置,而是先将这些key记录到一个buffer中,使用后台任务将这些key转成DeleteBitmap。然后在查询的时候通过merge on read的方式处理buffer中的增量key。

Upsert和Delete使用示例

首先我们建了一张UniqueMergeTree的表,表引擎的参数和ReplacingMergeTree是一样的,不同点是可以通过UNIQUE KEY关键词来指定这张表的唯一键,它可以是多个字段,可以包含表达式等等。

3b8a6fd2-3a3d-11ed-9e49-dac502259ad0.png

下面对这张表做写入操作就会用到upsert的语义,比如说第6行写了四条数据,但只包含1和2两个key,所以对于第7行的select,每个key只会返回最高版本的数据。对于第11行的写入,key 2是一个已经存在的key,所以会把key 2对应的name更新成B3; key 3是新key,所以直接插入。最后对于行删除操作,我们增加了一个delete flag的虚拟列,用户可以通过这个虚拟列标记Batch中哪些是要删除,哪些是要upsert。

UniqueMergeTree表引擎的亮点

• 对于Unique表的写入,我们会采用upsert的语义,即如果写入的是新key,那就直接插入数据;如果写入的key已经存在,那就更新对应的数据。

• UniqueMergeTree表引擎既支持行更新的模式,也支持部分列更新的模式,用户可以根据业务要求开启或关闭。

• ByteHouse也支持指定Unique Key的value来删除数据,满足实时行删除的需求。支持指定一个版本字段来解决回溯场景可能出现的低版本数据覆盖高版本数据的问题。

• 最后ByteHouse也支持数据在多副本的同步,避免整体系统存在单点故障。

在性能方面,我们对UniqueMergeTree的写入和查询性能做了性能测试,结果如下图(箭头前是ReplacingMergeTree的消耗时间,箭头后是UniqueMergeTree的消耗时间)。

3ba2f660-3a3d-11ed-9e49-dac502259ad0.png

可以看到,与ReplacingMergeTree相比,UniqueMergeTree的写入性能虽然略有下降,但在查询性能上取得了数量级的提升。我们进一步对比了UniqueMergeTree和普通MergeTree的查询性能,发现两者是非常接近的。

增强后的实施人群圈选

经过UniqueMergeTree的加持,在原有架构不变的情况下,完美的满足了实时人群圈选场景的要求。

1、通过Unique Key配置唯一键,提供upsert更新写语义,查询自动返回每个唯一键的最新

2、性能:单shard写入吞吐可以达到10k+行/s;查询性能与原生CH表几乎相同

3、支持根据Unique Key实时删除数据

此外,ByteHouse还通过UniqueMergeTree支持了一些其他特性:

1、唯一键支持多字段和表达式

2、支持分区级别唯一和表级别唯一两种模式

3、支持自定义版本字段,写入低版本数据时自动忽略

4、支持多副本部署,通过主备异步复制保障数据可靠性

不仅在实时人群圈选场景,ByteHouse提供的upsert能力已经服务于字节内部众多应用,线上应用的表数量有数千张,受到实时类应用的广泛欢迎。

除Upsert能力外,ByteHouse在为原生ClickHouse的企业级能力进行了全方位的增强。下一期,我们将介绍ClickHouse增强计划之“多表关联查询”,大家有兴趣一定不要错过。

审核编辑 :李倩

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

    关注

    1

    文章

    344

    浏览量

    22278
  • 数据分析
    +关注

    关注

    2

    文章

    1352

    浏览量

    33736
  • key
    key
    +关注

    关注

    0

    文章

    44

    浏览量

    12744

原文标题:火山引擎:ClickHouse增强计划之“Upsert”

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

收藏 人收藏

    评论

    相关推荐

    苹果公司计划将谷歌的Gemini人工智能引擎集成到iPhone中

    据熟悉情况的人士向彭博透露,苹果公司正在与谷歌进行谈判,计划将谷歌的Gemini人工智能引擎集成到iPhone中,这为一项可能震撼AI行业的重大协议奠定了基础。
    的头像 发表于 03-19 11:08 362次阅读

    第五代英特尔至强可扩展处理器助力火山引擎应用性能提升

    近日,火山引擎在成都成功举办了西南地区首场公共云·城市分享会活动。此次活动以“乘云·向未来”为主题,汇聚了众多技术领域的专家,共同探讨企业规模化用云实践及AI创新实践,致力于探索“云+AI”的发展新趋势,为西南地区企业的数字化、智能化升级提供全面的产品技术服务。
    的头像 发表于 03-16 09:34 537次阅读

    ClickHouse 联合创始人、前 Google 副总裁 Yury 到访杭州玖章算术公司,双方建立生态合作

    10 月 31 日,ClickHouse 联合创始人 Yury 到访未来科技城,与玖章算术创始人叶正盛和国际总经理 Ni Demai 展开沟通与推进合作。ClickHouse 是深受开发者青睐的实时
    的头像 发表于 11-17 11:23 480次阅读
    <b class='flag-5'>ClickHouse</b> 联合创始人、前 Google 副总裁 Yury 到访杭州玖章算术公司,双方建立生态合作

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

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

    2023 NVIDIA 初创企业展示北京站(火山引擎专场)圆满收官!

    创业光芒持续绽放,半程展示即将开启! 9 月 21 日,由 NVIDIA 主办的 2023 NVIDIA 初创企业展示北京站(火山引擎专场)成功举办。 此次北京站(火山引擎专场)由
    的头像 发表于 09-26 18:35 520次阅读
    2023 NVIDIA 初创企业展示北京站(<b class='flag-5'>火山</b><b class='flag-5'>引擎</b>专场)圆满收官!

    NVIDIA 助力火山引擎开源多媒体处理框架 BMF,将抖音、西瓜视频的先进技术推向千行百业

    案例介绍 火山引擎通过与 NVIDIA 团队合作开发了 BMF(Babit Media Framework,多媒体处理框架) ,提供了丰富的 GPU 即用模块,低门槛的扩展方式,多语言接口以及各类
    的头像 发表于 09-19 11:10 615次阅读
    NVIDIA 助力<b class='flag-5'>火山</b><b class='flag-5'>引擎</b>开源多媒体处理框架 BMF,将抖音、西瓜视频的先进技术推向千行百业

    性价比提升30%+,火山引擎第三代AMD实例 ECS g3a邀测上线

    火山引擎面向通用场景的第三代AMD实例产品g3a已正式邀测上线,该实例搭载全新一代AMD Genoa平台处理器,单核睿频达 3.7GHz,基于火山全新自研DPU软硬件一体架构设计,结合自研虚拟
    的头像 发表于 09-01 10:49 221次阅读
    性价比提升30%+,<b class='flag-5'>火山</b><b class='flag-5'>引擎</b>第三代AMD实例 ECS g3a邀测上线

    集成ARM Mobile Studio和虚幻引擎1.0版

    您可以在您的非真实引擎游戏中添加仪表, 以便您可以在 Arm Moved Studio 中分别分析不同区域。 例如, 当您生成一个绩效顾问报告时, 区域名称可以在框架费率分析图表中看到, 而报告包含
    发表于 08-28 06:12

    字节跳动旗下火山引擎自研的视频编解码芯片已出片

    字节跳动旗下火山引擎自研的视频编解码芯片已出片 在8月22日的一场活动中,据字节跳动视频架构负责人、火山引擎视频云架构技术总监王悦介绍,字节跳动旗下
    的头像 发表于 08-23 18:56 1684次阅读

    人工智能引擎是什么?人工智能引擎的作用?人工智能引擎有哪些?

    人工智能引擎是什么?人工智能引擎的作用?人工智能引擎有哪些? 人工智能引擎是一种计算机程序或软件工具,它使用人工智能技术和算法来执行各种任务和功能。它们被设计用来处理大量的数据,从中提
    的头像 发表于 08-15 16:07 1972次阅读

    日增320TB数据,从ClickHouse迁移至ByConity后,查询性能十分稳定!

    早期这套系统部署在ClickHouse集群,一方面,由于业务的高速发展导致数据量日益膨胀,每日最大新增数据超过320TB,每日新增行数超过2.3万亿条,用户数据维度超过2万多个;另一方面,用户查询需求更加灵活和多样化,需要同时支持明细查询、聚合查询以及交互式分析查询
    的头像 发表于 08-04 15:37 368次阅读
    日增320TB数据,从<b class='flag-5'>ClickHouse</b>迁移至ByConity后,查询性能十分稳定!

    NVIDIA 助力火山引擎体验创新科技峰会,带您掌握最新大模型生态与趋势!

    2023 火山引擎 V-Tech 体验创新峰会 于今日圆满落幕!本次峰会主题围绕着「体验创新」,聚焦大模型热点,携手模型企业及应用企业,共议未来 “多云多模型” 时代下的大模型生态建设。作为本次
    的头像 发表于 06-28 21:25 292次阅读
    NVIDIA 助力<b class='flag-5'>火山</b><b class='flag-5'>引擎</b>体验创新科技峰会,带您掌握最新大模型生态与趋势!

    资深开发者眼中的开源云原生数仓 ByConity

    于 2022 年计划开源,2023 年 1 月发布 beta 0.1.0 版本,一些关注字节 ClickHouse 使用情况的的开发者在 ByConity 开源初期便进行了一些测试,如华为终端云
    的头像 发表于 06-06 16:38 544次阅读

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

       引言 这篇文章还是关于 ClickHouse 提供 Postgres 集成系列文章的一部分。在上一篇文章中,我们探讨了 Postgres 函数和表引擎,并以分析工作负载为例,演示了如何将事务
    的头像 发表于 05-26 11:38 449次阅读
    如何使用原生<b class='flag-5'>ClickHouse</b>函数和表<b class='flag-5'>引擎</b>在两个数据库之间迁移数据

    Spectrum仪器为危险火山预警系统提供ADC卡

    Spectrum仪器的PCIe数字化卡可发现6公里范围内的最小移动 中国北京,2023年5月10日讯 —— 中美洲的危地马拉有三座活火山,它们附近都有村庄,因此建立早期的火山爆发预警系统对于挽救
    的头像 发表于 05-10 14:14 217次阅读