导入总览
数据导入是指将原始数据按照业务需求进行清洗、转换、并加载到 StarRocks 中的过程,从而可以在 StarRocks 系统中进行极速统一的数据分析。
StarRocks 通过导入作业实现数据导入。每个导入作业都有一个标签 (Label),由用户指定或系统自动生成,用于标识该导入作业。每个标签在一个数据库内都是唯一的,仅可用于一个成功的导入作业。一个导入作业成功后,其标签不可再用于提交其他导入作业。只有失败的导入作业的标签,才可再用于提交其他导入作业。这一机制可以保证任一标签对应的数据最多被导入一次,即实现“至多一次 (At-Most-Once) ”语义。
StarRocks 中所有导入方式都提供原子性保证,即同一个导入作业内的所有有效数据要么全部生效,要么全部不生效,不会出现仅导入部分数据的情况。这里的有效数据不包括由于类型转换错误等数据质量问题而被过滤掉的数据。
StarRocks 提供两种访问协议用于提交导入作业:MySQL 协议和 HTTP 协议。不同的导入方式支持的访问协议有所不同,具体请参见本文“导入方式”章节。
注意
导入操作需要目标表的 INSERT 权限。如果您的用户账号没有 INSERT 权限,请参考 GRANT 给用户赋权。
支持的数据类型
StarRocks 支持导入所有数据类型。个别数据类型的导入可能会存在一些限制,具体请参见数据类型。
导入模式
StarRocks 支持两种导入模式:同步导入和异步导入。
说明
如果是外部程序接入 StarRocks 的导入,需要先判断使用哪种导入模式,然后再确定接入逻辑。
同步导入
同步导入是指您创建导入作业以后,StarRocks 同步执行作业,并在作业执行完成以后返回导入结果。您可以通过返回的导入结果判断导入作业是否成功。
支持同步模式的导入方式有 Stream Load 和 INSERT。
用户操作过程如下:
-
创建导入作业。
-
查看 StarRocks 返回的导入结果。
-
判断导入结果。如果导入结果为失败,可以重试导入作业。
异步导入
异步导入是指您创建导入作业以后,StarRocks 直接返回作业创建结果。
- 如果导入作业创建成功,StarRocks 会异步执行导入作业。但作业创建成功并不代表数据导入已经成功。您需要通过语句或命令来查看导入作业的状态,并且根据导入作业的状态来判断数据导入是否成功。
- 如果导入作业创建失败,可以根据失败信息,判断是否需要重试。
支持异步模式的导入方式有 Broker Load、Routine Load 和 Spark Load。
用户操作过程如下:
-
创建导入作业。
-
根据 StarRocks 返回的作业创建结果,判断作业是否创建成功。
- 如果作业创建成功,进入步骤 3。
- 如果作业创建失败,可以回到步骤 1,尝试重试导入作业。
-
轮询查看导入作业的状态,直到状态变为 FINISHED 或 CANCELLED。
Broker Load 和 Spark Load 导入作业的执行流程主要分为 5 个阶段,如下图所示。
每个阶段的描述如下:
-
PENDING
该阶段是指提交导入作业后,等待 FE 调度执行。
-
ETL
该阶段执行数据的预处理,包括清洗、分区、排序、聚合等。
说明
如果是 Broker Load 作业,该阶段会直接完成。
-
LOADING
该阶段先对数据进行清洗和转换,然后将数据发送给 BE 处理。当数据全部导入后,进入等待生效过程,此时,导入作业的状态依旧是 LOADING。
-
FINISHED
在导入作业涉及的所有数据均生效后,作业的状态变成 FINISHED,此时,导入的数据均可查询。FINISHED 是导入作业的最终状态。
-
CANCELLED
在导入作业的状态变为 FINISHED 之前,您可以随时取消作业。另外,如果导入出现错误,StarRocks 系统也会自动取消导入作业。作业取消后,进入 CANCELLED 状态。CANCELLED 也是导入作业的一种最终状态。
Routine Load 导入作业的执行流程描述如下:
-
用户通过支持 MySQL 协议的客户端向 FE 提交一个导入作业。
-
FE 将该导入作业拆分成若干个任务,每个任务负责导入若干个分区的数据。
-
FE 将各个任务分配到指定的 BE 上执行。
-
BE 完成分配的任务后,向 FE 汇报。
-
FE 根据汇报结果,继续生成后续新的任务,或者对失败的任务进行重试,或者暂停任务的调度。
导入方式
StarRocks 提供 Stream Load、Broker Load、 Routine Load、Spark Load 和 INSERT 多种导入方式,满足您在不同业务场景下的数据导入需求。
导入方式 | 数据源 | 业务场景 | 数据量(单作业) | 数据格式 | 同步模式 | 协议 |
---|---|---|---|---|---|---|
Stream Load |
| 通过 HTTP 协议导入本地文件、或通过程序导入数据流。 | 10 GB 以内 |
| 同步 | HTTP |
Broker Load |
| 从 HDFS 或外部云存储系统导入数据。 | 数十到数百 GB |
| 异步 | MySQL |
Routine Load | Apache Kafka® | 从 Kafka 实时地导入数据流。 | 微批导入 MB 到 GB 级 |
| 异步 | MySQL |
Spark Load |
|
| 数十 GB 到 TB级别 |
| 异步 | MySQL |
INSERT INTO SELECT |
从 AWS S3 或 HDFS 导入数据时,只支持导入 Parquet 和 ORC 格式的数据。 |
| 跟内存相关 | StarRocks 表 | 同步 | MySQL |
INSERT INTO VALUES |
|
| 简单测试用 | SQL | 同步 | MySQL |
您可以根据业务场景、数据量、数据源、数据格式和导入频次等来选择合适的导入方式。另外,在选择导入方式时,可以注意以下几点:
-
从 Kafka 导入数据时,推荐使用 Routine Load 实现导入。但是,如果导入过程中有复杂的多表关联和 ETL 预处理,建议先使用 Apache Flink® 从 Kafka 读取数据并对数据进行处理,然后再通过 StarRocks 提供的标准插件 flink-connector-starrocks 把处理后的数据导入到 StarRocks 中。
-
从 Hive、Iceberg、Hudi、Delta Lake 导入数据时,推荐创建 Hive catalog、Iceberg catalog、Hudi Catalog、Delta Lake Catalog,然后使用 INSERT 实现导入。
-
从另外一个 StarRocks 集群或从 Elasticsearch 导入数据时,推荐创建 StarRocks 外部表或 Elasticsearch 外部表,然后使用 INSERT 实现导入。或者,您也可以通过 DataX 实现导入。
注意
StarRocks 外表只支持数据写入,不支持数据读取。
-
从 MySQL 导入数据时,推荐创建 MySQL 外部表、然后使用 INSERT 实现导入。或者,您也可以通过 DataX 实现导入。如果要导入实时数据,建议您参考 从 MySQL 实时同步 实现导入。
-
从 Oracle、PostgreSQL 或 SQL Server 等数据源导入数据时,推荐创建 JDBC 外部表、然后使用 INSERT 实现导入。或者,您也可以通过 DataX 实现导入。
下图详细展示了在各种数据源场景下,应该选择哪一种导入方式。