36

我正在编写一个 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 本地磁盘上文件的本地副本。

谢谢

换句话说,我想以一种我可以的方式传递几个命令

4

5 回答 5

41

试试这个(未经测试):

cat test.txt | ssh username@masternode "hadoop dfs -put - hadoopFoldername/test.txt"

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

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

这会将 local- 的输出发送tar到 remote- 的输入tar

于 2012-06-30T00:40:16.360 回答
10

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

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

#> hadoop fs -fs masternode:8020 -put test.bin hadoopFolderName/
于 2012-06-30T12:44:39.633 回答
2

Hadoop 提供了几个 REST 接口。检查HoopWebHDFS。您应该能够在不将文件复制到主服务器的情况下从非 Hadoop 环境中复制文件。

于 2012-06-30T01:27:10.437 回答
1

创建管道,然后使用管道进行传输。这样文件就不会存储在本地。

mkfifo transfer_pipe

scp remote_file transfer_pipe| hdfs dfs -put transfer_pipe <hdfs_path>
于 2021-09-15T05:47:52.037 回答
0

(未经测试)

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

于 2016-02-23T10:14:21.730 回答