Hadoop -getmerge 是如何工作的?

How Hadoop -getmerge works?

hadoop getmerge 描述

Usage: hdfs dfs -getmerge src localdst [addnl]

我的问题是为什么 getmerge 连接到本地目标而不是 hdfs 本身?之所以问这个问题是因为我有以下问题

  1. 要合并的文件超过本地大小怎么办?
  2. 将 hadoop -getmerge 命令限制为仅连接到本地目标是否有任何特定原因?

getmerge 命令专为将 HDFS 中的文件合并到本地文件系统上的单个文件而创建。

此命令对于下载 MapReduce 作业的输出非常有用,它可能会生成多个 part-* 文件并在本地将它们组合成一个文件,您可以将其用于其他操作(例如将其放入Excel sheet 用于演示。

您问题的答案:

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

  2. 此命令与 hdfs fs -get 命令类似,后者将文件从 HDFS 获取到本地文件系统。唯一的区别是 hdfs fs -getmerge 将多个文件从 HDFS 合并到本地文件系统。

如果要在 HDFS 中合并多个文件,可以使用 copyMerge() 中的方法实现 FileUtil class(参见 FileUtil.copyMerge())。

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