如何快速从 ETL 到 ELT?火山引擎 ByteHouse 做了这三件事

news2024/11/26 0:24:41

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【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 * fromlineorder ljoin customer c on l.lo_custkey = c.c_custkeyjoin part p on l.lo_partkey = p.p_partkeyjoin supplier s on l.lo_suppkey = s.s_suppkeywhere 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 官网体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1020246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

02Spring框架的特点以及jar包下载

Spring框架 Spring简介 Spring是由Rod Johnson创建的一个实现了IoC思想的开源框架, Spring最初的出现是为了解决EJB臃肿的设计以及难以测试等问题 Spring是为了解决企业应用开发的复杂性而创建的,从简单性、可测试性和松耦合的角度而言任何Java应用都可以从Spring中受益 Sp…

2023-驾驶舱数据指标体系建设

一、什么是领导驾驶舱&#xff1f; 领导驾驶舱&#xff0c;它以驾驶舱的形式&#xff0c;通过各种图表形象的展示企业运行的关键指标&#xff08;KPI&#xff09;&#xff0c;直观的监测企业运营情况&#xff0c;并可以对异常关键指标预警和挖掘分析。以根据管理和业务的需要&a…

期权合约到期日强平了还要扣手续费嘛?

国内目前的50ETF期权交易是会收取平仓的手续费的&#xff0c;期权手续费是双向收费&#xff0c;开仓收取一次、平仓收取一次。国内不同券商和期权分仓平台的手续费标准不同&#xff0c;下文介绍期权合约到期日强平了还要扣手续费嘛&#xff1f;本文来自&#xff1a;期权酱 一、…

EFLAGS寄存器与JCC指令

EFLAGS寄存器 EFLAGS寄存器有32位&#xff0c;EFLAGS 寄存器的标志位可以通过各种指令进行操作和判断&#xff0c;例如条件分支指令、算术指令和控制指令等。程序可以根据标志位的值来进行条件判断和控制流程&#xff0c;从而实现不同的逻辑和功能。 EFLAGS 寄存器的各个位和…

js写一个判断字符串是否能够转为JSON 的函数

其实非常简单 这里我们需要涉及到 捕获异常 因为如果你直接在if里面转 我已经试过了 直接就报错了 一点面子不给 我们写一个这样的函数 function isJsonString(str) {try {JSON.parse(str);return true;} catch (e) {return false;} }编写如下代码 console.log(isJsonString(…

Flutter的路由router-页面跳转

文章目录 概念介绍基本路由&#xff08;Basic Routing&#xff09;跳转到某个页面弹出页面 命名路由&#xff08;Named Routing&#xff09;第三方路由管理库&#xff08;Third-Party Routing Libraries&#xff09; Android原生的路由Intent-based Routing&#xff08;基于Int…

分析数组,结构体在反汇编中存储

本文会在IDA中分析数组&#xff0c;结构体在内存中的存储 目录 IDA分析数组存储 IDA分析结构体存储 传递参数的方式 IDA分析数组存储 测试代码如下&#xff1a; /************************************************************************/ /*Author : 玄都大…

《优化接口设计的思路》系列:第三篇—留下用户调用接口的痕迹

系列文章导航 《优化接口设计的思路》系列&#xff1a;第一篇—接口参数的一些弯弯绕绕 《优化接口设计的思路》系列&#xff1a;第二篇—接口用户上下文的设计与实现 《优化接口设计的思路》系列&#xff1a;第三篇—留下用户调用接口的痕迹 前言 大家好&#xff01;我是sum…

【TCP】延时应答 与 捎带应答

延时应答 与 捎带应答 一. 延迟应答&#xff08;效率机制&#xff09;二. 捎带应答&#xff08;效率机制&#xff09; 一. 延迟应答&#xff08;效率机制&#xff09; 延时应答&#xff1a;相当于 流量控制 的延伸。 流量控制是 踩下了刹车&#xff0c;是发送方发的不要太快&a…

墨天轮专访星环科技刘熙:“向量热”背后的冷思考,Hippo如何打造“先发”优势?

导读&#xff1a; 深耕技术研发数十载&#xff0c;坚持自主可控发展路。星环科技一路砥砺前行、坚持创新为先&#xff0c;建设了全面的产品矩阵&#xff0c;并于2022年作为首个独立基础软件产品公司成功上市。星环科技在今年的向星力•未来技术大会上发布了分布式向量数据库Tra…

ReactNative进阶(二十一)开源插件 react-native-device-info 获取设备信息

文章目录 一、前言二、Android 平台三、iOS 平台四、拓展阅读 一、前言 项目开发过程中&#xff0c;需要获取设备信息&#xff0c;例如获取设备名称。可通过使用开源的第三方组件react-native-device-info&#xff0c;该组件适用于iOS和Android双平台。 在ReactNative项目中可…

Comparator 接口使用方法,结合java8新特性及源码分析

目录 1 Comparator介绍1.1 函数式声明1.2 简单的小案例 2. Comparator中的方法2.1 compare 抽象方法例子 2.2 comparing方法源码参考解释详细解释 <? super T, ? extends U>讲解comparing代码样例例子comparing中的方法源码分析<T, U extends Comparable<? supe…

Python asynchat模块-异步套接字处理-服务器程序示例

介绍 此模块在asyncore架构上建立&#xff0c;简化了异步客户端和服务器&#xff0c;并且使得处理元素为任意字符串结束或者为变长度的协议更加容易。asynchat定义了一个可以由使用者来子类化的抽象类async_chat&#xff0c;提供了collect_incoming_data()和found_terminator(…

数据结构上机练习——单链表的基本操作、头文件、类定义、main函数、多种链表算法的实现,含注释

文章目录 单链表的基本操作实现1.头文件2.类定义和多种算法的实现2.1创建空表2.2头插法创建n个元素的线性链表2.3一个带头节点的链表存放一组整数&#xff0c;设计一个算法删除值等于x的所有节点。2.4计算线性表中值为偶数的节点个数2.5一个带头节点的单链表heada存放一组整数&…

科技云报道:云安全的新战场上,如何打破“云威胁”的阴霾?

科技云报道原创。 近年来&#xff0c;在云计算和网络安全产业的蓬勃发展下&#xff0c;我国云安全行业市场规模呈现高速增长态势&#xff0c;在网络安全市场总体规模中占比不断上升。 据统计&#xff0c;近5年我国云安全市场保持高速增长&#xff0c;2021年我国云安全市场规模…

VMware workstation 中centos7虚拟机在nat模式下怎么配置网卡,指定我想要的IP并且可以联网

1、首先打开我们的虚拟网络编辑器 2、查看我们的网关 3、查看IP池&#xff0c;根据需求自己设置 4、打开centos7虚拟机 编辑网卡配置 vim /etc/sysconfig/network-scripts/ifcfg-ens160####我的网卡是ens160TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic …

全新交友平台,探索在线交流的乐趣!

大家好&#xff01;今天给大家介绍一款全新的交友平台&#xff0c;让您轻松享受在线交流的乐趣&#xff01;这个平台以其丰富多样的功能和互动体验而广受欢迎。无论您是想结识新朋友还是找到心仪的主播&#xff0c;这里都能满足您的需求。 首先&#xff0c;我们来看一下首页列表…

基于SpringBoot的超市管理系统

基于SpringBootVue的超市管理系统、超市进销存系统&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;管理员…

三、C#—变量,表达式,运算符(1)

&#x1f33b;&#x1f33b; 目录 一、变量1.1 变量1.2 使用变量的步骤1.3 变量的声明1.4 变量的命名规则1.5 变量的初始化1.6 变量初始化的三种方法1.7 变量的作用域1.8 变量使用实例1.9 变量常见错误 二、C#数据类型2.1 数据类型2.2 值类型2.2.1 值类型直接存储值2.2.2 简单类…

Vivado初体验LED工程

文章目录 前言一、PL 和 PS二、LED 硬件介绍三、创建 Vivado 工程四、创建 Verilog HDL 文件五、添加管脚约束六、添加时序约束七、生成 BIT 文件八、仿真测试九、下载测试 前言 本节我们要做的是熟练使用 Vivado 创建工程并实现对 LED 灯控制&#xff0c;每秒钟控制开发板上的…