2013-02-18 68 views
1

我想运行下面的命令:可以Hadoop的命令不是管道输出

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

然而,当我尝试,它所做的一切,是创建目标主机上的一个空文件,并将其复制到我的本地主驱动器,而不是将其复制到远程位置。

$ hadoop fs -copyToLocal FILE_IN_HDFS | SSH REMOTE_HOST

0 + 0DatensätzeEIN

0 + 0DatensätzeAUS

0字节(0 B)kopiert,1,10011 S,0,0 KB/“= Test.jar的的DD” s

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

回答

1

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

但我认为实际问题是不同的:-copyToLocal选项不打印任何可以传送到ssh命令的标准输出。在这里,你基本上将一个空的流管道输送到dd,所以没有什么可以创建的。

我会做下面的命令,它似乎工作:

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

这样你的管道流哪个是你的文件的内容,并将其复制到文件指向$TARGET_FILE。测试我的盒子,这工作正常。

这避免了需要在本地复制文件,然后scp'ing文件到远程盒,一切都流,这是我相信你在找什么。

0

您可以分两步执行此操作:首先copyToLocal,然后scp。您还需要删除中间本地文件。

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