在Bash脚本中运行Hadoop命令

3
我需要在bash脚本中运行hadoop命令,该命令通过亚马逊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... $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函数更好还是直接运行hadoop命令的第二种方法更好呢?

谢谢。


"hadoop fs -ls s3n://$AWS_ACCESS_KEY:$AWS_SECRET_KEY@$S3_BUCKET///$mydate" 有任何输出吗? - interskh
是的,当直接运行那个Hadoop命令时,它运行良好。 - user468587
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"

使用 eval 是我能够使用 bash 脚本启动 Hadoop 流处理的唯一方法。 - Jesuisme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接