【问题标题】:Can't pipe Output of Hadoop Command无法通过管道输出 Hadoop 命令
【发布时间】:2013-02-19 08:31:38
【问题描述】:
我想运行以下命令:
hadoop fs -copyToLocal FILE_IN_HDFS | ssh REMOTE_HOST "dd of=TARGET_FILE"
但是,当我尝试时,它所做的只是在目标主机上创建一个空文件并将其复制到我的本地家庭驱动器,而不是将其复制到远程位置。
$ hadoop fs -copyToLocal FILE_IN_HDFS | ssh REMOTE_HOST "dd of=test.jar"
0+0 数据输入
0+0 澳大利亚数据
0 字节 (0 B) kopiert,1,10011 秒,0,0 kB/s
我想不出任何理由,为什么这个命令会以这种方式运行。
这是我在这里遗漏的一些 Java 主义,还是我实际上做错了?
【问题讨论】:
标签:
java
hadoop
ssh
pipe
dd
【解决方案1】:
-copyToLocal 选项需要 2 个参数:HDFS 中的文件和本地路径。我什至没有看到它如何复制到您的本地驱动器,这个命令对我来说失败了。
但我认为实际问题有所不同:-copyToLocal 选项不会在标准输出上打印任何可以通过管道传送到ssh 命令的内容。在这里,您实际上是在将一个空流通过管道传输到 dd,因此没有要创建的内容。
我会执行以下似乎可行的命令:
hadoop fs -cat $FILE_IN_HDFS | ssh $REMOTE_HOST "dd of=$TARGET_FILE"
像这样,您正在通过管道传输作为文件内容的流并将其复制到$TARGET_FILE 指向的文件中。在我的盒子上测试过,效果很好。
这避免了将文件复制到本地然后将文件scp'ing到远程盒子的需要,一切都是流式传输的,我相信这就是你要找的。p>
【解决方案2】:
您可以分两步执行此操作:首先是 copyToLocal,然后是 scp。您还需要删除中间本地文件。
hadoop fs -copyToLocal $FILE_IN_HDFS $LOCAL_FILE
scp $LOCAL_FILE $REMOTE_HOST:$TARGET_FILE && rm $LOCAL_FILE