2014-04-10 58 views
3

我正在尝试从Hadoop HDFS中检索总计几个GB的文本文件的目录。我可以压缩文件为'hadoop hdfs -get'

hadoop hdfs -get /path/to/directory/* . 

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

如果不是,那么使用压缩来获取文件的最直接的方法是什么?如果它很重要,群集正在运行CDH 4.5.0,并且我没有群集上的任何管理员权限。

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

我还会接受一个答案,表明这是一个有记录的缺失功能,它被有意地排除在Hadoop之外,或者预计将在未来发行版中添加。

回答

0

由于您的带宽很低,压缩必须在获取本地计算机上的文件之前进行。您需要使用LZO或群集上配置的任何其他压缩编解码器运行MapReduce作业。这样你就可以得到一个压缩的输出,然后你可以下载。由于作业将在群集中运行,并且数据本地化生效的速度会更快。

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

+0

我只是感到惊讶的是,一些压缩量没有内置到'hadoop hdfs -get'和'hadoop hdfs -put'命令或一些等价的命令中。很多人不需要上传/下载GB或TB范围内的文件? –

+0

MapR发行版内置了压缩功能,但是我认为其他发行版或核心hadoop目前都没有此功能。关于MapR的更多细节http://answers.mapr.com/questions/38/what-c​​ompression-algorithm-does-mapr-use – Sudarshan

1

我相信这个假设是,大多数人已经在HDFS中使用文件级压缩,所以应用传输级压缩不会带来任何收益。

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

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

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

但是,在HDFS中提供透明压缩可能会更好,类似于MapR提供的透明压缩。

+0

看起来其他人已经提出了透明压缩:https://issues.apache.org/jira/browse/HDFS-2115,但它看起来并不像门票获得太多活动。 –

+0

对票证采取行动的最简单方法是提供补丁。 – b4hand

+0

我不需要添加透明压缩。但我应该可以为'-get'和'-put'添加可选压缩,所以我为该https://issues.apache.org/jira/browse/HDFS-6323添加了一张票 –