1

我想运行以下命令:

 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 s, 0,0 kB/s

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

4

2 回答 2

2

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

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

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

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

像这样,您正在管道传输作为文件内容的流,并将其复制到$TARGET_FILE. 在我的盒子上测试过,效果很好。

这避免了在本地复制文件然后将文件 scp'ing 到远程框的需要,所有内容都是流式传输的,我相信这就是您正在寻找的。

于 2013-02-18T17:19:30.207 回答
0

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

hadoop fs -copyToLocal $FILE_IN_HDFS $LOCAL_FILE
scp $LOCAL_FILE $REMOTE_HOST:$TARGET_FILE && rm $LOCAL_FILE
于 2013-02-19T00:17:33.490 回答