Apache Doris (三十二):Doris 数据导入(十)Routine Load 1- 基本原理及语法

目录

1. 基本原理

2. Routine Load 语法

​​​​​​​3. 严格模式


进入正文之前,欢迎订阅专题、对博文点赞、评论、收藏,关注IT贫道,获取高质量博客内容!

宝子们订阅、点赞、收藏不迷路!抓紧订阅专题!


例行导入(Routine Load)功能,支持用户提交一个常驻的导入任务,通过不断的从指定的数据源读取数据,将数据导入到 Doris 中。目前Routine Load仅支持从Kafka中导入数据。

​​​​​​​1. 基本原理

Apache Doris (三十二):Doris 数据导入(十)Routine Load 1- 基本原理及语法_第1张图片

如上图,Client 向 FE 提交一个Routine Load 作业。FE 通过 JobScheduler 将一个导入作业拆分成若干个 Task。每个 Task 负责导入指定的一部分数据。Task 被 TaskScheduler 分配到指定的 BE 上执行。

在 BE 上,一个 Task 被视为一个普通的导入任务,通过 Stream Load 的导入机制进行导入。导入完成后,向 FE 汇报。FE 中的 JobScheduler 根据汇报结果,继续生成后续新的 Task,或者对失败的 Task 进行重试。

整个 Routine Load 作业通过不断的产生新的 Task,来完成数据不间断的导入。

​​​​​​​2. Routine Load 语法

Routine Load 语法如下:

CREATE ROUTINE LOAD [db.]job_name ON tbl_name
[merge_type]
[load_properties]
[job_properties]
FROM data_source [data_source_properties]
[COMMENT "comment"]

1) [db.]job_name

导入作业的名称,在同一个 database 内,相同名称只能有一个 job 在运行。

2) tbl_name

指定需要导入的表的名称。

3)merge_type:

数据合并类型。默认为 APPEND,表示导入的数据都是普通的追加写操作。MERGE 和 DELETE 类型仅适用于 Unique Key 模型表。其中 MERGE 类型需要配合 [DELETE ON] 语句使用,以标注 Delete Flag 列。而 DELETE 类型则表示导入的所有数据皆为删除数据。

4)load_properties:

用于描述导入数据。组成如下:

[column_separator],
[columns_mapping],
[preceding_filter],
[where_predicates],
[partitions],
[DELETE ON],
[ORDER BY]
  • column_separator:指定列分隔符,默认为 \t,例如:COLUMNS TERMINATED BY ","
  • columns_mapping:用于指定文件列和表中列的映射关系,以及各种列转换等。例如:(k1, k2, tmpk1, k3 = tmpk1 + 1)
  • preceding_filter:过滤原始数据。
  • where_predicates:根据条件对导入的数据进行过滤。例如:WHERE k1 > 100 and k2 = 1000
  • partitions:指定导入目的表的哪些 partition 中。如果不指定,则会自动导入到对应的 partition 中。例如:PARTITION(p1, p2, p3)
  • DELETE ON:需配合 MEREGE 导入模式一起使用,仅针对 Unique Key 模型的表。用于指定导入数据中表示 Delete Flag 的列和计算关系。例如:DELETE ON v3 >100
  • ORDER BY:仅针对 Unique Key 模型的表。用于指定导入数据中表示 Sequence Col 的列。主要用于导入时保证数据顺序。

5)job_properties

用于指定例行导入作业的通用参数。例如:

PROPERTIES (
"key1" = "val1",
"key2" = "val2"
)

支持的参数如下:

  • desired_concurrent_number:期望的并发度。一个例行导入作业会被分成多个子任务执行。这个参数指定一个作业最多有多少任务可以同时执行。必须大于0。默认为3。这个并发度并不是实际的并发度,实际的并发度,会通过集群的节点数、负载情况,以及数据源的情况综合考虑。
  • max_batch_interval/max_batch_rows/max_batch_size:

这三个参数分别表示:

max_batch_interval:每个子任务最大执行时间,单位是秒。范围为 5 到 60。默认为10。

max_batch_rows:每个子任务最多读取的行数。必须大于等于200000。默认是200000。

max_batch_size:每个子任务最多读取的字节数。单位是字节,范围是 100MB 到 1GB。默认是 100MB。

这三个参数,用于控制一个子任务的执行时间和处理量。当任意一个达到阈值,则任务结束。使用举例:

"max_batch_interval" = "20",
"max_batch_rows" = "300000",
"max_batch_size" = "209715200"

  • max_error_number:

采样窗口内,允许的最大错误行数。必须大于等于0。默认是 0,即不允许有错误行。采样窗口为 max_batch_rows * 10。即如果在采样窗口内,错误行数大于 max_error_number,则会导致例行作业被暂停,需要人工介入检查数据质量问题。注意:被 where 条件过滤掉的行不算错误行。

  • strict_mode:严格模式,参考下一小节严格模式。
  • timezone:指定导入作业所使用的时区。默认为使用 Session 的 timezone 参数。该参数会影响所有导入涉及的和时区有关的函数结果。
  • format:指定导入数据格式,默认是csv,支持json格式。
  • jsonpaths:当导入数据格式为 json 时,可以通过 jsonpaths 指定抽取 Json 数据中的字段。
  • strip_outer_array:当导入数据格式为 json 时,strip_outer_array 为 true 表示 Json 数据以数组的形式展现,数据中的每一个元素将被视为一行数据。默认值是 false。
  • json_root:当导入数据格式为 json 时,可以通过 json_root 指定 Json 数据的根节点。Doris 将通过 json_root 抽取根节点的元素进行解析。默认为空。
  • send_batch_parallelism:

整型,用于设置发送批处理数据的并行度,如果并行度的值超过 BE 配置中的 max_send_batch_parallelism_per_job,那么作为协调点的 BE 将使用 max_send_batch_parallelism_per_job 的值。

  • load_to_single_tablet:布尔类型,为 true 表示支持一个任务只导入数据到对应分区的一个 tablet,默认值为 false,该参数只允许在对带有 random 分区的 olap 表导数的时候设置。

6)FROM data_source [data_source_properties]

数据源的类型。当前支持:

FROM KAFKA
(
"key1" = "val1",
"key2" = "val2"
)

以上配置参数支持如下属性:

  • kafka_broker_list:Kafka 的 broker 连接信息。格式为 ip:host。多个broker之间以逗号分隔。
  • kafka_topic:指定要订阅的 Kafka 的 topic。
  • kafka_partitions/kafka_offsets:指定需要订阅的 kafka partition,以及对应的每个 partition 的起始 offset。如果指定时间,则会从大于等于该时间的最近一个 offset 处开始消费。

offset 可以指定从大于等于 0 的具体 offset,或者:

OFFSET_BEGINNING: 从有数据的位置开始订阅。

OFFSET_END: 从末尾开始订阅。

时间格式,如:"2021-05-22 11:00:00"

如果没有指定,则默认从 OFFSET_END 开始订阅 topic 下的所有 partition。使用举例:

"kafka_partitions" = "0,1,2,3",
"kafka_offsets" = "101,0,OFFSET_BEGINNING,OFFSET_END"
或者
"kafka_partitions" = "0,1,2",
"kafka_offsets" = "2021-05-22 11:00:00,2021-05-22 11:00:00,2021-05-22 11:00:00"

注意,时间格式不能和 OFFSET 格式混用。

  • property:指定自定义kafka参数。功能等同于kafka shell中 "--property" 参数。

7)comment:

例行导入任务的注释信息。

​​​​​​​3. 严格模式

严格模式的意思是,对于导入过程中的列类型转换进行严格过滤。严格过滤的策略如下:

对于列类型转换来说,如果开启严格模式,则错误的数据将被过滤。这里的错误数据是指:原始数据并不为 null,而在进行列类型转换后结果为 null 的这一类数据。这里说指的列类型转换,并不包括用函数计算得出的null值。

对于导入的某列类型包含范围限制的,如果原始数据能正常通过类型转换,但无法通过范围限制的,严格模式对其也不产生影响。例如:如果类型是 decimal(1,0), 原始数据为 10,则属于可以通过类型转换但不在列声明的范围内。这种数据strict对其不产生影响。

  • 以列类型为 TinyInt 来举例:

原始数据类型

原始数据举例

转换为TinyInt后的值

严格模式

结果

空值

\N

NULL

开启或关闭

NULL

非空值

“abc”or 2000

NULL

开启

非法值(被过滤)

非空值

“abc”

NULL

关闭

NULL

非空值

1

1

开启或关闭

正确导入

说明:

  1. 表中的列允许导入空值;
  2. abc及2000在转换为TinyInt(最大2^7-1)后,会因类型或精度问题变为 NULL。在严格模式开启的情况下,这类数据将会被过滤。而如果是关闭状态,则会导入 null。
  • 以列类型为 Decimal(1,0) 举例(Decimal整数位1位,小数位0位)

原始数据类型

原始数据举例

转换为TinyInt后的值

严格模式

结果

空值

\N

null

开启或关闭

NULL

非空值

aaa

NULL

开启

非法值(被过滤)

非空值

aaa

NULL

关闭

NULL

非空值

1 or 10

1 or 10

开启或关闭

正确导入

说明:

  1. 表中的列允许导入空值;
  2. abc 在转换为 Decimal 后,会因类型问题变为 NULL。在严格模式开启的情况下,这类数据将会被过滤。而如果是关闭状态,则会导入 null。
  3. 10虽然是一个超过范围的值,但是因为其类型符合 decimal 的要求,所以严格模式对其不产生影响。10最后会在其他导入处理流程中被过滤。但不会被严格模式过滤。

个人主页:IT贫道的博客_CSDN博客-Apache Doris,Kerberos安全认证,随笔领域博主 主页包含各种IT体系技术
订阅:拥抱独家专题,你的订阅将点燃我的创作热情!
点赞:赞同优秀创作,你的点赞是对我创作最大的认可!
⭐️ 收藏:收藏原创博文,让我们一起打造IT界的荣耀与辉煌!
✏️评论:留下心声墨迹,你的评论将是我努力改进的方向!

你可能感兴趣的:(Apache,Doris,doris,实时数仓,数据仓库,大数据,olap,分布式数据库)