我想运行以下命令:
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主义,还是我实际上做错了?
答案 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