bash - 在 bash 脚本中运行 hadoop 命令

标签 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... $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 命令?

谢谢。

最佳答案

在这种情况下,我更喜欢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"

关于bash - 在 bash 脚本中运行 hadoop 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19148745/

相关文章:

bash - shell 脚本 : how to read a text file that does not end with a newline on Windows

bash - 每个命令 "Argument list too long"

ubuntu - InvalidProtocolBufferException:在Impala上连接到Hadoop 2.x.x

hadoop - 使用 sqoop import,如何将行追加到现有的配置单元表中?

mysql - 我如何查看 sqoop 作业中的增量更新值?

bash - 使用了过多的处理能力,这部分效率低下吗?

bash - Dockerfile中RUN CD和WORKDIR之间的区别

bash - mkdir 总是创建文件而不是目录

hadoop - mapreduce框架写入什么拆分元信息文件

hadoop - 使用 http 源在具有相同扩展名的 HDFS 中保存文件(不同扩展名)