hive分区表同步数据到doris分区分桶表详解

hive分区表同步数据到doris分区分桶表详解

本文从Broker Load来实现数据同步
一、 Broker
Broker是在doris中独立存在的,FE是负责元数据和任务调度,BE负责存储实际数据和执行任务,当BE执行数据同步任务时,会从Broker里拉取数据,直到所有BE拉取完毕,拉取数据才会完整,故而能通过Broker Load来实现数据同步
二、表结构
创建hive分区表 wm_app.app_usertouch_all_kpi_num_user_day
表结构如下
hive分区表同步数据到doris分区分桶表详解_第1张图片
创建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"
);

使用动态分区建表的方式,详解如下
hive分区表同步数据到doris分区分桶表详解_第2张图片

三 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更加的完善)
hive分区表同步数据到doris分区分桶表详解_第3张图片

通过命令查看broker名字 ,命令 SHOW PROC "/brokers" 
不同doris可能设置不一致

hive分区表同步数据到doris分区分桶表详解_第4张图片
同步过程中可能会发生一些其他问题,但是shell日志不会显示明细,这个困扰我好久,后来发现可以在doris里查看同步数据任务,而且错误指向也很明确

在doris目标数据库中,使用show load 查看导入明细

如果是Finish,说明导入成功,不是就是导入失败,根据提示就可以看到原因

你可能感兴趣的:(Doris,big,data,hive,数据库,olap)