压缩'hadoop hdfs -get'的文件

时间:2014-04-10 18:29:45

标签: hadoop compression hdfs

我试图从Hadoop HDFS中检索总计几千兆字节的文本文件目录。我可以用

做到这一点
hadoop hdfs -get /path/to/directory/* .

但我与Hadoop集群的链接大约是1 MB / s,因此需要很长时间。像大多数文本文件一样,这些文件压缩得很好,所以我希望它们可以压缩下载。 hadoop hdfs -get命令是否在传输过程中自动压缩(http和许多其他协议可以的方式)?

如果没有,使用压缩获取文件的最简单方法是什么?如果重要,则群集正在运行CDH 4.5.0,并且我对群集没有任何管理员权限。

我找到了this question,但这是在讨论压缩文件以保留在HDFS中,似乎应该有一种方法来压缩传输中的字节而不创建,获取和然后删除压缩副本。从我对典型Hadoop使用的理解来看,获取和放置非常大的文本文件似乎应该是一个典型的用例,并且已经确定文本文件压缩得很好。

我还会接受一个答案,该答案显示这是一个记录在案的缺失功能,该功能要么被故意排除在Hadoop之外,要么预计会在将来的某个版本中添加。

2 个答案:

答案 0 :(得分:1)

我认为假设大多数人已经在HDFS中使用文件级压缩,因此应用传输级压缩不会获得任何东西。

您还必须小心不要使用某些类型的压缩,因为您无法轻松地将文件拆分为map-reduce作业的输入。你想使用Snappy或LZO,因为它们是“可拆分”的输入文件,而Gzip不是。

我确定你是否愿意为Hadoop提供补丁,他们愿意接受支持-get(也可能是-put)压缩的更改,假设它是可选的。

-get的实施位于CopyCommands.java。您可以看到它使用IOUtils.copyBytesFSDataOutputStream上进行复制。您需要在该点进行压缩,但目前尚未完成。

然而,在HDFS中提供透明压缩可能更好,类似于MapR提供它的方式。

答案 1 :(得分:0)

由于您的带宽较低,因此必须在将文件传输到本地计算机之前进行压缩。您需要使用LZO或群集上配置的任何其他压缩编解码器运行MapReduce作业。通过这种方式,您将获得一个压缩输出,然后您可以下载。由于作业将在集群中运行,因此将数据局部性生效更快。

看看Hadoop HAR,完全如上所述。它运行MR并创建压缩的Hadoop存档。您可以使用-getToLocal命令下载相同的命令并使用WINRAR打开它。有关更多信息,请查看Hadoop Archives