ByConity BSP 解锁数据仓库新未来

文章目录

    • 前言
    • [BSP 模式简介](#BSP 模式简介)
    • [基于 TPC-DS 的 ELT 活动](#基于 TPC-DS 的 ELT 活动)
    • [执行 02.sql](#执行 02.sql)
      • sql解释:
        • [1. 第一步:创建 wscs 临时表](#1. 第一步:创建 wscs 临时表)
        • [2. 第二步:创建 wswscs 临时表](#2. 第二步:创建 wswscs 临时表)
        • [3. 第三步:对比 2001 年和 2002 年的数据](#3. 第三步:对比 2001 年和 2002 年的数据)
        • 最终输出:
    • 测试结果与心得
    • 总结

前言

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

BSP 模式简介

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

  1. Task 级容错:在数据处理过程中实现更高效的错误恢复机制,确保任务的稳定性。
  2. 更细粒度的调度:以任务为单位进行资源调度,优化计算资源的使用效率。
  3. 资源感知调度:根据当前资源情况动态调整任务分配,提升并行执行的效率。

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

基于 TPC-DS 的 ELT 活动

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

测试环境

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

组件 规格
ByConity 版本 v1.0.1
Worker 节点 4 * 16core 64G
Server 节点 1 * 16core 64G
TSO 1 * 4core 16G
Daemon Manager 1 * 4core 16G
Resource Manager 1 * 8core 32G
存储 对象存储 TOS
FoundationDB 3 * 4core 16G

登录 ECS

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

  • MacOS 用户

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

      shell 复制代码
      ssh -p 23 root@14.103.145.182
    • 输入 yes 确认连接,并输入提供的登录密码。

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

    shell 复制代码
    tmux new -s your_session_name
  • 启动客户端:

    shell 复制代码
    clickhouse client --port 9010

数据查询配置

  • 切换至测试数据库:

    sql 复制代码
    use test_elt;
  • 设置 SQL 方言:

    sql 复制代码
    set dialect_type = 'ANSI';

执行 02.sql

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

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 临时表
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)

功能:

  • web_salescatalog_sales 两个表的数据合并到一个统一的临时表 wscs 中。
  • 提取销售日期键 (sold_date_sk) 和销售价格 (sales_price) 两列。

逻辑:

  1. web_sales 表:
    • 提取 ws_sold_date_sk(销售日期)和 ws_ext_sales_price(销售额)。
  2. catalog_sales 表:
    • 提取 cs_sold_date_sk(销售日期)和 cs_ext_sales_price(销售额)。
  3. union all
    • 不去重地合并两表的记录。
2. 第二步:创建 wswscs 临时表
sql 复制代码
 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 表:
    • 利用 d_date_sk = sold_date_sk,将销售日期与日期维表匹配。
  2. 按周聚合:
    • 利用 d_week_seq 对每周数据分组。
  3. case when 语句:
    • 对每天的销售额分别求和,忽略不属于该天的数据。

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

3. 第三步:对比 2001 年和 2002 年的数据
子查询 1:提取 2001 年数据
sql 复制代码
 (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 年数据
sql 复制代码
 (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 年的周编号。
主查询:对比相邻年份的销售额
sql 复制代码
 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. 字段匹配:
    • 根据 d_week_seq1 = d_week_seq2 - 53 确保对比的是相邻年份的同一周。
  2. 字段计算:
    • 利用 round(sun_sales1 / sun_sales2, 2) 等公式计算每周日到周六的销售额变化比率。
  3. 排序:
    • 按周编号(d_week_seq1)从小到大排序。
最终输出:

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

周编号 周日变化 周一变化 周二变化 周三变化 周四变化 周五变化 周六变化
Week1 1.10 0.95 1.20 1.05 0.98 1.15 1.00

执行后截图如下:

测试结果与心得

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

  1. 性能提升:BSP 模式在任务分解与调度上表现优异,查询任务耗时显著减少。
  2. 任务稳定性:在高并发与复杂场景下依旧保持出色的容错能力。
  3. 一站式体验:用户无需额外切换工具即可完成数据加工与分析,全流程高效流畅。

总结

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

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

相关推荐
天翼云开发者社区20 小时前
数据治理的长效机制
大数据·数据仓库
Leo.yuan2 天前
ETL还是ELT,大数据处理怎么选更靠谱?
大数据·数据库·数据仓库·信息可视化·etl
isNotNullX3 天前
数据怎么分层?从ODS、DW、ADS三大层一一拆解!
大数据·开发语言·数据仓库·分布式·spark
随心............3 天前
hive的相关的优化
数据仓库·hive·hadoop
亲亲菱纱3 天前
数仓面试题
数据仓库
zhangjin12223 天前
kettle从入门到精通 第九十七课 ETL之kettle kettle资源仓库的5种方式
数据仓库·etl·kettle插件·kettle资源仓库
liupenglove3 天前
自动驾驶数据仓库:时间片合并算法。
大数据·数据仓库·算法·elasticsearch·自动驾驶
LucianaiB5 天前
AI 时代的分布式多模态数据处理实践:我的 ODPS 实践之旅、思考与展望
大数据·数据仓库·人工智能·分布式·odps
༺水墨石༻5 天前
低版本hive(1.2.1)UDF实现清除历史分区数据
数据仓库·hive·hadoop
Leo.yuan6 天前
数据清洗(ETL/ELT)原理与工具选择指南:企业数字化转型的核心引擎
大数据·数据仓库·数据挖掘·数据分析·etl