hadoop自动提交脚本

自动提交到hadoop系统,然后调用wordcount的任务,并下载输出的文件。

#!/bin/sh
#从给定的路径获取文件列表,提交到hadoop系统,使用wordcount的功能统计单词数量
#echo "$#"
if [ $# -ne 1 ]; then
        echo "请输入文件的路径"
        exit 1
fi
#echo "$1"
filecount=$(ls $1|wc -w)
#echo $filecount
#if [ $filecount -lt 1 ]; then
#fi
submitcount=0
wordsubmitlog=wordsubmitlog.log
hadoopdellog=hadoopdellog.log
for f in $1 ;
do
        if [ -f $wordsubmitlog ]; then
                echo
        else
                #不存在文件的时候创建
                touch $wordsubmitlog
        fi
        existsubmit=$(cat $wordsubmitlog|grep $f|wc -l)
        if [ $existsubmit -lt 1 ]; then
                echo "$f"|cat>>$wordsubmitlog
                hadoop fs -put $f /wz/wordcount/input/
                #rm -f $f
                let submitcount=submitcount+1
        fi
done
#有提交文件才执行
if [ $submitcount -ge 1 ]; then
hadoop jar /usr/hadoop/hadoop-examples-1.2.1.jar wordcount /wz/wordcount/input /wz/wordcount/output
rm -f part-r-*
hadoop fs -get /wz/wordcount/output/part-r-* .  #下载到当前目录
#重命名下载下来的文件,并移动到其他的文件夹

  pcount=0
  newfilename=$(date +'%Y%m%d%H%M%S')
  #echo $newfilename
  for p in part-r-*;
  do
   if [ -f $p ]; then
     let pcount=pcount+1
     #newfilename=$(date +'%Y%m%d%H%M%S')
     newfilename=$(echo part-r-"$newfilename"_"$pcount".dat)
     echo $newfilename
     mv $p $newfilename
     mv $newfilename part/
    fi
  done

echo "`date +'%Y-%m-%d %H:%M:%S'`"|cat>>$hadoopdellog

hadoop fs -rmr /wz/wordcount/input/*|cat>>$hadoopdellog

hadoop fs -rmr /wz/wordcount/output|cat>>$hadoopdellog
echo "执行完成"
else
echo "没有提交的文件"
fi -- 插入 -- 30,4-18 95%

 如果用crontab设置自动运行的话,需要将上面的所有路径设置为绝对路径,包括hadoop

例如 hadoop的命令需要写成 /usr/hadoop/bin/hadoop jar ......

文件日志也要写错绝对路径

使用crontab添加任务是也要设置绝对路径

例如设置每隔5分钟执行一次:

*/5 * * * * /usr/hadoop/xxx.sh &> /dev/null //表示不用发送邮件告知,否则会收到很多邮件通知

另外,hadoop运行时如果日志不想显示出来,可以先重定向到0 然后再从2输出

例如 hadoop jar ......>0 2>>xxx.log

0表示 stderr 1表示stdin 2表示stdout

 

posted on 2014-03-30 17:16  ringwang  阅读(605)  评论(0编辑  收藏  举报