hadoop自動提交指令碼

weixin_34377065發表於2014-03-30

自動提交到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

 

相關文章