工作中需要构造一个数据传输工具,用来抓取ftp前端机的web日志并直接写入HDFS,该工具直接作为hadoop mapreduce任务定时执行,所以最好不使用文件脚本以免去分发文件的繁琐,能一句命令搞定最好。
如何抓取ftp前端机的web日志并写入HDFS? 管道(pipe),命令如下:
wget $SRC_URL --limit-rate=%s --tries=1 -O - | hadoop fs -put - $DESTPATH
一行命令,可以直接当成-mapper的参数,不需要额外写文件脚本
可惜这个方法有问题,使用管道的话,整个命令的返回值是后半部分(hadoop fs -put - $DESTPATH)的返回值
当wget没有得到抓到任何内容返回失败时,整个命令返回0,错误没有捕捉到,
如何解决?
1. PIPESTATUS
PIPESTATUS是一个环境变量,数组类型,保存了PIPE中所有命令的返回值
PIPE命令成功结束后,判断PIPESTATUS[0]是否为零即可
2. 那怎么将这些逻辑整合到一条shell命令中?
正确解法(之一)需要使用到() && exit,先看看这些(), &&, ||的标准行为:
( list )
Placing a list of commands between parentheses causes a subshell to be created, and each of the commands in list to be executed in that subshell. Since the list is executed in a subshell, v