本文从Broker Load来实现数据同步
一、 Broker
Broker是在doris中独立存在的,FE是负责元数据和任务调度,BE负责存储实际数据和执行任务,当BE执行数据同步任务时,会从Broker里拉取数据,直到所有BE拉取完毕,拉取数据才会完整,故而能通过Broker Load来实现数据同步
二、表结构
创建hive分区表 wm_app.app_usertouch_all_kpi_num_user_day
表结构如下
创建doris分区分桶表
CREATE TABLE `usertouch_all_kpi_detail_user_day_snap` (
`mid` bigint(20) NOT NULL COMMENT "活动id",
`active_id` int(11) NULL COMMENT "活动id",
`plan_id` int(11) NULL COMMENT "活动id",
`wait_send_time` date NULL COMMENT "触达时间",
`par_date` date NOT NULL COMMENT "分区字段",
`touch_flag` int(11) NULL COMMENT "触达标识",
`succ_flag` int(11) NULL COMMENT "发送成功标识",
`target_flag` int(11) NULL COMMENT "目标标识",
`click_flag` int(11) NULL COMMENT "点击标识",
`plan_flag` int(11) NULL COMMENT "计划报名标识",
`xiao_flag` int(11) NULL COMMENT "小课转化标识",
`xuda_flag` int(11) NULL COMMENT "大课续保标识",
`gmv_flag` int(11) NULL COMMENT "大课续报gmv(plan_id粒度)"
) ENGINE=OLAP
DUPLICATE KEY(`mid`, `active_id`, `plan_id`, `wait_send_time`, `par_date`)
COMMENT "指标明细表"
PARTITION BY RANGE(`par_date`)()
DISTRIBUTED BY HASH(`mid`) BUCKETS 10
PROPERTIES (
"replication_num" = "3",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.time_zone" = "Asia/Shanghai",
"dynamic_partition.start" = "-7",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.replication_num" = "3",
"dynamic_partition.buckets" = "10",
"in_memory" = "false",
"storage_format" = "V2"
);
三 shell脚本
建好表后在hive表中插入数据方便后续测试,话不多说,直接上脚本
#!/bin/sh
time=`date +%H:%M:%S`
day=`date +%Y-%m-%d`
ndt=`date -d '-1 day' +%Y-%m-%d`
echo $time
echo $day
date_line=`date "+%Y-%m-%d %H:10:00"`
### 用户拼接hadoop中的数据路径
dt=`date -d '-1 day' +%Y%m%d`
sink_database=wm_persona
# Doris Table
sink_table=usertouch_all_kpi_detail_user_day_snap
# hive Table
hive_table=app_usertouch_all_kpi_detail_user_day
# 分区
hour=15
#
hive_hdfs_file=hdfs://emr-cluster/user/hive/warehouse/wm_app.db/${hive_table}/par_date=${dt}/*
echo $hive_hdfs_file
### 每日执行生成唯一标签
label_date=${sink_table}_`date +%Y%m%d%H%M%S`
sql="use $sink_database;
LOAD LABEL ${sink_database}.${sink_table}
(
DATA INFILE('$hive_hdfs_file')
INTO TABLE $sink_table
FORMAT AS 'orc'
(
mid,
active_id,
plan_id,
wait_send_time,
touch_flag,
succ_flag,
target_flag,
click_flag,
plan_flag,
xiao_flag,
xuda_flag,
gmv_flag
)
SET(
mid=mid,
active_id=active_id,
plan_id=plan_id,
wait_send_time=wait_send_time,
touch_flag=touch_flag,
succ_flag=succ_flag,
target_flag=target_flag,
click_flag=click_flag,
plan_flag=plan_flag,
xiao_flag=xiao_flag,
xuda_flag=xuda_flag,
gmv_flag=gmv_flag,
par_date='"${ndt}"'
)
)
WITH BROKER 'broker_name'
(
'username'='数据库用户名',
'password'='数据库密码',
'dfs.nameservices'='emr-cluster',
'dfs.ha.namenodes.emr-cluster'='nn1,nn2',
'dfs.namenode.rpc-address.emr-cluster.nn1'='hdfs主节点:8020',
'dfs.namenode.rpc-address.emr-cluster.nn2'='hdfs高可用节点:8020',
'dfs.client.failover.proxy.provider'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
)
PROPERTIES
(
'timeout'='3600',
'max_filter_ratio'='0.001'
);
"
echo $sql
mysql -u用户名 -p'密码' -h 主机地址 -P 9030 -e "$sql"
echo '=============end============'
脚本详解如下(更正:经过测试,doris是支持Parquet存储格式的表的,但不如支持orc更加的完善)
通过命令查看broker名字 ,命令 SHOW PROC "/brokers"
不同doris可能设置不一致
同步过程中可能会发生一些其他问题,但是shell日志不会显示明细,这个困扰我好久,后来发现可以在doris里查看同步数据任务,而且错误指向也很明确
在doris目标数据库中,使用show load 查看导入明细
如果是Finish,说明导入成功,不是就是导入失败,根据提示就可以看到原因