概述
ByteHouse 支持外置计算引擎的批式导入。
相比通过引擎进行Insert
数据,批式导入功能具有以下特点:
- 支持多线程并行导入,导入大文件的速度更快。
- 导入时直接写 Part 文件,不经过引擎;且通过 Spark/Flink,采用外部计算资源导入,对查询性能的影响更低。
- 完成完整的 Part 文件后挂载,不会出现
Insert
导致的 Part 过多,合并慢的情况。
支持数据源
- 对象存储(Object Storage):从标准对象存储服务导入文件数据,包括火山引擎的 TOS,阿里的 OSS,AWS 的 S3 服务,或自建的 Minio 等。支持的文件类型包括:csv,json,Parquet。
- Hive:从 Hive 表导入数据。
- ClickHouse:从 ClickHouse / ByteHouse 表导入数据。
- LAS:支持从火山引擎湖仓一体分析服务 LAS 导入数据。
操作详情
新增数据源
数据导入 -> 新建数据源 -> 源类型选择(对象存储/Hive/ClickHouse/LAS);
按照对应数据源的配置表单,填写数据源连接信息。
说明
请确保数据源和 ByteHouse 集群在网络上是互通的,且所提供的数据源的访问账号(例如对象存储的 ak/sk)有对应路径/库表的访问权限。
创建任务
前置准备:
创建步骤:
- 数据导入 -> 新建导入任务
- 填写作业名称,描述。请注意作业名称不可与其他作业名重名。
- 根据源类型,填写相关的路径或库表信息。
- 选择目标数据表(需要目标数据表已经建完)
- 进行数据源中的列和表中的列的匹配。
此处,部分数据源(如对象存储)可通过选择 “数据映射”,可以从之前选择的 bucket/path/
中选择一个 Schema 描述文件,提取描述文件的信息,自动生成源列。
注意
注意,目前离线导入不支持 Expression 进行简单的数据转换,需要确保源数据和目标数据的数据格式是一致的)。
- 选择冲突解决方式。此处需要补充解释分区的定义:
分区 Partition
:分区为 ClickHouse 中表内的逻辑单元,由分区键(Partition Key)作为分隔依据。使用离线导入功能,最小导入单位为一个完整分区,不是行(Row)。因此,2 次导入中若出现分区字段值重复,就会出现分区冲突。例如,第一次导入产生了 '2022-2-2' 分区,第二次导入中部分行的分区键值也是 '2022-2-2',导入过程中生成了新的 '2022-2-2' 分区,因此冲突。
可以选择以下四种模式处理分区冲突:
- 增量合并(推荐):新导入的分区数据合并入旧分区。
- 覆盖分区:新分区覆盖旧的同名分区。
- 忽略冲突:新分区如果和旧分区重名,则不导入。
- 后续处理:导入后如果出现分区冲突(任务状态变为 “Confilcted”),再依据新老分区的行数大小,选择保留新分区还是旧分区。
- 选择“提交”,完成创建。
开始导入
- 在“数据导入”模块下找到之前创建的导入任务,选择“开始”。
- 开始导入时,不同数据源有不同的导入参数需要填写:
- 对于对象存储,需要选择文件。
- 对于 Hive,需要选择导入的数据表与导入并行度(默认为1,并行度越高导入速度越快)。
- 对于 ClickHouse,需要输入待导入数据的 select query。
说明
对于文件系统类数据源,有以下限制:
- 导入文件数量上限为:10个。
- 单个文件的上限容量为:2 GB。
任务跟踪
在开启任务后,会生成对应的执行记录。通过导入任务,可查看该任务所有的执行记录与执行状态。
- 若执行状态是“已停止”,表明当前任务已经成功;
- 若执行状态是“失败”,则可以鼠标 Hover “失败”,找到 “查看更多”,查看出错记录。
- 若执行状态是“冲突”,可选择对应任务的“恢复”操作,进入“处理冲突”步骤。
处理冲突
对于每个冲突,可以选择以下两种处理类型:
- 覆盖,保留新分区,老分区的数据完全丢弃。
- 不覆盖,保留老分区,丢弃新导入的分区。
冲突处理完成后,导入任务即会完成。进入“已停止”状态,即代表导入成功。