Starrocks数据导入方式

1、 数据导入概览

https://doris.apache.org/zh-CN/docs/dev/install/standard-deployment

下图为各类数据导入Starrocks方式

Starrocks数据导入方式_第1张图片

  • 可以通过语句:SELECT * FROM information_schema.loads 来查看

  • [SHOW BROKER](https://docs.starrocks.io/zh-cn/latest/sql-reference/sql-statements/Administration/SHOW BROKER) 语句来查看 StarRocks 集群中已经部署的 Broker,后面版本会去掉Broker角色

2、从外部存储系统导入(Broker Load)

2.1 数据导入流程

Starrocks数据导入方式_第2张图片

发现没有独立的Broker服务了

在 v2.4 及以前版本

  • 数据导入时需要借助 Broker 才能访问外部存储系统
  • Broker 是一个独立的无状态服务,一般在BE上,可以通过 [SHOW BROKER](https://docs.starrocks.io/zh-cn/latest/sql-reference/sql-statements/Administration/SHOW BROKER) 语句来查看 StarRocks 集群中已经部署的 Broker
  • 通过 Broker,StarRocks 能够访问和读取外部存储系统上的数据文件,并利用自身的计算资源对数据文件中的数据进行预处理和导入

自 v2.5 以后

  • StarRocks 在执行 Broker Load 时不需要借助 Broker 即可访问外部存储系统,称为“无 Broker 的导入”,
  • 需要注意的是,无 Broker 的导入在数据源为 HDFS 的某些场景下会受限,例如,在多 HDFS 集群或者多 Kerberos 用户的场景。在这些场景下,可以继续采用有 Broker 的导入,需要确保至少部署了一组独立的 Broker。

2.2 子任务拆分方法

  • 如果声明多个 data_desc 参数对应导入多张不同的表,则每张表数据的导入会拆分成一个子任务。
  • 如果声明多个 data_desc 参数对应导入同一张表的不同分区,则每个分区数据的导入会拆分成一个子任务。

一个作业 可以进行多个表导入案例:

LOAD LABEL test_db.label_brokerload_multiplefile_multipletable
(
    DATA INFILE("hdfs://:/user/starrocks/file1.csv")
    INTO TABLE table1
    COLUMNS TERMINATED BY ","
    (id, name, score)
    ,
    DATA INFILE("hdfs://:/user/starrocks/file2.csv")
    INTO TABLE table2
    COLUMNS TERMINATED BY ","
    (id, name, score)
)
WITH BROKER
(
    "username" = "",
    "password" = ""
)
PROPERTIES
(
    "timeout" = "3600"
);

2.3 任务的实例数算法

每个表对应一个子任务,每个子任务实例数如下公式,这些实例会均匀地被分配到 BE 上并行执行

min_bytes_per_broker_scanner:单个实例处理的最小数据量,默认为 64 MB。

load_parallel_instance_num:单个 BE 上每个作业允许的并发实例数,默认为 1 个。

单个子任务的实例总数 = min(单个子任务待导入数据量的总大小/min_bytes_per_broker_scanner,load_parallel_instance_num x BE 总数)
一般情况下,一个导入作业只有一个 data_desc,只会拆分成一个子任务,子任务会拆分成与 BE 总数相等的实例。

FE 配置项 max_broker_load_job_concurrency 指定了 StarRocks 集群中可以并行执行的 Broker Load 任务的最大数量。如果某一时间段内提交的 Broker Load 作业的任务总数超过最大数量,则超出作业会按照各自的提交时间放到队列中排队等待调度。

2.4 疑问

1)没有Broker服务了,那数据导入需要BE的算资源对数据文件中的数据进行预处理和导入,对BE的查询是否有影响?
一般Broker和BE部署在一起,共用1台机器资源,不管几个角色资源使用情况相差不大

2)为什么去掉Broker这个角色?
角色太多运维陈本太高

3、从Kafka持续导入(Routine Load)

https://docs.starrocks.io/zh-cn/latest/loading/RoutineLoad

3.1 特点

  • Routine Load 支持 Exactly-Once 语义,能够保证数据不丢不重。

  • Routine Load 目前支持从 Kakfa 集群中消费 CSV、JSON、Avro (自 v3.0.1) 格式的数据。

3.2 数据导入流程

Starrocks数据导入方式_第3张图片

  • 导入作业(Load job),对象在FE进程中
    导入作业会常驻运行,当导入作业的状态为 RUNNING 时,会持续不断生成一个或多个并行的导入任务,不断消费 Kafka 集群中一个 Topic 的消息,并导入至 StarRocks 中。

  • 导入任务(Load task),对象也在FE进程中,拉取kafka的数据,再通过http方式先BE写入数据

    导入作业会按照一定规则拆分成若干个导入任务。导入任务是执行导入的基本单位,作为一个独立的事务,通过 Stream Load 导入机制实现。若干个导入任务并行消费一个 Topic 中不同分区的消息,并导入至 StarRocks 中。

3.2 作业流程

1) 创建常驻的导入作业

您需要向 StarRocks 提交创建导入作业的 SQL 语句。 FE 会解析 SQL 语句,并创建一个常驻的导入作业。

2) 拆分导入作业为多个导入任务

FE 将导入作业按照一定规则拆分成若干个导入任务。一个导入任务作为一个独立的事务。

拆分规则如下:

  • FE 根据期望任务并行度desired_concurrent_number、Kafka Topic 的分区数量、存活 BE 数量等,计算得出实际任务并行度。
  • FE 根据实际任务并行度将导入作业分为若干导入任务,放入任务执行队列中。

每个 Topic 会有多个分区,分区与导入任务之间的对应关系为:

  • 每个分区的消息只能由一个对应的导入任务消费。
  • 一个导入任务可能会消费一个或多个分区。
  • 分区会尽可能均匀地分配给导入任务。

3) 多个导入任务并行进行,消费 Kafka 多个分区的消息,导入至 StarRocks

  1. 调度和提交导入任务:FE 定时调度任务执行队列中的导入任务,分配给选定的 Coordinator BE。调度导入任务的时间间隔由 max_batch_interval 参数,并且 FE 会尽可能均匀地向所有 BE 分配导入任务。有关 max_batch_interval 参数的详细介绍,请参见 [CREATE ROUTINE LOAD](https://docs.starrocks.io/zh-cn/latest/sql-reference/sql-statements/data-manipulation/CREATE ROUTINE LOAD#job_properties)。

4) 执行导入任务:Coordinator BE 执行导入任务,消费分区的消息,解析并过滤数据。导入任务需要消费足够多的消息,或者消费足够长时间。消费时间和消费的数据量由 FE 配置项 max_routine_load_batch_sizeroutine_load_task_consume_second决定,有关该配置项的更多说明,请参见 配置参数。然后,Coordinator BE 将消息分发至相关 Executor BE 节点, Executor BE 节点将消息写入磁盘。

   **说明**
  StarRocks 可以通过安全认证机制,包括 SASL_SSL 认证、SASL 认证和 SSL 认证,以及无认证的方式连接 Kafka。本文以无认证的方式连接 Kafka 为例进行说明,如果您需要通过安全认证机制连接 Kafka,请参见[CREATE ROUTINE LOAD](https://docs.starrocks.io/zh-cn/latest/sql-reference/sql-statements/data-manipulation/CREATE ROUTINE LOAD)。
  1. 持续生成新的导入任务,不间断地导入数据

    Executor BE 节点成功写入数据后, Coordonator BE 会向 FE 汇报导入结果。

    FE 根据汇报结果,继续生成新的导入任务,或者对失败的导入任务进行重试,连续地导入数据,并且能够保证导入数据不丢不重

3.3 数据导入总结
  • FE收到作业请求之后,会分配给每个任务消费kakfa的分区
  • 每个任务会把任务封装成 Stream Load ,选择一台BE作为Coordinator,Coordinator从kafka拉取足够的数据,分拣之后发送到ExecuteBE上 完成数据导入
  • 然后再把执行结果一步步往上汇报
  • kafka数据导入作业,已导入的数据的offset 是保存在SR端的

4、Spark方式导入

https://docs.starrocks.io/zh-cn/latest/loading/Spark-connector-starrocks
https://docs.starrocks.io/zh-cn/latest/loading/SparkLoad

  • Spark connector基于Stream Load方式实现,攒批之后写入
  • Spark Load 基于Broker实现 ,流程过于复杂(后面会慢慢弃用)

你可能感兴趣的:(Starrocks,大数据)