【问题标题】:Can't pipe two hadoop commands?不能通过管道传输两个 hadoop 命令?
【发布时间】:2013-02-07 19:54:54
【问题描述】:

我想运行以下命令:

hadoop fs -ls hdfs:///logs/ | grep -oh "/[^/]*.gz" | grep -oh "[^/]*.gz" | hadoop fs -put - hdfs:///unzip_input/input

当我在 ssh 到主节点后从 shell 调用它时,它可以工作。但是如果我尝试通过 ssh 调用它,它将不起作用:

ssh -i /home/USER/keypair.pem hadoop@ec2-XXXX.compute-1.amazonaws.com hadoop fs -ls hdfs:///logs/ | grep -oh "/[^/]*.gz" | grep -oh "[^/]*.gz" | hadoop fs -put - hdfs:///unzip_input/input

它给出了错误:

zsh: command not found: hadoop

但如果我取出最后一个管道,则命令成功:

ssh -i /home/USER/keypair.pem hadoop@ec2-XXXX.compute-1.amazonaws.com hadoop fs -ls hdfs:///logs/ | grep -oh "/[^/]*.gz" | grep -oh "[^/]*.gz"

通过一些搜索我发现这可能是由于未设置 JAVA_HOME 的错误,但它在主节点的 ~/.bashrc 中设置正确

hadoop 集群是一个 Amazon Elastic Map Reduce 集群。

【问题讨论】:

  • 你确定整个命令链都被传递给了 ssh 吗?因为从错误消息来看,您似乎只是在远程主机上执行 hadoop fs -ls hdfs:///logs/ 并通过 grep 管道输出 ssh。
  • 啊,我想这就是正在发生的事情。如何将命令更改为仅在远程主机上通过管道传输?

标签: hadoop ssh elastic-map-reduce


【解决方案1】:

只有管道命令链的第一个命令会在远程主机上执行。其余的在您的计算机上本地进行。所以,当然,如果你没有安装 hadoop,zsh 会打印出一条错误消息(否则,它只会把它放到你本地的 Hadoop 上,这可能不是你想要的。

要将所有命令传递给 ssh,可以将它们放在引号 "" 或单引号 '' 中:

ssh -i /home/USER/keypair.pem hadoop@ec2-XXXX.compute-1.amazonaws.com 'hadoop fs -ls hdfs:///logs/ | grep -oh "/[^/]*.gz" | grep -oh "[^/]*.gz" | hadoop fs -put - hdfs:///unzip_input/input'

【讨论】:

  • 谢谢。我实际上是使用 elastic-mapreduce 命令行将命令传递给 ssh,结果发现其中有一个错误,它会删除我的引号。
  • 你还应该在shell脚本上给出hadoop命令的完整路径(例如home/hadoop/bin/hadoop),以避免找不到命令
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 2012-08-08
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多