将远程文件放入hadoop而不将其复制到本地磁盘
Posted
技术标签:
【中文标题】将远程文件放入hadoop而不将其复制到本地磁盘【英文标题】:putting a remote file into hadoop without copying it to local disk 【发布时间】:2012-07-01 12:00:04 【问题描述】:我正在编写一个 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 本地磁盘上文件的本地副本。
谢谢
换句话说,我想以一种我能做到的方式传递多个命令
【问题讨论】:
管道问题已解决。但是,管道的性能比先将文件复制到主节点的本地磁盘然后再将它们复制到Hadoop要慢得多。有什么想法吗? 【参考方案1】:试试这个(未经测试):
cat test.txt | ssh username@masternode "hadoop dfs -put - hadoopFoldername/test.txt"
我使用了类似的技巧来复制目录:
tar cf - . | ssh remote "(cd /destination && tar xvf -)"
这会将本地-tar
的输出发送到远程-tar
的输入。
【讨论】:
二进制无关紧要——ssh
不会破坏 8 位内容。尝试用-
代替/dev/stdin
?
用-
代替/dev/stdin
怎么样?
哦,太好了。使用 - 而不是 /dev/stdin 解决了这个问题。所以我正在使用以下代码,它工作正常: cat test.txt | ssh username@masternode "hadoop dfs -put - hadoopFolderName/test.txt"
具体放。将单个文件复制到主节点的本地驱动器,然后使用 ssh 远程将其放入 hadoop 比通过管道传输 cat 更快 | ssh 远程。
这个解决方案几乎没有修改,只需在 hdfs 路径中添加文件名:cat test.txt | ssh username@masternode "hdfs dfs -put - hadoopFoldername/test.txt"【参考方案2】:
Hadoop 提供了几个 REST 接口。检查Hoop 和WebHDFS。您应该能够复制文件,而无需从非 Hadoop 环境中使用它们将文件复制到主服务器。
【讨论】:
这应该可以工作:hadoop.apache.org/docs/r1.0.4/…【参考方案3】:您生成数据的节点是否能够到达您的每个集群节点(名称节点和所有数据节点)。
如果您确实有数据连接,那么您可以在生成数据的机器上执行 hadoop fs -put 命令(假设您也安装了 hadoop 二进制文件):
#> hadoop fs -fs masternode:8020 -put test.bin hadoopFolderName/
【讨论】:
很遗憾,我创建数据的节点无法直接访问箍集群。 您知道最低要求的 hadoop 安装是多少吗?【参考方案4】:(未经测试)
由于您创建数据的节点可以访问互联网,那么也许您可以安装 hadoop 客户端节点软件,然后将其添加到集群中 - 在正常 hadoop fs -put 之后,然后断开连接并删除您的临时节点 - hadoop然后系统应该自动在你的hadoop集群中复制你的文件块
【讨论】:
【参考方案5】:创建管道,然后使用管道进行传输。这样文件就不会存储在本地了。
mkfifo transfer_pipe
scp remote_file transfer_pipe| hdfs dfs -put transfer_pipe <hdfs_path>
【讨论】:
以上是关于将远程文件放入hadoop而不将其复制到本地磁盘的主要内容,如果未能解决你的问题,请参考以下文章