目录
[1. 导入Kafka数据到Doris](#1. 导入Kafka数据到Doris)
[2. 严格模式导入Kafka数据到Doris](#2. 严格模式导入Kafka数据到Doris)
[3. kafka 简单json格式数据导入到Doris](#3. kafka 简单json格式数据导入到Doris)
[4. kafka json 数组格式数据导入到Doris](#4. kafka json 数组格式数据导入到Doris)
[5. 注意事项](#5. 注意事项)
++进入正文之前,欢迎订阅专题、对博文点赞、评论、收藏,关注IT贫道,获取高质量博客内容!++
++宝子们订阅、点赞、收藏不迷路!抓紧订阅专题!++
目前Routine Load仅支持从Kafka中导入数据到Doris中,在将Kafka数据导入到Doris中有如下限制:
- 支持的Kafka可以是无认证的Kafka或者是SSL方式认证的kafka
- kafka版本要求最好大于0.10.0.0(含)以上,如果低于该版本的kafka需要修改 be 的配置,将 kafka_broker_version_fallback 的值设置为要兼容的旧版本,或者在创建routine load的时候直接设置 property.broker.version.fallback的值为要兼容的旧版本,使用旧版本的代价是routine load 的部分新特性可能无法使用,如根据时间设置 kafka 分区的 offset。
- Kafka中消息格式为csv,json文本格式,csv 每一个 message 为一行,且行尾不包含换行符
1. 导入Kafka数据到Doris
1) 创建Doris表
sql
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,命令如下:
bash
#创建 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表中。
sql
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
sql
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) 测试验证
sql
#向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:
sql
#停止名称为 example_db.test1的Routine Load
mysql> stop routine load for example_db.test1;
删除Doris表routine_load_t1,并重新创建该表:
sql
#删除表
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:
sql
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对应的表:
sql
#向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表
sql
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,命令如下:
sql
#创建 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表中。
sql
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
sql
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)测试验证
sql
#向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表
sql
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,命令如下:
bash
#创建 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表中。
sql
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
sql
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)测试验证
sql
#向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界的荣耀与辉煌!
✏️评论:留下心声墨迹,你的评论将是我努力改进的方向!