Apache Doris (三十三):Doris 数据导入(十一)Routine Load 2- 导入案例及注意事项

目录

1. 导入Kafka数据到Doris

2. 严格模式导入Kafka数据到Doris

3. kafka 简单json格式数据导入到Doris

4. kafka json 数组格式数据导入到Doris

5. 注意事项


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

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


目前Routine Load仅支持从Kafka中导入数据到Doris中,在将Kafka数据导入到Doris中有如下限制:

  1. 支持的Kafka可以是无认证的Kafka或者是SSL方式认证的kafka
  2. kafka版本要求最好大于0.10.0.0(含)以上,如果低于该版本的kafka需要修改 be 的配置,将 kafka_broker_version_fallback 的值设置为要兼容的旧版本,或者在创建routine load的时候直接设置 property.broker.version.fallback的值为要兼容的旧版本,使用旧版本的代价是routine load 的部分新特性可能无法使用,如根据时间设置 kafka 分区的 offset。
  3. Kafka中消息格式为csv,json文本格式,csv 每一个 message 为一行,且行尾不包含换行符

1. 导入Kafka数据到Doris

1) 创建Doris表

create table routine_load_t1(

id int,

name string,

age int,

score double

)

ENGINE = olap

DUPLICATE KEY(id)

DISTRIBUTED BY HASH(`id`) BUCKETS 8;

2)创建Kafka topic

登录kafka,在kafka中创建 “my-topic1”topic,命令如下:

#创建 my-topic1 topic

[root@node1 ~]# kafka-topics.sh --create --bootstrap-server node1:9092,node2:9092,node3:9092 --topic my-topic1  --partitions 3 --replication-factor 3



#查看创建的topic

[root@node1 ~]# kafka-topics.sh  --list --bootstrap-server node1:9092,node2:9092,node3:9092

__consumer_offsets

my-topic1

3) 创建Routine Load

创建Routine Load 将Kafka中的数据加载到Doris routine_load_t1表中。

CREATE ROUTINE LOAD example_db.test1 ON routine_load_t1
COLUMNS TERMINATED BY ",",
COLUMNS(id, name, age, score)
PROPERTIES
(
"desired_concurrent_number"="3",
"max_batch_interval" = "20",
"max_batch_rows" = "300000",
"max_batch_size" = "209715200",
"strict_mode" = "false"
)
FROM KAFKA
(
"kafka_broker_list" = "node1:9092,node2:9092,node3:9092",
"kafka_topic" = "my-topic1",
"property.group.id" = "mygroup-1",
"property.client.id" = "client-1",
"property.kafka_default_offsets" = "OFFSET_BEGINNING"
);

4) 查看提交的Routine Load

mysql> show routine load for example_db.test1\G;                                                                                                 

*************************** 1. row ***************************

                  Id: 25048

                Name: test1

          CreateTime: 2023-03-07 19:33:36

           PauseTime: NULL

             EndTime: NULL

              DbName: default_cluster:example_db

           TableName: routine_load_t1

               State: RUNNING

      DataSourceType: KAFKA

      CurrentTaskNum: 3

       JobProperties: ... ...

以上可以看到state为running,代表当前Routine Load任务正常。如果任务异常可以通过“stop routine load for example_db.test1;”命令将任务停止后,重新再创建。

5) 测试验证

#向Kafka my-topic1 中输入如下数据

[root@node1 ~]# kafka-console-producer.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --topic my-topic1

>1,zs,18,100

>2,ls,19,200

>3,ww,xxx,300

>4,ml,21,400

>5,tq,22,500



#查询doris 表数据

mysql> select * from routine_load_t1;

+------+------+------+-------+

| id   | name | age  | score |

+------+------+------+-------+

|    1 | zs   |   18 |   100 |

|    2 | ls   |   19 |   200 |

|    5 | tq   |   22 |   500 |

|    3 | ww   | NULL |   300 |

|    4 | ml   |   21 |   400 |

+------+------+------+-------+

注意:第三条数据插入到表中后,对应的age为null,这是因为数据类型不对自动转换成NULL。

2. 严格模式导入Kafka数据到Doris

停止以上example_db.test1名称的Routine Load:

#停止名称为 example_db.test1的Routine Load

mysql> stop routine load for example_db.test1;

删除Doris表routine_load_t1,并重新创建该表:

#删除表

mysql> drop table routine_load_t1;



#重新创建该表

create table routine_load_t1(

id int,

name string,

age int,

score double

)

ENGINE = olap

DUPLICATE KEY(id)

DISTRIBUTED BY HASH(`id`) BUCKETS 8;

以严格模式重新创建该Routine Load,只需要在Properties中指定"strict_mode" = "true"参数即可,执行新的Routine Load:

CREATE ROUTINE LOAD example_db.test1 ON routine_load_t1
COLUMNS TERMINATED BY ",",
COLUMNS(id, name, age, score)
PROPERTIES
(
"desired_concurrent_number"="3",
"max_batch_interval" = "20",
"max_batch_rows" = "300000",
"max_batch_size" = "209715200",
"strict_mode" = "true",

"max_error_number" = "10"
)
FROM KAFKA
(
"kafka_broker_list" = "node1:9092,node2:9092,node3:9092",
"kafka_topic" = "my-topic1",
"property.group.id" = "mygroup-1",
"property.client.id" = "client-1",
"property.kafka_default_offsets" = "OFFSET_BEGINNING"
);

注意:以上"max_error_number" = "10"代表在采样窗口(max_batch_rows * 10)中允许错误的行数为10,如果超过该错误行数,Load任务会被PAUSE暂停。

编写好以上Routine Load之后执行,继续在Kafka Producer中输入以下数据,并查询Doris对应的表:

#向kafka my-topic1 中继续输入如下数据

6,a1,23,10  

7,a2,xx,11

8,a3,25,12    

xx,a4,26,13      

10,a5,27,14



#查询表 my-topic1中的数据结果如下

mysql> select * from routine_load_t1;

+------+------+------+-------+

| id   | name | age  | score |

+------+------+------+-------+

|    1 | zs   |   18 |   100 |

|    5 | tq   |   22 |   500 |

|    6 | a1   |   23 |    10 |

|   10 | a5   |   27 |    14 |

|    4 | ml   |   21 |   400 |

|    8 | a3   |   25 |    12 |

|    2 | ls   |   19 |   200 |

+------+------+------+-------+

可以看到开启严格模式后,不符合列格式转换的数据都被过滤掉,需要注意的是在采样窗口(max_batch_rows * 10)中允许错误的行数为10,如果超过该错误行数,Load任务会被PAUSE暂停。

3. kafka 简单json格式数据导入到Doris

这里演示kafka中json格式数据为简单的{"xx":"xx","xx":"xx"...}格式。

1)创建Doris表

create table routine_load_t2(

id int,

name string,

age int,

score double

)

ENGINE = olap

DUPLICATE KEY(id)

DISTRIBUTED BY HASH(`id`) BUCKETS 8;

2)创建Kafka topic

登录kafka,在kafka中创建 “my-topic2”topic,命令如下:

#创建 my-topic2 topic

[root@node1 ~]# kafka-topics.sh --create --bootstrap-server node1:9092,node2:9092,node3:9092 --topic my-topic2  --partitions 3 --replication-factor 3



#查看创建的topic

[root@node1 ~]# kafka-topics.sh  --list --bootstrap-server node1:9092,node2:9092,node3:9092

__consumer_offsets

my-topic1

my-topic2

3)创建Routine Load

创建Routine Load 将Kafka中的json格式数据加载到Doris routine_load_t2表中。

CREATE ROUTINE LOAD example_db.test_json_label_1 ON routine_load_t2
COLUMNS(id,name,age,score)
PROPERTIES
(
"desired_concurrent_number"="3",
"max_batch_interval" = "20",
"max_batch_rows" = "300000",
"max_batch_size" = "209715200",
"strict_mode" = "false",
"format" = "json"
)
FROM KAFKA
(
"kafka_broker_list" = "node1:9092,node2:9092,node3:9092",
"kafka_topic" = "my-topic2",
"kafka_partitions" = "0,1,2",
"kafka_offsets" = "0,0,0"
);

4)查看提交的Routine Load

mysql> show routine load for example_db.test_json_label_1\G;                                                                                                 

*************************** 1. row ***************************

                  Id: 25048

                Name: test1

          CreateTime: 2023-03-07 19:33:36

           PauseTime: NULL

             EndTime: NULL

              DbName: default_cluster:example_db

           TableName: routine_load_t1

               State: RUNNING

      DataSourceType: KAFKA

      CurrentTaskNum: 3

       JobProperties: ... ...

以上可以看到state为running,代表当前Routine Load任务正常。如果任务异常可以通过“stop routine load for example_db.test1;”命令将任务停止后,重新再创建。

5)测试验证

#向Kafka my-topic2 中输入如下数据

[root@node1 ~]# kafka-console-producer.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --topic my-topic2

>{"id":1,"name":"zs","age":18,"score":100}

>{"id":2,"name":"ls","age":19,"score":200}

>{"id":3,"name":"ww","age":20,"score":300}

>{"id":4,"name":"ml","age":21,"score":400}

>{"id":5,"name":"tq","age":22,"score":500}



#查询doris 表数据

mysql> select * from routine_load_t2;

+------+------+------+-------+

| id   | name | age  | score |

+------+------+------+-------+

|    5 | tq   |   22 |   500 |

|    3 | ww   |   20 |   300 |

|    2 | ls   |   19 |   200 |

|    4 | ml   |   21 |   400 |

|    1 | zs   |   18 |   100 |

+------+------+------+-------+

4. kafka json 数组格式数据导入到Doris

这里演示kafka中json格式数据为json数组,格式为[{"xx":"xx","xx":"xx"...},{...}..]格式。

1)创建Doris表

create table routine_load_t3(

id int,

name string,

age int,

score double

)

ENGINE = olap

DUPLICATE KEY(id)

DISTRIBUTED BY HASH(`id`) BUCKETS 8;

2)创建Kafka topic

登录kafka,在kafka中创建 “my-topic3”topic,命令如下:

#创建 my-topic2 topic

[root@node1 ~]# kafka-topics.sh --create --bootstrap-server node1:9092,node2:9092,node3:9092 --topic my-topic3  --partitions 3 --replication-factor 3



#查看创建的topic

[root@node1 ~]# kafka-topics.sh  --list --bootstrap-server node1:9092,node2:9092,node3:9092

__consumer_offsets

my-topic1

my-topic2

my-topic3

3) 创建Routine Load

创建Routine Load 将Kafka中的jso数组格式数据加载到Doris routine_load_t3表中。

CREATE ROUTINE LOAD example_db.test_json_label_2 ON routine_load_t3
COLUMNS(id,name,age,score)
PROPERTIES
(
"desired_concurrent_number"="3",
"max_batch_interval" = "20",
"max_batch_rows" = "300000",
"max_batch_size" = "209715200",
"strict_mode" = "false",
"format" = "json",
"jsonpaths"="[\"$.id\",\"$.name\",\"$.age\",\"$.score\"]",
"strip_outer_array" = "true"
)
FROM KAFKA
(
"kafka_broker_list" = "node1:9092,node2:9092,node3:9092",
"kafka_topic" = "my-topic3",
"kafka_partitions" = "0,1,2",
"kafka_offsets" = "0,0,0"
);

4)查看提交的Routine Load

mysql> show routine load for example_db.test_json_label_2\G;  

*************************** 1. row ***************************

                  Id: 25302

                Name: test_json_label_2

          CreateTime: 2023-03-07 20:36:08

           PauseTime: NULL

             EndTime: NULL

              DbName: default_cluster:example_db

           TableName: routine_load_t3

               State: RUNNING

      DataSourceType: KAFKA

      CurrentTaskNum: 3

       JobProperties: ... ...

以上可以看到state为running,代表当前Routine Load任务正常。如果任务异常可以通过“stop routine load for example_db.test1;”命令将任务停止后,重新再创建。

5)测试验证

#向Kafka my-topic3 中输入如下数据

[root@node1 ~]# kafka-console-producer.sh --bootstrap-server node1:9092,node2:9092,node3:9092 --topic my-topic3

>[{"id":1,"name":"zs","age":18,"score":100},{"id":2,"name":"ls","age":19,"score":200}]



#查询doris 表数据

mysql> select * from routine_load_t3;

+------+------+------+-------+

| id   | name | age  | score |

+------+------+------+-------+

|    1 | zs   |   18 |   100 |

|    2 | ls   |   19 |   200 |

+------+------+------+-------+

5. 注意事项

1)查看作业状态的具体命令和示例可以通过 HELP SHOW ROUTINE LOAD; 命令查看。

2)用户可以通过 STOP/PAUSE/RESUME 三个命令来控制作业的停止,暂停和重启。可以通过 HELP STOP ROUTINE LOAD; HELP PAUSE ROUTINE LOAD; 以及 HELP RESUME ROUTINE LOAD; 三个命令查看帮助和示例。

3)FE会自动定期清理STOP状态的ROUTINE LOAD,而PAUSE状态的则可以再次被恢复启用。

4)当用户在创建例行导入声明的 kafka_topic 在kafka集群中不存在时。

如果用户 kafka 集群的 broker 设置了 auto.create.topics.enable = true,则 kafka_topic 会先被自动创建,自动创建的 partition 个数是由用户方的kafka集群中的 broker 配置 num.partitions 决定的。例行作业会正常的不断读取该 topic 的数据。

如果用户 kafka 集群的 broker 设置了 auto.create.topics.enable = false, 则 topic 不会被自动创建,例行作业会在没有读取任何数据之前就被暂停,状态为 PAUSED。

5)其他配置参数

  • max_routine_load_task_concurrent_num:

FE 配置项,默认为 5,可以运行时修改。该参数限制了一个例行导入作业最大的子任务并发数。建议维持默认值。设置过大,可能导致同时并发的任务数过多,占用集群资源。

  • max_routine_load_task_num_per_be:

FE 配置项,默认为5,可以运行时修改。该参数限制了每个 BE 节点最多并发执行的子任务个数。建议维持默认值。如果设置过大,可能导致并发任务数过多,占用集群资源。

  • max_routine_load_job_num:

FE 配置项,默认为100,可以运行时修改。该参数限制的例行导入作业的总数,包括 NEED_SCHEDULED, RUNNING, PAUSE 这些状态。超过后,不能在提交新的作业。

  • max_consumer_num_per_group:

BE 配置项,默认为 3。该参数表示一个子任务中最多生成几个 consumer 进行数据消费。对于 Kafka 数据源,一个 consumer 可能消费一个或多个 kafka partition。假设一个任务需要消费 6 个 kafka partition,则会生成 3 个 consumer,每个 consumer 消费 2 个 partition。如果只有 2 个 partition,则只会生成 2 个 consumer,每个 consumer 消费 1 个 partition。

  • max_tolerable_backend_down_num:

FE 配置项,默认值是0。在满足某些条件下,Doris可将PAUSED的任务重新调度,即变成RUNNING。该参数为0代表只有所有BE节点是alive状态才允许重新调度。

  • period_of_auto_resume_min:

FE 配置项,默认是5分钟。Doris重新调度,只会在5分钟这个周期内,最多尝试3次. 如果3次都失败则锁定当前任务,后续不在进行调度。但可通过人为干预,进行手动恢复。

6)关于同步SSL Kafka数据

Doris访问Kerberos认证的Kafka集群参考官网:https://doris.apache.org/zh-CN/docs/dev/data-operate/import/import-way/routine-load-manual/


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


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