Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 将远程文件放入hadoop而不将其复制到本地磁盘_Unix_Ssh_Hadoop_Copying_Piping - Fatal编程技术网

Unix 将远程文件放入hadoop而不将其复制到本地磁盘

Unix 将远程文件放入hadoop而不将其复制到本地磁盘,unix,ssh,hadoop,copying,piping,Unix,Ssh,Hadoop,Copying,Piping,我正在编写一个shell脚本,以便在生成数据后立即将其放入hadoop中。我可以使用ssh连接到主节点,将文件复制到那边的文件夹中,然后将它们放入hadoop中。我正在寻找一个shell命令,以避免将文件复制到主节点上的本地磁盘。为了更好地解释我需要什么,您可以在下面找到我目前拥有的: 1) 将文件复制到主节点的本地磁盘: scp test.txt username@masternode:/folderName/ 我已经使用密钥设置了SSH连接。因此,无需密码即可完成此操作 2) 我可以使用s

我正在编写一个shell脚本,以便在生成数据后立即将其放入hadoop中。我可以使用ssh连接到主节点,将文件复制到那边的文件夹中,然后将它们放入hadoop中。我正在寻找一个shell命令,以避免将文件复制到主节点上的本地磁盘。为了更好地解释我需要什么,您可以在下面找到我目前拥有的:

1) 将文件复制到主节点的本地磁盘:

scp test.txt username@masternode:/folderName/
我已经使用密钥设置了SSH连接。因此,无需密码即可完成此操作

2) 我可以使用ssh远程执行hadoop put命令:

ssh username@masternode "hadoop dfs -put /folderName/test.txt hadoopFolderName/"
我要寻找的是如何将这两个步骤合并为一个步骤,并跳过masterNode本地磁盘上文件的本地副本

谢谢

换句话说,我想以一种我可以尝试的方式(未经测试)传输多个命令:

我使用了类似的技巧来复制周围的目录:

tar cf - . | ssh remote "(cd /destination && tar xvf -)"

这将本地-
tar
的输出发送到远程-
tar

的输入中,Hadoop提供了两个REST接口。检查并确认。您应该能够使用非Hadoop环境将文件复制到主节点,而无需将其复制到主节点。

您在其中生成数据的节点是否能够到达您的每个群集节点(名称节点和所有数据节点)

如果您确实具有数据连接,那么您可以从生成数据的机器上执行hadoop fs-put命令(假设您也安装了hadoop二进制文件):

(未经测试)


由于您创建数据的节点可以访问internet,那么也许您可以安装hadoop客户端节点软件,然后将其添加到集群-在正常的hadoop fs-put之后,然后断开连接并移除临时节点-然后hadoop系统会自动复制hadoop集群中的文件块

二进制文件无关紧要--
ssh
不会损坏8位内容。试着用
-
代替
/dev/stdin
?用
-
代替
/dev/stdin
怎么样?太好了。使用-而不是/dev/stdin解决了这个问题。因此,我使用了以下代码,并且工作正常:cat test.txt | sshusername@masternode“hadoop dfs-put-hadoopFolderName/test.txt”是特定的put。将单个文件复制到主节点的本地驱动器,然后使用ssh remote将其放入hadoop比管道化cat | ssh remote更快。此解决方案只需稍加修改即可工作,只需在hdfs路径中添加文件名:cat test.txt | sshusername@masternode“hdfs dfs-put-hadoopFoldername/test.txt”很不幸,我在其上创建数据的节点无法直接访问hoop群集。您知道需要的最小hadoop安装是什么吗?管道问题已经解决。但是,管道的性能要比先将文件复制到主节点的本地磁盘,然后再将其复制到Hadoop慢得多。有什么想法吗?这应该行得通:
tar cf - . | ssh remote "(cd /destination && tar xvf -)"
#> hadoop fs -fs masternode:8020 -put test.bin hadoopFolderName/