数据处理过程:Oracle通过ogg推到kafka 然后通过公司自研框架从kafka同步到kudu的ods库, kudu存储ods数据,impala用于计算kudu,然后结果表放到hdfs,最后通过sqoop导出hdfs文件(表)到mysql
1.ods层通过azkaban调度执行sql把需要的数据取出并插入到rel;
对应上图:rpt_hy_qwsx_t_dict_report_mapping.job依赖bas.job, 调用shell脚本:rpt_hy_qwsx_t_dict_report_mapping.sh,通过脚本执行sql:rpt_hy_qwsx_t_dict_report_mapping.sql,通过impala语句把kudu的ods数据计算结果放到hdfs(hive)中
2.通过sqoop+Azkaban调度取rel数据到MySQL;
对应上图:rpt_hy_qwsx_t_dict_report_mapping_sqoop.job依赖rpt_hy_qwsx_t_dict_report_mapping.job, 调用shell脚本:rpt_hy_qwsx_t_dict_report_mapping_sqoop.sh,脚本中sqoop语句直接执行数据迁移工作(把hive中的数据迁移到mysql中)
注意:
每个job中都可以获取配置文件的参数,与文件命名无关;注意参数传递:shell脚本中的参数必须要通过job传递获取,sql中的参数必须通过shell脚本传递获取
全部代码如下
配置文件:bas.properties
### 业务数据库设定 ###
###现在时间 pnow ###
hostName=IP地址:25003
time=now()
origindb=hy_kudu_ods
targetdb=hy_bigdata_dm_rel
dburl=jdbc:mysql://IP地址:4710/tdhy_dataplat
dbhost=IP地址
dbuser=admin
dbpasswd=admin1234
job文件:bas.job
type=command
command=echo "### base job ###"
以下三个文件调度执行SQL,完成数据筛选从ods到rel:
job文件:rpt_hy_qwsx_t_dict_report_mapping.job,执行res下面的同名的shell脚本
type=command
command=echo "start ..."
dependencies=bas
command=sh res/rpt_hy_qwsx_t_dict_report_mapping.sh "${hostName}" "${origindb}" "${targetdb}" "${time}" "${dburl}" "${dbhost}" "${dbuser}" "${dbpasswd}" "${dbpasswd}"
shell脚本:rpt_hy_qwsx_t_dict_report_mapping.sh,脚本中执行同目录的sql文件
#! /bin/bash
echo 'start...'
echo "hostName:$1"
echo "businessDB:$2"
echo "wmsTargetDB:$3"
echo "wmsdburl:$5"
echo "wmsdbhost:$6"
echo "wmsdbuser:$7"
echo "wmsdbpasswd:$8"
impala-shell -i $1 --var=origindb=$2 --var=targetdb=$3 --var=time=$4 -f 'res/rpt_hy_qwsx_t_dict_report_mapping.sql'
SQL:rpt_hy_qwsx_t_dict_report_mapping.sql;需要调度执行的SQL
use ${var:targetdb};
upsert into hy_bigdata_dm_rel.t_dict_report_mapping select gsbh,qydjc,yxglz,ssyjgs,xzyydq,syb,shyydq,jydq from hy_kudu_ods.ods_report_mapping;
--数据写入textfile文件中
drop table if exists t_dict_report_mapping_textfile;
CREATE TABLE t_dict_report_mapping_textfile (
gsbh STRING COMMENT '公司编号',
qydjc STRING COMMENT '起运地简称',
yxglz STRING COMMENT '城市',
ssyjgs STRING COMMENT '所属一级公司',
xzyydq STRING COMMENT '运营大区',
syb STRING COMMENT '事业部',
shyydq STRING COMMENT '大区1',
jydq STRING COMMENT '大区简称'
) row format delimited fields terminated by '\001'
STORED AS textfile;
insert overwrite table t_dict_report_mapping_textfile select * from t_dict_report_mapping;
以下两个文件完成数据迁移工作,数据从hive到MySQL过程
job文件:rpt_hy_qwsx_t_dict_report_mapping_sqoop.job,执行res下面的同名的shell脚本
type=command
command=echo "start ..."
dependencies=rpt_hy_qwsx_t_dict_report_mapping
command=sh res/rpt_hy_qwsx_t_dict_report_mapping_sqoop.sh "${dburl}" "${dbuser}" "${dbpasswd}" "${targetdb}"
shell脚本:rpt_hy_qwsx_t_dict_report_mapping_sqoop.sh,执行sqoop语句,完成数据从hive到mysql迁移的过程
#插入更新mysql数据库,更多配置参考sqoop参数配置
sqoop export \
--connect $1 \
--username $2 \
--password $3 \
--table t_dict_report_mapping \
--export-dir /user/hive/warehouse/$4.db/t_dict_report_mapping_textfile \ #比如hive表默认地址 /user/hive/warehouse/test.db/test_textfile
--columns gsbh,qydjc,yxglz,ssyjgs,xzyydq,syb,shyydq,jydq \ #mysql列名,最好跟hive表列名对应,不然可能报错或者列取错,一般生成的hive结果表就是mysql表的结构
--update-key gsbh \ #col1是根据col1去更新表数据,最好col1就是主键,支持联合主键
--update-mode allowinsert \ #更新时允许插入,如果不允许插入填写updateonly
--fields-terminated-by '\001' \ #指hive表中的列间隔符xx ROW FORMAT DELIMITED FIELDS TERMINATED BY 'xx' 默认就是\001
--lines-terminated-by '\n' \ #指hive表的行间隔符,lines terminated by '**' 默认\n
--input-null-string '\\N' \ #字符串类型的数据null时替换
--input-null-non-string '\\N' \ #非字符创类型的数据为null时替换