2013-10-03 616 views
2

我需要在bash腳本中運行hadoop命令,該腳本通過亞馬遜S3上的一堆文件夾,然後將這些文件夾名稱寫入一個txt文件,然後執行進一步處理。但問題是當我運行腳本,似乎沒有文件夾名稱被寫入到txt文件。我想知道是否hadoop命令花了很長時間才能運行,而且bash腳本沒有等到它完成並繼續執行進一步的過程,如果是的話,我該如何讓bash等到hadoop命令完成後再執行其他過程?在bash腳本中運行hadoop命令

這裏是我的代碼,我都嘗試方式,既不工作:

1. 
listCmd="hadoop fs -ls s3n://$AWS_ACCESS_KEY:[email protected]$S3_BUCKET/*/*/$mydate | grep s3n | awk -F' ' '{print $6}' | cut -f 4- -d/> $FILE_NAME"        
echo -e "listing... $listCmd\n"                                     
eval $listCmd 
...other process ... 

2. 
echo -e "list the folders we want to copy into a file" 
hadoop fs -ls s3n://$AWS_ACCESS_KEY:[email protected]$S3_BUCKET/*/*/$mydate | grep s3n | awk -F' ' '{print $6}' | cut -f 4- -d/> $FILE_NAME 
... other process .... 

任何人知道什麼可能是錯了嗎?並且使用eval函數還是隻使用第二種方式直接運行hadoop命令更好?

謝謝。

+0

不 「Hadoop的FS -ls S3N:// $ AWS_ACCESS_KEY:$ AWS_SECRET_KEY @ $ S3_BUCKET/*/*/$指明MyDate」 有任何輸出? – interskh

+0

是的,當直接運行hadoop命令時,運行良好 – user468587

回答

1

在這種情況下,我傾向於選擇eval,更漂亮的方法是將下一個命令追加到此處。我寧願將listCmd分解成若干部分,以便您知道grepawkcut級別沒有任何錯誤。如果$gcmd成功

listCmd="hadoop fs -ls s3n://$AWS_ACCESS_KEY:[email protected]$S3_BUCKET/*/*/$mydate > $raw_File" 
gcmd="cat $raw_File | grep s3n | awk -F' ' '{print $6}' | cut -f 4- -d/> $FILE_NAME" 
echo "Running $listCmd and other commands after that" 
otherCmd="cat $FILE_NAME" 
eval "$listCmd"; 
echo $? # This will print the exit status of the $listCmd 
eval "$gcmd" && echo "Finished Listing" && eval "$otherCmd" 

otherCmd纔會執行。如果你有太多需要執行的命令,那麼這會變得有點難看。如果您大致知道需要多長時間,則可以插入睡眠命令。

eval "$listCmd" 
sleep 1800 # This will sleep 1800 seconds 
eval "$otherCmd" 
+0

使用eval是我能夠使用bash腳本啓動Hadoop流的唯一方式 – Jesuisme