目录
1 场景前提
在我们通过flume将日志服务器的数据采集到hdfs上了
接下来需要将hdfs上的文件导入到hive中
而离线项目数据隔天当天晚上之前传入即可
因此我们可以开发个脚本,每晚自动将数据写入到hive库中
2 涉及到的shell脚本技术
2.1 获取时间的命令
date -d'-1 day' +%Y-%m-%d
释义:获取到前一天的时间,例如:2022-03-27
2.2 发送信息给邮件
mail -s "数仓任务平台-执行通知" 2427770367@qq.com
使用前要下载 mailx
2.3 $?
上个命令的返回值
0为执行成功,其他为失败
3 脚本
#!/bin/bash
##
#
# @author : deep as the sea
# @department: doitedu
# @date : 2022-02-14
# @desc : app端行为日志加载入库
#
export HIVE_HOME=/opt/apps/hive-3.1.2/
# 获取脚本运行时的前一日日期
dt=$(date -d'-1 day' +%Y-%m-%d)
# 如果脚本调用者传入了指定日期,则执行指定日期数据的导入
if [ $1 ];then
dt=$1
fi
# 判断指定日期的数据是否有做过去重处理
datapath=/logdata/applog/${dt}
hdfs dfs -test -e /tmp/distinct_task/applog/${dt}
if [ $? -eq 0 ];then
echo "检测到${dt}日期的数据有做去重,准备加载去重后的数据"
datapath=/tmp/distinct_task/applog/${dt}
else
echo "检测到${dt}日期的数据没有做去重处理,准备加载flume所采集的数据"
fi
echo "加载的路径为: ${datapath}"
${HIVE_HOME}/bin/hive -e "load data inpath '${datapath}' overwrite into table ods.mall_app_log partition(dt='${dt}')"
# 判断上一条命令执行的返回码(判断hive导入是否成功)
if [ $? -eq 0 ];then
echo "数仓任务执行报告:app行为日志,日期:$dt ,加载入库任务成功" | mail -s "数仓任务平台-执行通知" 2427770367@qq.com
exit 0
else
echo "数仓任务执行报告:app行为日志,日期:$dt ,加载入库任务失败" | mail -s "数仓任务平台-执行通知" 2427770367@qq.com
exit 1
fi