如何使用Hadoop FS shell将hadoop中的两个文件连接成一个?

时间:2012-05-15 19:43:48

标签: shell hadoop concatenation

我正在使用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 /:没有这样的文件或目录

我也尝试创建该目录然后再​​次运行 - 我仍然得到'没有这样的文件或目录'错误。

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

在hadoop中执行此操作的原因是文件非常庞大,需要很长时间才能在hadoop之外下载,合并和重新上传。

2 个答案:

答案 0 :(得分:8)

该错误与您尝试将命令的标准输出重定向回HDFS有关。有一些方法可以使用hadoop fs -put命令执行此操作,其中source参数为hypen:

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,无论你是否在

中这样做
  • 自定义地图使用单个reducer和自定义mapper reducer减少作业,保留文件排序(请记住每行将按键排序,因此您需要将键设置为输入文件名和行号的某种组合,值将是行本身)
  • 通过FsShell命令,具体取决于您的网络拓扑 - 即您的客户端控制台是否与数据节点有良好的速度连接?这肯定是你最努力的事情,并且可能比MR工作更快完成同样的事情(因为一切都必须去一台机器,所以为什么不是你的本地控制台?)

答案 1 :(得分: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上的输出文件中。