2016-04-15 39 views
6

在Hadoop中getmerge描述Hadoop -getmerge如何工作?

用法:HDFS DFS -getmerge SRC localdst [addnl]

我的问题是,为什么getmerge被串联到本地目标,为什么不HDFS本身?这个问题被问到,因为我有以下问题

  1. 如果要合并的文件大于本地的大小?
  2. 是否有限制hadoop -getmerge命令仅用于连接到本地目标的任何具体原因?
+0

我知道这不是你的问题,但也许你会发现这个帖子很有用:http://stackoverflow.com/questions/21776339/hadoop-getmerge-to-another-machine – vefthym

回答

6

getmerge命令专门用于将文件从HDFS合并到本地文件系统中的单个文件。

该命令对于下载MapReduce作业的输出非常有用,该作业可能会生成多个part- *文件,并将它们合并到本地的单个文件中,您可以将其用于其他操作(例如,将其放入Excel表单)。

问题的答案:

  1. 如果目标文件系统没有足够的空间,则抛出IOException。 getmerge内部使用IOUtils.copyBytes()(请参阅IOUtils.copyBytes())函数一次将一个文件从HDFS复制到本地文件。只要复制操作出现错误,此函数就会抛出IOException

  2. 该命令与hdfs fs -get命令类似,用于从HDFS获取文件到本地文件系统。唯一不同的是hdfs fs -getmerge将HDFS中的多个文件合并到本地文件系统。

如果你想在HDFS合并多个文件,可以使用copyMerge()方法从FileUtil类(见FileUtil.copyMerge())实现它。

此API将目录中的所有文件复制到单个文件(合并所有源文件)。

+0

谢谢你的回答, – monic

+1

是否有替代-getmerge我可以直接从hdfs合并到hdfs的文件? – monic

+1

这没有命令行功能。正如我在答案中提到的那样,您需要以编程方式使用“FileUtil.copyMerge()”,或者使用一些Linux shell脚本技巧,如下所述:http://stackoverflow.com/questions/3548259/merging-multiple-files-into-一中,Hadoop的。对于例如hadoop fs -cat [dir]/* | hadoop fs -put - [目标文件] –