3

Amazon S3 の一連のフォルダーを通過する bash スクリプトで hadoop コマンドを実行し、それらのフォルダー名を txt ファイルに書き込み、さらに処理を行う必要があります。しかし問題は、スクリプトを実行したときに、フォルダー名がtxtファイルに書き込まれなかったようです。Hadoop コマンドの実行に時間がかかりすぎて、bash スクリプトが終了するまで待機せず、次のプロセスに進むのではないかと考えています。

これが私のコードです。両方の方法を試しましたが、どちらも機能しません:

1. 
listCmd="hadoop fs -ls s3n://$AWS_ACCESS_KEY:$AWS_SECRET_KEY@$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:$AWS_SECRET_KEY@$S3_BUCKET/*/*/$mydate | grep s3n | awk -F' ' '{print $6}' | cut -f 4- -d / > $FILE_NAME
... other process ....

誰が何が間違っているのか知っていますか?そして、eval関数を使用する方が良いですか、それとも2番目の方法を使用してhadoopコマンドを直接実行する方が良いですか

ありがとう。

4

1 に答える 1

2

evalこの場合、次のコマンドをこのコマンドに追加する方がきれいです。、またはレベルlistCmdで何も問題がないことがわかるように、私はむしろ部分に分解したいと思います。grepawkcut

listCmd="hadoop fs -ls s3n://$AWS_ACCESS_KEY:$AWS_SECRET_KEY@$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$gcmd成功した場合にのみ実行されます。実行する必要があるコマンドが多すぎる場合、これは少し見苦しくなります。おおよその所要時間がわかっている場合は、スリープ コマンドを挿入できます。

 eval "$listCmd"
 sleep 1800  # This will sleep 1800 seconds
 eval "$otherCmd"
于 2013-10-03T02:17:43.893 に答える