7

我正在使用 Hadoop 0.20.2 并希望尽可能使用 -cat shell 命令将两个文件连接为一个(来源:http ://hadoop.apache.org/common/docs/r0.19.2/hdfs_shell.html )

这是我提交的命令(名称已更改):

**/path/path/path/hadoop-0.20.2> bin/hadoop fs -cat /user/username/folder/csv1.csv /user/username/folder/csv2.csv > /user/username/folder/outputdirectory/**

它返回 bash: /user/username/folder/outputdirectory/: No such file or directory

我还尝试创建该目录,然后再次运行它——我仍然收到“没有这样的文件或目录”错误。

我还尝试使用 -cp 命令将两者复制到一个新文件夹中,并使用 -getmerge 将它们组合起来,但 getmerge 也没有运气。

在 hadoop 中这样做的原因是文件很大,并且需要很长时间才能在 hadoop 之外下载、合并和重新上传。

4

2 回答 2

10

该错误与您尝试将命令的标准输出重定向回 HDFS 有关。有一些方法可以做到这一点,使用hadoop fs -put源参数为连字符的命令:

bin/hadoop fs -cat /user/username/folder/csv1.csv /user/username/folder/csv2.csv | hadoop fs -put - /user/username/folder/output.csv

-getmerge也输出到本地文件系统,而不是 HDFS

Unforntunatley 没有将多个文件合并为一个的有效方法(除非您想查看 Hadoop 的“附加”,但在您的 hadoop 版本中,默认情况下禁用并且可能存在错误),而无需将文件复制到一台机器然后回到 HDFS,不管你是在

  • 一个自定义 map reduce 作业,带有一个 reducer 和一个保留文件顺序的自定义 mapper reducer值将是线本身)
  • 通过 FsShell 命令,具体取决于您的网络拓扑 - 即您的客户端控制台与数据节点的连接速度是否良好?这当然是您最省力的工作,并且可能比 MR 工作更快地完成相同的工作(因为无论如何都必须转到一台机器上,所以为什么不使用本地控制台呢?)
于 2012-05-15T21:06:42.603 回答
6

要将文件夹中的所有文件连接到输出文件:

hadoop fs -cat myfolder/* | hadoop fs -put - myfolder/output.txt

如果您在 hdfs 上有多个文件夹,并且想要连接每个文件夹中的文件,则可以使用 shell 脚本来执行此操作。(注意:这不是很有效,可能会很慢)

句法 :

for i in `hadoop fs -ls <folder>| cut -d' ' -f19` ;do `hadoop fs -cat $i/* | suy hadoop fs -put - $i/<outputfilename>`; done

例如:

for i in `hadoop fs -ls my-job-folder | cut -d' ' -f19` ;do `hadoop fs -cat $i/* |hadoop fs -put - $i/output.csv`; done

说明: 所以你基本上遍历所有文件并将每个文件夹内容分类到 hdfs 上的输出文件中。

于 2014-11-03T19:17:14.477 回答