脚本调度-sqoop导出分区表-判断分区目录是否存在

                               脚本调度-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   

  1. -d 判断<path>是否是目录
  2. -e 判断<path>是否存在      ---->   返回0 存在  , 1 不存在
  3. -f 判断<path>是否是个文件
  4. -s 判断内容是否大于0bytes ,大于0为真
  5. -z 判断内容是否等于0bytes,为0真

例如 : t=`date  +%Y-%m-%d` 
hadoop fs -test -e /youxian/ads/ads_every_day_ru_ku_stock_weight/dt=${t}

这里是动态获取的时间 做测试也可以写死。

猜你喜欢

转载自blog.csdn.net/weixin_45592182/article/details/108662796