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