Doris进阶——数据导入

数据导入:

将用户的原始数据导入到Doris中,导入成功后可以通过Mysql客户端进行查询。所有的导入方式都支持CSV格式,其中Broker Load 中支持parquet和orc数据格式。

Broker Load导入方式:

通过Broker进程访问读取外部数据源(HDFS)的数据导入到Doris中,数据量在几十到百GB级别。通过SHOW LOAD命令查看导入结果。

基本原理:用户在提交导入任务后,FE会生成对应的Plan并根据目前BE的个数和文件的大小,将Plan分给多个Plan执行,每个BE执行一部分导入数据。BE在执行的过程中会从Borker拉去数据,在对数据transform之后将数据导入系统。所有BE均完成导入,由FE最终决定是否导入成功。

LOAD LABEL db_name.label_name -- 数据库.导入任务的标识
(data_desc, ...) 
WITH BROKER broker_name broker_properties -- broker的名称
[PROPERTIES (key1=value1, ... )]

* data_desc:

    DATA INFILE ('file_path', ...) -- 数据源地址
    [NEGATIVE]
    INTO TABLE tbl_name -- 导入的表名
    [PARTITION (p1, p2)] -- 导入分区指定
    [COLUMNS TERMINATED BY separator ] -- 指定分隔符
    [(col1, ...)] -- 可指定列(c1,c2,c3,c4)
    [PRECEDING FILTER predicate]
    [SET (k1=f1(xx), k2=f2(xx))] -- 对应列名(id=ci,name=c2......)
    [WHERE predicate]

* broker_properties: 

    (key1=value1, ...) -- 指定一些数据源的参数,比如HDFS开启了HA模式,要指定相应的参数

示例:

--建Doris表 
create table broker_test
(
id int ,
name varchar(50),
age int 
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 8;

-- 创建Broker的导入任务

LOAD LABEL test.broker_2
(
DATA INFILE("hdfs://test01:8020/student.csv")
INTO TABLE `broker_test`
COLUMNS TERMINATED BY ","
FORMAT AS "csv"
(id, name, age)
)
WITH BROKER broker_name
(
--HDFS HA模式参数
"dfs.nameservices" = "my_cluster",
"dfs.ha.namenodes.my_cluster" = "nn1,nn2,nn3",
"dfs.namenode.rpc-address.my_cluster.nn1" = "test01:8020",
"dfs.namenode.rpc-address.my_cluster.nn2" = "test02:8020",
"dfs.namenode.rpc-address.my_cluster.nn3" = "test03:8020",
"dfs.client.failover.proxy.provider" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
)
PROPERTIES
(
    "timeout" = "3600" -- 导入作业超时时间
 
);
  • 通过SHOW LOAD ORDER BY CREATETIME LIMIT 1 \G;
  • 取消导入:

    CANCEL LOAD  [FROM db_name]  WHERE LABEL=”load_label”;

StreamLoad导入方式:

SteamLoad是一个同步导入方式,通过HTTP的方式将本地文件导入或者数据流导入到Doris中,同时会直接将导入结果进行反馈。

目前StreamLoad支持的数据格式:CSV、JSON

原理:

用户提交StreamLoad请求,FE会将请求转发给BE,这个BE就是一个Coordinator (协调者),然后通过Coordinator 将数据进行接收并分发给其他BE,StreeamLoad的导入结果也会由Coordinator 反馈给用户。

语法:

详细语法可以参考官网,或者通过HELP STREAM LOAD 命令查看
curl --location-trusted -u user:passwd [-H ""...] -T data.file -XPUT http://fe_host:http_port/api/{db}/{table}/_stream_load

示例:

create table streamLoad_test
(
id int ,
name varchar(50),
age int,
sex int 
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10; 

--导入命令
curl --location-trusted -u user:password -H "label:job1" -H"column_separator:," -T /root/student.csv -X PUT http://test01:8030/api/test/streamLoad_test/_stream_load

RoutineLoad方式:

RoutineLoad是Doris提供的一种可以从指定数据源将数据导入到Doris中的一种方式,目前仅支持从Kafka中导入数据。

支持无认证的Kafka访问,以及通过SSL方式认证的Kafka集群,支持的Kafka Message格式为CSV、JSON,每一行为一个Message,结尾不包含换行符。

原理:

FE读取Kafka对应topic的数据并生成任务,通过Job Scheduler将任务划分成多个Task,将Task发送到BE,BE执行导入任务并在完成后向JobScheduler进行汇报,Job Scheduler通过BE的汇报结果继续生成Task,整个导入流程不间断。

语法:

-- 可通过HELP ROUTINE LOAD 命令或者参考官网查看更多详细语法

CREATE ROUTINE LOAD [db.]job_name ON tbl_name -- 指定对应数据库和表名,以及job的名称
 [merge_type] -- 数据合并类型
 [load_properties] -- 描述导入数据的语法,比如分隔符、映射列、指定分区等
 [job_properties] -- 导入数据的参数,数据格式等,可参考官网
 FROM data_source -- 目前仅支持Kafka
 [data_source_properties] -- 对应数据源的参数,比如Kafka的参数等

示例:

--建Doris表
create table routineload_test
(
id int ,
name varchar(50),
age int 
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10; 

--创建RoutineLoad导入任务
CREATE ROUTINE LOAD test.kafka_job ON routineload_test
COLUMNS(id, name,age)
PROPERTIES
(
"desired_concurrent_number"="3", --并发数,默认3 必须大于0
"strict_mode" = "false" --是否开启严格模式,具体参数参考官网
) 
FROM KAFKA
(
    "kafka_broker_list"= "test01:9092,test02:9092,test03:9092",
    "kafka_topic" = "test_routineload",
    "property.group.id"="kafka_doris_group",
    "property.kafka_default_offsets" = "OFFSET_BEGINNING",
    "property.enable.auto.commit"="false"
);

查看导入情况:

作业控制:

  • 修改已经创建的作业可参考命令:HELP ALTER ROUTINE LOAD
  • 作业控制:
    • 停止:HELP STOP ROUTINE LOAD
    • 暂停: HELP PAUSE ROUTINE LOAD
    • 重启:HELP RESUME ROUTINE LOAD

更多详情参考官网:Doris_RoutineLoad

Binlog Load方式:

Binlog Load是一种通过通过监听Mysql的binlog来实现增量同步Mysql数据的CDC的方式。

原理:Canal作为中间媒介,通过Canal监听Mysql的binlog并解析,然后将数据实时同步到Doris中。

配置Mysql:

-- 开启Mysql中的binlog

vi /etc/my.cf 

server-id=1
#开启binlog
log-bin = mysql-bin
binlog-format=ROW
#指定具体要同步的数据库,也可以不设置
#binlog-do-db=test

# 开启GTID模式
gtid-mode=on
# 强制gtid和事务的一致性
enforce-gtid-consistency=1
#记录日志
log-slave-updates=1

-- 重启Mysql : sudo systemctl restart mysqld

在Mysql中创建测试表:

-- 测试表
CREATE TABLE `test`.`doris01` (
  `id` int(11) NOT NULL COMMENT "",
  `name` varchar(20) NOT NULL COMMENT ""
)

insert into test.doris01 values(1,'hhh'),(2,'lll'),(3,'ppp');

 

配置Canal:

这里使用的是canal 1.1.5版本

下载地址:Releases · alibaba/canal · GitHub

  • 将Canal进行解压

  •  然后进入到conf里,conf中会有一个example目录,一个Canal中可以有多个实例,在conf下有几个目录就有几个实例,每一个实例都有各自的配置文件,这边我创建了一个doris-load实例 (将默认example实例进行copy,然后修改配置文件)

  • 修改 canal.properties下对应的名称
  • 修改创建实例的配置文件 vi instance.properties

## canal instance serverId

canal.instance.mysql.slaveId = 1234

## mysql address

canal.instance.master.address =test01:3306

## mysql username/password

canal.instance.dbUsername = canal

canal.instance.dbPassword = canal

  •  启动:sh bin/startup.sh

创建Doris同步表,开启Doris中的SYNC功能:

-- 创建Doris表
CREATE TABLE `binlogload_test` (
  `id` int(11) NOT NULL COMMENT "",
  `name` VARCHAR(20) NOT NULL COMMENT ""
) ENGINE=OLAP
UNIQUE KEY(`id`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`id`) BUCKETS 8;

  • 开启SYNC:将fe.conf中的enable_create_sync_job设为true(需要修改玩配置文件后重启),(不需要重启)执行 ADMIN SET FRONTEND CONFIG ("enable_create_sync_job" = "true"); 

语法:

-- 创建SYNC JOP语法
CREATE SYNC [db.]job_name -- 数据库和job名
 (
        channel_desc, 
        channel_desc
        ...
 )
binlog_desc

--创建同步作业
CREATE SYNC test.binlog_job
(
    FROM test.tbl1 INTO binlogload_test -- 指定Doris中对应表
)
FROM BINLOG 
(
    "type" = "canal",
    "canal.server.ip" = "test01",
    "canal.server.port" = "11111",
    "canal.destination" = "doris-load", -- 创建的实例
   --需要在Doris中创建cannal用户,将同户名和密码配置到canal的配置文件中
    "canal.username" = "canal", 
    "canal.password" = "canal"
);
  • 查看作业状态:SHOW SYNC JOB; SHOW SYNC JOB FROM db;
  • 控制作业:
    • 停止作业:STOP SYNC JOB db.job_name
    • 暂停作业:RAUSE SYNC JOB db.job_name
    • 重启作业:RESUME SYNC JOB db.job_name

insert into:

示例:

语法:

INSERT INTO table_name [partition_info] [WITH LABEL label] [col_list] [query_stmt] [VALUES];

insert into table values (........);

insert into table select ........;

  • 可以添加label,通过label来查看任务的执行情况:SHOW LAST INSERT;
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小眼睛的Ayuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值