更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群

前言

当涉及到企业分析场景时,所使用的数据通常源自多样的业务数据,这些数据系统大多采用以行为主的存储结构,比如支付交易记录、用户购买行为、传感器报警等。在数仓及分析领域,海量数据则主要采按列的方式储存。因此,将数据从行级转换成列级存储是建立企业数仓的基础能力。

传统方式是采用 Extract-Transform-Load (ETL)来将业务数据转换为适合数仓的数据模型,然而,这依赖于独立于数仓外的 ETL 系统,因而维护成本较高。但随着云计算时代的到来,云数据仓库具备更强扩展性和计算能力,也要求改变传统的 ELT 流程。

火山引擎 ByteHouse 是一款基于开源 ClickHouse 推出的云原生数据仓库,为用户提供极速分析体验,能够支撑实时数据分析和海量数据离线分析,同时还具备便捷的弹性扩缩容能力,极致分析性能和丰富的企业级特性。凭借其强大的计算能力,可以全面支持 Extract-Load-Transform (ELT)的能力,从而使用户免于维护多套异构系统。

具体而言,用户可以将数据导入后,通过自定义的 SQL 语句,在 ByteHouse 内部进行数据转换,而无需依赖独立的 ETL 系统及资源。这样,用户只需要采用统一的 SQL 方式来完成数据转换操作。

在本文中,我们将重点介绍 ByteHouse 遇到的挑战,以及如何通过 3 大能力建设实现完备的 ELT 能力。

痛点以及挑战

我们先从一个简单的 SSB(start-schema-benchmark)场景出发, 其中包含:

  • 1 个事实表: lineorder

  • 4 个维度表:customer, part, supplier, dwdate

在 SSB 的查询分析中,我们发现大部分的查询都涉及到事实表和维表的 join,因此可以通过 Transform 的步骤,将事实表“打平”。 打平所用到的 SQL 如下:

 
insert into ssb_flat
select * from
lineorder l
join customer c on l.lo_custkey = c.c_custkey
join part p on l.lo_partkey = p.p_partkey
join supplier s on l.lo_suppkey = s.s_suppkey
where l.lo_orderdate = <bizdate>
之后的查询分析可以通过对ssb_flat 的单表扫描来规避很多join操作,其性能能有显著提升。 这个“打平”的过程,就是“Transform”的一种。 实际生产场景中的“Transform”的 case 会更多也更复杂。 但是通过以上这个“打平”的过程,我们可以分析出这类操作在数据库上的普遍性痛点。

变换操作跟普通查询相比,有几个大的区别:

  1. 变换操作执行时间久, 整体重试成本高

  2. 变换操作没有返回值,我们只关心他成功或者失败

  3. 变化操作读写量大,占用资源

具体来说:

  • 首先对于 ByteHouse 来讲,其擅长的临时查询时间都在秒级,查询中间出故障一般都直接返回错误,交由上游重试。而在 ETL 场景下,一个任务如果执行了 50 分钟,由于某些原因故障了,重试相当于前 50 分钟的资源都被浪费了,显然不能被接受。

  • 其次,由于 ETL 没有返回结果,客户端需要保持一个 idle 的长链接,很有可能由于配置原因超时,同时大量的并发任务也会吃掉正常的链接资源。

  • 最后,由于 ETL 任务读写量大,多个任务并发的时候,需要考虑到资源的分配,以达到性能和隔离的平衡。

针对这三个痛点,ByteHouse 针对性的设计了三个功能,即长任务管理、异步提交和查询队列。

功能一:长任务管理

通常情况下,我们可以用 settings max_execution_time 来控制一个查询的超时时间,ByteHouse 提供了事务支持来保障读写操作的原子性。

但是并这不足以覆盖 ETL 任务的需求。 在长时间的任务执行中,更容易遇到系统性故障,如节点 OOM 等。在这种情况下,由客户端重试并不是个优雅的方案。

在 ByteHouse 中,一个 SQL 查询会被转化为一系列的算子。 我们希望提升算子的容错能力以更好的应对长时间查询下的系统故障。目前的版本中,ByteHouse 已经针对聚合,排序,关联等算子提供了 disk spill 功能。 具体来说,当某个算子无法获得足够的内存时,我们允许这个算子将一部分数据缓存在磁盘上,以此在资源紧张的情况下仍能够完成工作。

例如在排序算子中,我们引入了 external merge sort 的能力,并通过max_bytes_before_external_sort来控制外部排序能力。在下图左边是未开启 spill 的排序查询计划,右边是开启 spill 的计划。

可以看到在开启 external sort 之后,ByteHouse 引入了 BufferingToFileTransform,MergingSortedTransform 两个算子。同样的,ByteHouse 里的聚合,关联算子都做了类似的优化例如 grace hash join 等。

接下来 ByteHouse 也打算针对 exchange 操作,进一步提升 shuffle 操作的容错性。

功能二:异步提交能力

面对大量长耗时的 ETL 任务时,传统的同步执行的方式需要客户端等待服务端返回。 这样很容易出现客户端超时,进而影响后续任务执行的问题。

同时,在这种场景中,用户并不关心单个任务或请求的相应时间,只期望任务能在特定时间内完成,并对可靠性等要求较高。 因此 ByteHouse 提供了异步提交的任务的能力。

ByteHouse 用户现在可以通过 setting enable_async_execution 来提交一个异步任务。ByteHouse 在收到这类任务之后,会返回一个异步任务 ID, 例如 ff46fccf-d872-4c68-bdb2-c8c18fc178f5。 之后客户端可以选择间歇性轮训来获得任务的最终状态。

ByteHouse 提供了 show async status 'ff46fccf-d872-4c68-bdb2-c8c18fc178f5' 的指令来获得状态。 同时 ByteHouse 也提供了 kill query 'ff46fccf-d872-4c68-bdb2-c8c18fc178f5'的指令来取消某些异步的查询。

功能三:查询队列

离线加工面对大量请求时,当系统超载,需要一定的排队机制使 query 请求挂起,等待集群释放资源后再进行调度。ByteHouse 为此提供了查询队列能力。

ByteHouse 可以允许用户从三个维度度来定义一个队列,即: 队列大小,总 CPU 占用率,和总内存占用率。

在 ByteHouse 中,Resource Manager 组件可以用来监听各个队列中的查询指标,得到队列的资源使用率。 当用户向一个队列提交查询时,如果队列还未达到上限,ByteHouse 会将这个查询入队,否则拒绝掉这个查询。

此后,ByteHouse 会时刻检查队列的资源利用率,当空闲资源高过某个阀值时,Bytehouse 会将等待中的查询出队。当某个处于等待期的查询被取消时,ByteHouse 也会将其移出队列。利用查询队列,用户在编排 ETL 任务时不用担心底层资源过载,因此可以更加自由。

之后 ByteHouse 也在计划增加优先级队列功能。届时,用户可以为 ETL 任务和即时查询创建不同队列优先级,这样 ELT 任务和即时查询可以跑在同一个计算组中而不会显著的相互影响。

总结

以上介绍了 ByteHouse 在支持 ETL 能力中的一些技术细节。其中长任务,异步提交已经队列功能已经在 preview 版本中上线。接下来,ByteHouse 也会继续扩展 ETL 能力,包括支持更多的 ETL 相关的转换函数、长任务容错、优先级队列等。

除了 ELT 能力之外,火山引擎 ByteHouse 基于独家自研的高可用引擎及查询优化器,可以为企业提供快速、稳定、安全的查询服务和数据写入性能。在云原生架构下,火山引擎 ByteHouse 提供了极致扩展的统一数据分析平台,具有出色的弹性伸缩和可扩展性,确保资源可以灵活地水平扩展;

同时,ByteHouse 支持多级资源隔离,为用户资源提供更安心的安全保障。火山引擎 ByteHouse 还从业务角度出发提供了完整的运维监控和排障能力,帮助企业实现业务云上托管,降低运维成本。欢迎登陆火山引擎 ByteHouse 官网体验。

点击跳转 云原生数据仓库ByteHouse 了解更多

如何快速从 ETL 到 ELT?火山引擎 ByteHouse 做了这三件事的更多相关文章

  1. 高性能、快响应!火山引擎 ByteHouse 物化视图功能及入门介绍

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 物化视图是指将视图的计算结果存储在数据库中的一种技术.当用户执行查询时,数据库会直接从已经预计算好的结果中获取数据 ...

  2. 火山引擎 DataLeap:揭秘字节跳动数据血缘架构演进之路

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 DataLeap 是火山引擎数智平台 VeDI 旗下的大数据研发治理套件产品,帮助用户快速完成数据集成.开发.运维 ...

  3. 啥是ETL、ELT

    ETL就是Extract.Transfrom.Load即抽取.转换.加载三个英文单词首字母的集合.抽取:就是从源系统抽取需要的数据,这些源系统可以是同构也可以是异构的:比如源系统可能是Excel电子表 ...

  4. Kettle学习系列之数据仓库、数据整合、ETL、ELT和EII之间的区别?

    不多说,直接上干货! 在数据仓库领域里,的一个重要概念就是数据整合(data intergration).数据整合它就是把不同数据库中的数据整合到一起,对外提供统一的数据视图. 数据整合最典型的案例就 ...

  5. 数据分析你需要知道的操作:ETL和ELT

    如果您接触过数据仓库, 您可能会使用 ETL (Extract. Transform. Load) 或 ELT ( Extract.Load. Transform) 将您的数据从不同的来源提取到数据仓 ...

  6. 火山引擎 DataLeap 的 Data Catalog 系统公有云实践

      Data Catalog 通过汇总技术和业务元数据,解决大数据生产者组织梳理数据.数据消费者找数和理解数的业务场景.本篇内容源自于火山引擎大数据研发治理套件 DataLeap 中的 Data Ca ...

  7. 还原火山引擎 A/B 测试产品——DataTester 私有化部署实践经验

      作为一款面向ToB市场的产品--火山引擎A/B测试(DataTester)为了满足客户对数据安全.合规问题等需求,探索私有化部署是产品无法绕开的一条路.   在面向ToB客户私有化的实际落地中,火 ...

  8. 火山引擎DataLeap数据调度实例的 DAG 优化方案

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 实例 DAG 介绍 DataLeap 是火山引擎自研的一站式大数据中台解决方案,集数据集成.开发.运维.治理.资产管理能力 ...

  9. 如何又快又好实现 Catalog 系统搜索能力?火山引擎 DataLeap 这样做

      摘要 DataLeap 是火山引擎数智平台 VeDI 旗下的大数据研发治理套件产品,帮助用户快速完成数据集成.开发.运维.治理.资产.安全等全套数据中台建设,降低工作成本和数据维护成本.挖掘数据价 ...

  10. 火山引擎 DataLeap:3 个关键步骤,复制字节跳动一站式数据治理经验

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 DataLeap 是火山引擎数智平台 VeDI 旗下的大数据研发治理套件产品,帮助用户快速完成数据集成.开发.运维.治理. ...

随机推荐

  1. C#工作流——elsa-workflows

    介绍 Elsa Workflows 是一个功能强大且灵活的执行引擎,封装为一组开源 .NET 库,旨在为 .NET 应用程序注入工作流功能. 借助 Elsa,开发人员可以将逻辑直接编织到他们的系统中, ...

  2. 通过HTML和JavaScript实现随机抽取幸运员工

    需求描述: 公司经常会要求IT部门做一个随机抽取员工页面,今天我们通过HTML和JavaScript来实现 HTML 结构 首先,我们需要编写 HTML 代码来定义页面结构和元素.下面是 HTML 代 ...

  3. kali Linux安装pyenv

    前言 pyenvpyenv 可让你轻松地在多个 Python 版本之间切换,是一个非常不错的python版本管理工具 安装步骤 安装依赖 apt-get install -y make build-e ...

  4. 手撕Vuex-安装模块数据

    前言 根据上一篇,[手写Vuex]-提取模块信息,我们已经可以获取到模块的信息了,将模块信息变成了我们想要的数据结构,接下来我们就要根据模块的信息,来安装模块的数据. 在上一篇当中我们定义了一个 Mo ...

  5. 自定义Graph Component:1.2-其它Tokenizer具体实现

      本文主要介绍了Rasa中相关Tokenizer的具体实现,包括默认Tokenizer和第三方Tokenizer.前者包括JiebaTokenizer.MitieTokenizer.SpacyTok ...

  6. 推荐一个Node.js多版本管理的可视化工具

    关于Node.js的开发者来说,在开发机器上管理多个不同版本的Node.js是一个常见痛点.之前在开发者安全大全专栏中,提到过解决方法:使用nvm,如果对于nvm还不了解的话,可以前往了解. 对于TJ ...

  7. C# 12 Blazor入门教程

    Blazor简介 Blazor 是由Microsoft开发的一款基于.NET的开源交互式Web UI框架.Blazor使开发人员能够使用C#和HTML建立全堆栈的单页应用程序,并避免使用JavaScr ...

  8. SQL Server 2000 创建角色,登陆用户,安全用户,批量授予权限

    前言 我在2011年刚入门学习的时候,是从 SQL Server 2008 开始学的,再加上这些年较少接触 SQL Server 2000,因此对它不是很熟. 之前都是在 SQL Server 200 ...

  9. 2. Shell 条件测试

    重点: 条件测试. read. Shell 环境配置. case. for. find. xargs. gzip,bzip2,xz. tar. sed. 1)位置 变量 位置变量:在 bash She ...

  10. STM32外设:最小系统、低功耗模式

    最小系统 启动引脚 BOOT0.BOOT1:用于设置系统的启动方式 下载引脚 JTAG的IO:JTMS.JTCK.JTDI.JTDO.NJTRST SW的IO:SWDIO.SWCLK 硬件设计 NUC ...