You need to enable JavaScript to run this app.
导航
ELT 支持
最近更新时间:2024.08.28 15:43:15首次发布时间:2023.12.04 14:20:26

ByteHouse 作为云原生数据仓库,逐渐引入了对 ELT(Extract-Load-Transform,提取-加载-转换)的支持。 这使得用户可以避免维护多个异构数据系统。

概述

在数据加载进数据库之前,往往需要经过复杂的数据清洗和转换过程。这是人们所熟知的ETL。而在之前的工程实践中,这部分工作是由一些外部的数仓工具来完成的,比如典型的Hive、Spark SQL等。ByteHouse不断努力拓展边界,减少数据加工和数据分析之间多系统耦合带来的运维负担。把数据加工(T)的过程转移到ByteHouse内部,使其能够一站式完成数据接入、加工和分析,具备了完备的数据仓库能力。

图片

背景

ClickHouse从设计之初是面向OLAP(在线分析)场景,无论是列存、索引还是执行向量化的优化,他们都有效地应对大宽表的聚合计算。
针对复杂查询,尤其是数据仓库中典型的ETL任务来说,ClickHouse则并不擅长。结构复杂、耗时较长的数据加工作业,通常需要复杂的调优过程。典型的问题如下:

  • 重试成本高:对于运行时长在分钟级甚至小时级的ETL作业,如果运行过程中出现失败,ClickHouse只能进行query级别的重试。从头重试不仅造成大量的资源浪费,也对加工任务的SLA提出了挑战。
  • 资源占用巨大:由于缺少迭代计算和有效的任务拆分,在查询数据量大、计算复杂的情况下,通常要求节点有充足的内存进行处理。
  • 并发控制:当多个查询同时运行时,ClickHouse并不会根据资源的使用情况进行调度。任务之间相互挤压会导致失败(通常是Memory limit错误)。叠加重试机制的缺乏,通常会引起雪崩效应。

针对以上问题,ByteHouse团队在高性能计算框架的基础上,增加了对bsp模式的支持:可以进行Task级别的容错和更细粒度的调度,在将来会支持资源感知的调度。可以给用户带来以下收益:

  • 当query运行中遇到错误时,可以自动重试当前的task,而不是从头进行重试。大大减少重试成本。
  • 当query需要的内存巨大,甚至大于单机的内存时,可以通过增加并行度来减少单位时间内内存的占用。只需要调大并行度参数即可,理论上是可以无限扩展的。
  • (开发中)可以根据集群资源使用情况有序调度并发ETL任务,从而减少资源的挤占,避免频繁失败。

使用 ByteHouse ELT

用户可以在query settings中通过增加下面的参数来使用ELT能力:

Settings 参数名称

类型

默认值

含义

bsp_mode

Bool

0

打开bsp模式,query会分阶段执行。在失败时会进行task级别的重试。

distributed_max_parallel_size

UInt64

等于worker数量

当单个查询占用内存较大时,通过调大此参数可以增加算子的并行度,减少单个并行度处理数据的数量,减少单位时间内存使用量。必须在打开bsp_mode下才能超出worker的数量。建议设置为worker个数的倍数。

bsp_max_retry_num
(从 2.0.4 版本开始支持)

UInt64

3

task最大的重试次数。2.0.4/2.1版本中以query粒度记,默认为5次。2.2版本中以segment粒度记,默认为3次。

disk_shuffle_files_codec
(从 2.2 版本开始支持)

LZ4/ZSTD/NONE

LZ4

shuffle文件采用的编码,能有效减少磁盘占用。