脚本调度-sqoop导出分区表
业务场景:
我有一个导出商品数量的脚本,商品数量是动态变的,每天要执行好多次,进行动态更新。但是每天凌晨过去00:00的时候,经常会报错,报 文档不存在的错误 ,虽然知道 这个文件不存在,但是又不能停止它,在EMR中他是个工作流,脚本失败后后面的就不知行了,所以就弄了个简单的脚本做了个分区目录是否存在的判断
34: 20/09/18 08:12:59 ERROR tool.ExportTool: Encountered IOException running export job:
35: org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://emr-header-1.clu?????????? /youxian/ads/ads_every_day_ru_ku_stock_weight/dt=2020-09-18
具体实现
先判断存放在HDFS中的Hive分区目录是否存在,在选择是否执行里面的导出计划
t=`date +%Y-%m-%d`
hadoop fs -test -e /youxian/ads/ads_every_day_ru_ku_stock_weight/dt=${t}
if [ $? -eq 0 ] ; then
echo ${t}'日有入库商品 这里只是打印个记录 '
hostip=Mysql连接
post=端口号 内网/外网
db=库名
#db=gxt.test
name=Mysql账号
password=mysql密码
#输出到Mysql中的表名
table=dept_every_day_goods_deal_user_sales_num
#昨天的时间
#t=`date -d -1day +%Y-%m-%d`
#当天
t=`date +%Y-%m-%d`
sqoop export \
--connect jdbc:mysql://${hostip}:${post}/${db}?characterEncoding=UTF-8 \
--username ${name} --password ${password} \
--table ${table} \
--hive-partition-key dt \
--hive-partition-value ${t} \
--export-dir /youxian/ads/ads_every_day_ru_ku_stock_weight/dt=${t} \
--input-fields-terminated-by '\001' \
--columns " dept_name, material_code, ru_ku_stock_weight ,create_time " \
--update-mode allowinsert \
--update-key "dept_name,material_code, create_time " \
-m 1
else
echo ${t}'日没有入库商品'
fi
诠释:
涉及的知识点:
HADOOP 提供了内置函数 判断文件是否存在 的命令
hadoop fs -test
- -d 判断<path>是否是目录
- -e 判断<path>是否存在 ----> 返回0 存在 , 1 不存在
- -f 判断<path>是否是个文件
- -s 判断内容是否大于0bytes ,大于0为真
- -z 判断内容是否等于0bytes,为0真
例如 : t=`date +%Y-%m-%d`
hadoop fs -test -e /youxian/ads/ads_every_day_ru_ku_stock_weight/dt=${t}这里是动态获取的时间 做测试也可以写死。