在 bash 脚本中运行 Hadoop 命令



我需要在 bash 脚本中运行 Hadoop 命令,该命令会遍历 Amazon S3 上的一堆文件夹,然后将这些文件夹名称写入 txt 文件,然后执行进一步处理。 但问题是当我运行脚本时,似乎没有文件夹名称写入 TXT 文件。 我想知道是不是Hadoop命令运行时间太长,而bash脚本没有等到它完成并继续做进一步的过程,如果是这样,我如何让 bash 等到 Hadoop 命令完成,然后去做其他过程?

这是我的代码,我尝试了两种方式,都不起作用:

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... $listCmdn"                                                                                                                                                   
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 函数更好,还是只使用第二种方式直接运行 Hadoop 命令

谢谢。

在这种情况下,我宁愿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"

只有$gcmd成功,才会执行otherCmd。如果你有太多的命令需要执行,那么这就变得有点难看了。如果您大致知道需要多长时间,则可以插入睡眠命令。

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

最新更新