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

Posted

技术标签:

【中文标题】如何使用 Hadoop FS shell 将 hadoop 中的两个文件连接成一个文件?【英文标题】:How can I concatenate two files in hadoop into one using Hadoop FS shell? 【发布时间】:2012-05-15 19:43:48 【问题描述】:

我正在使用 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 之外下载、合并和重新上传需要很长时间。

【问题讨论】:

【参考方案1】:

该错误与您尝试将命令的标准输出重定向回 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 工作更快地完成相同的工作(因为无论如何都必须在一台机器上进行,所以为什么不使用本地控制台呢?)

【讨论】:

按照您的建议使用 hadoop fs -put 完全符合我的需要——它将两个 CSV 连接到 HDFS 上的第三个文件中。非常感谢克里斯的帮助! 附加支持在 20.2 中不可用,因为它不包括在内。它后来被合并成一个后续版本。【参考方案2】:

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

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 上的输出文件中。

【讨论】:

什么是suy hadoop?我得到一个语法错误。它没有按预期工作,得到如下错误。如果有人可以帮助 [hadoop@ip-10-171-17-77 ~]$ for i in $header, $input_location ,不胜感激做hadoop fs -cat $i/* | hadoop fs -put - $input_location/test.txt;完成猫:非法文件模式:索引1附近未关闭的组放置:/user/hadoop/wmg_monthly_plus/test.txt': File exists put: /user/hadoop/wmg_monthly_plus/test.txt':文件存在猫:无法写入输出流。

以上是关于如何使用 Hadoop FS shell 将 hadoop 中的两个文件连接成一个文件?的主要内容,如果未能解决你的问题,请参考以下文章

大数据常用shell脚本之ha-hadoop脚本

Hadoop HA 配置文件以及自动化Shell脚本开关HA集群

执行 spark-shell 时出现 NoClassDefFoundError com.apache.hadoop.fs.FSDataInputStream

为啥没有'hadoop fs -head' shell 命令?

Hadoop HA 配置

“hadoop fs”shell 命令和“hdfs dfs”shell 命令有啥区别?