无法管道输出Hadoop命令

时间:2013-02-18 16:10:40

标签: java hadoop ssh pipe dd

我想运行以下命令:

 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 +0Datensätzein

     

0 +0Datensätzeaus

     

0字节(0 B)kopiert,1,10011 s,0,0 kB / s

我想不出任何理由,为什么这个命令会以这种方式表现出来。 这是我在这里缺少的一些Java主义,还是我实际上做错了?

2 个答案:

答案 0 :(得分:1)

-copyToLocal选项需要2个参数:HDFS中的文件和本地路径。我甚至没有看到它如何复制到你的本地驱动器,这个命令对我来说失败了。

但我认为实际问题不同:-copyToLocal选项不会在stdout上打印任何可以通过管道传送到ssh命令的内容。在这里,您基本上将空流管道传输到dd,因此无需创建任何内容。

我会执行以下似乎有效的命令:

hadoop fs -cat $FILE_IN_HDFS | ssh $REMOTE_HOST "dd of=$TARGET_FILE"

像这样,你正在管道一个流,它是你文件的内容,并将它复制到$TARGET_FILE指向的文件。在我的盒子上测试,这很好。

这样就无需在本地复制文件,然后将文件压缩到远程复制框,所有内容都会流式传输,我相信您所需要的。

答案 1 :(得分:0)

您可以分两步完成:首先是copyToLocal,然后是scp。您还需要删除中间本地文件。

hadoop fs -copyToLocal $FILE_IN_HDFS $LOCAL_FILE
scp $LOCAL_FILE $REMOTE_HOST:$TARGET_FILE && rm $LOCAL_FILE