写点什么

ByConity BSP 解锁数据仓库新未来

作者:Swift社区
  • 2024-12-25
    上海
  • 本文字数:3794 字

    阅读完需:约 12 分钟

ByConity BSP 解锁数据仓库新未来

前言

在现代数据分析场景中,实时数仓与离线数仓各有侧重:实时数仓注重低延迟的数据入库与即时分析能力,而离线数仓则强调复杂任务的稳定执行及高效的内存管理。为满足用户多样化的数据需求,ByConity 作为一款开源云原生数据仓库,提供了全新的 BSP 模式,大幅提升了数据仓库的适用场景与性能表现。

BSP 模式简介

BSP 模式(Bulk Synchronous Parallel)为 ByConity 带来了以下关键能力:


  1. Task 级容错:在数据处理过程中实现更高效的错误恢复机制,确保任务的稳定性。

  2. 更细粒度的调度:以任务为单位进行资源调度,优化计算资源的使用效率。

  3. 资源感知调度:根据当前资源情况动态调整任务分配,提升并行执行的效率。


通过 BSP 模式,ByConity 实现了一站式的数据接入、加工和分析流程,为用户提供了更加便捷、高效的数据分析工具。

基于 TPC-DS 的 ELT 活动

为了让用户直观感受 BSP 模式的强大性能,ByConity 提供了基于 TPC-DS 1TB 数据集 的测试活动。以下是完整的测试过程分享。

测试环境

测试环境基于火山引擎 ECS,采用以下配置:


登录 ECS

根据活动提供的登录凭据,通过 SSH 连接到远程 ECS 服务器。以下为登录过程:


  • MacOS 用户

  • 打开终端,输入以下命令并回车:


    ssh -p 23 root@14.103.145.182
复制代码


  • 输入 yes 确认连接,并输入提供的登录密码。

  • 避免断连:创建 tmux 会话:


  tmux new -s your_session_name
复制代码



  • 启动客户端:


  clickhouse client --port 9010
复制代码


数据查询配置

  • 切换至测试数据库:


  use test_elt;
复制代码



  • 设置 SQL 方言:


  set dialect_type = 'ANSI';
复制代码


执行 02.sql

执行 TPC-DS 测试集查询, source 02.sql; 如下:


with wscs as (select sold_date_sk        ,sales_price  from (select ws_sold_date_sk sold_date_sk              ,ws_ext_sales_price sales_price        from web_sales         union all        select cs_sold_date_sk sold_date_sk              ,cs_ext_sales_price sales_price        from catalog_sales) x), wswscs as  (select d_week_seq,        sum(case when (d_day_name='Sunday') then sales_price else null end) sun_sales,        sum(case when (d_day_name='Monday') then sales_price else null end) mon_sales,        sum(case when (d_day_name='Tuesday') then sales_price else  null end) tue_sales,        sum(case when (d_day_name='Wednesday') then sales_price else null end) wed_sales,        sum(case when (d_day_name='Thursday') then sales_price else null end) thu_sales,        sum(case when (d_day_name='Friday') then sales_price else null end) fri_sales,        sum(case when (d_day_name='Saturday') then sales_price else null end) sat_sales from wscs     ,date_dim where d_date_sk = sold_date_sk group by d_week_seq) select d_week_seq1       ,round(sun_sales1/sun_sales2,2)       ,round(mon_sales1/mon_sales2,2)       ,round(tue_sales1/tue_sales2,2)       ,round(wed_sales1/wed_sales2,2)       ,round(thu_sales1/thu_sales2,2)       ,round(fri_sales1/fri_sales2,2)       ,round(sat_sales1/sat_sales2,2) from (select wswscs.d_week_seq d_week_seq1        ,sun_sales sun_sales1        ,mon_sales mon_sales1        ,tue_sales tue_sales1        ,wed_sales wed_sales1        ,thu_sales thu_sales1        ,fri_sales fri_sales1        ,sat_sales sat_sales1  from wswscs,date_dim   where date_dim.d_week_seq = wswscs.d_week_seq and        d_year = 2001) y, (select wswscs.d_week_seq d_week_seq2        ,sun_sales sun_sales2        ,mon_sales mon_sales2        ,tue_sales tue_sales2        ,wed_sales wed_sales2        ,thu_sales thu_sales2        ,fri_sales fri_sales2        ,sat_sales sat_sales2  from wswscs      ,date_dim   where date_dim.d_week_seq = wswscs.d_week_seq and        d_year = 2001+1) z where d_week_seq1=d_week_seq2-53 order by d_week_seq1;
复制代码

sql 解释:

这段 SQL 语句实现了对比两个年份(2001 年和 2002 年)的每周日到周六的销售数据的相对变化。以下是对其结构和逻辑的详细解析:

1. 第一步:创建 wscs 临时表

with wscs as (select sold_date_sk, sales_price  from (select ws_sold_date_sk sold_date_sk, ws_ext_sales_price sales_price        from web_sales         union all        select cs_sold_date_sk sold_date_sk, cs_ext_sales_price sales_price        from catalog_sales) x)
复制代码


功能:


  • web_salescatalog_sales 两个表的数据合并到一个统一的临时表 wscs 中。

  • 提取销售日期键 (sold_date_sk) 和销售价格 (sales_price) 两列。


逻辑:


  1. web_sales 表:

  2. 提取 ws_sold_date_sk(销售日期)和 ws_ext_sales_price(销售额)。

  3. catalog_sales 表:

  4. 提取 cs_sold_date_sk(销售日期)和 cs_ext_sales_price(销售额)。

  5. union all

  6. 不去重地合并两表的记录。

2. 第二步:创建 wswscs 临时表

 wswscs as  (select d_week_seq,        sum(case when (d_day_name='Sunday') then sales_price else null end) sun_sales,        sum(case when (d_day_name='Monday') then sales_price else null end) mon_sales,        sum(case when (d_day_name='Tuesday') then sales_price else  null end) tue_sales,        sum(case when (d_day_name='Wednesday') then sales_price else null end) wed_sales,        sum(case when (d_day_name='Thursday') then sales_price else null end) thu_sales,        sum(case when (d_day_name='Friday') then sales_price else null end) fri_sales,        sum(case when (d_day_name='Saturday') then sales_price else null end) sat_sales from wscs     ,date_dim where d_date_sk = sold_date_sk group by d_week_seq)
复制代码


功能:


  • 按照每周的编号(d_week_seq)计算每周每天(周日到周六)的总销售额。


逻辑:


  1. 关联 wscsdate_dim 表:

  2. 利用 d_date_sk = sold_date_sk,将销售日期与日期维表匹配。

  3. 按周聚合:

  4. 利用 d_week_seq 对每周数据分组。

  5. case when 语句:

  6. 对每天的销售额分别求和,忽略不属于该天的数据。


结果:


wswscs 包含每周每天的销售额字段,例如 sun_salesmon_sales 等。

3. 第三步:对比 2001 年和 2002 年的数据

子查询 1:提取 2001 年数据
 (select wswscs.d_week_seq d_week_seq1,         sun_sales sun_sales1,         mon_sales mon_sales1,         tue_sales tue_sales1,         wed_sales wed_sales1,         thu_sales thu_sales1,         fri_sales fri_sales1,         sat_sales sat_sales1  from wswscs, date_dim   where date_dim.d_week_seq = wswscs.d_week_seq and        d_year = 2001)
复制代码


  • 提取 2001 年的每周每天销售额,并标记为 *_sales1

  • d_week_seq1 表示 2001 年的周编号。

子查询 2:提取 2002 年数据
 (select wswscs.d_week_seq d_week_seq2,         sun_sales sun_sales2,         mon_sales mon_sales2,         tue_sales tue_sales2,         wed_sales wed_sales2,         thu_sales thu_sales2,         fri_sales fri_sales2,         sat_sales sat_sales2  from wswscs, date_dim   where date_dim.d_week_seq = wswscs.d_week_seq and        d_year = 2002)
复制代码


  • 提取 2002 年的每周每天销售额,并标记为 *_sales2

  • d_week_seq2 表示 2002 年的周编号。

主查询:对比相邻年份的销售额
 select d_week_seq1,        round(sun_sales1/sun_sales2,2),        round(mon_sales1/mon_sales2,2),        round(tue_sales1/tue_sales2,2),        round(wed_sales1/wed_sales2,2),        round(thu_sales1/thu_sales2,2),        round(fri_sales1/fri_sales2,2),        round(sat_sales1/sat_sales2,2) from ... where d_week_seq1 = d_week_seq2 - 53 order by d_week_seq1;
复制代码


功能:


  • 对比 2001 年每周与对应的 2002 年同一周(相差 53 周)的销售额。


逻辑:


  1. 字段匹配:

  2. 根据 d_week_seq1 = d_week_seq2 - 53 确保对比的是相邻年份的同一周。

  3. 字段计算:

  4. 利用 round(sun_sales1 / sun_sales2, 2) 等公式计算每周日到周六的销售额变化比率。

  5. 排序:

  6. 按周编号(d_week_seq1)从小到大排序。

最终输出:

表格展示 2001 年相较于 2002 年的每周每天销售额变化百分比。



执行后截图如下:



测试结果与心得

通过执行 TPC-DS 的模拟查询,实际验证了 ByConity 在 ELT 任务中的强大表现:


  1. 性能提升:BSP 模式在任务分解与调度上表现优异,查询任务耗时显著减少。

  2. 任务稳定性:在高并发与复杂场景下依旧保持出色的容错能力。

  3. 一站式体验:用户无需额外切换工具即可完成数据加工与分析,全流程高效流畅。

总结

ByConity 的 BSP 模式为实时数仓和离线数仓之间架起了一座桥梁,其灵活性与高效性让企业能够更好地应对多变的数据分析需求。本次测试验证了其在 ELT 场景中的实际效果,也展示了 ByConity 在未来数据仓库领域的潜力与前景。


如果您也想体验 ByConity 的强大功能,欢迎参与测试活动,亲自感受开源数据仓库的无限可能!

发布于: 2024-12-25阅读数: 55
用户头像

Swift社区

关注

我们希望更多的人学习和使用Swift 2020-12-29 加入

展菲,公众号 “Swift社区” 负责人,8人创作团队 9 年移动端项目研发经验,目前在上市外企从事 IT 项目管理和研发工作。全网粉丝10万+,总访问量已达数百万 《ESP32-C3 物联网工程开发实战》作者 鸿蒙讲师 技术 KOL

评论

发布
暂无评论
ByConity BSP 解锁数据仓库新未来_Swift社区_InfoQ写作社区