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