我怎么可以连接在Hadoop中的两个文件到使用Hadoop FS壳呢?(How can I conc

2019-06-24 11:51发布

我用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:/用户/用户名/文件夹/输出目录/:没有这样的文件或目录

我也尝试创建目录,然后重新运行它 - 我仍然得到了“没有这样的文件或目录”错误。

我已经使用-cp命令同时复制到一个新的文件夹,并-getmerge将它们合并,但有与getmerge没有运气或者也试过。

之所以在Hadoop中这样做的是,文件是巨大的,并需要很长的时间来下载,合并和Hadoop之外重新上传。

Answer 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,不管你做的是,在

  • 自定义地图缩小工作与一个单一的减速和保持该文件排序(记住每一行将由键进行排序的自定义映射器减速,所以你钥匙将需要输入文件名和行号的组合,和值将是线本身)
  • 通过FsShell命令,根据您的网络拓扑结构 - 即没有客户端控制台有很好的速度连接到数据节点? 这当然是对你的一部分最小的努力,并可能完成比MR工作更快地做同样的(因为一切都已经去到一台机器,无论如何,那么为什么不是你的本地控制台?)


Answer 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输出文件。



文章来源: How can I concatenate two files in hadoop into one using Hadoop FS shell?