压缩文件以进行“hadoop hdfs -get”操作

3

我正在尝试从Hadoop HDFS检索一个包含数GB文本文件的目录。我可以使用以下方法完成此操作:

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

但我的与Hadoop集群的链接大约是1 MB/s,所以这需要相当长的时间。像大多数文本文件一样,这些文件可以很好地压缩,因此我希望它们在下载时被压缩。 hadoop hdfs -get 命令在传输期间是否自动压缩(就像http和许多其他协议一样)?
如果不是,那么获取文件的最简单方法是什么?如果有关系,群集正在运行CDH 4.5.0,并且我没有任何类型的管理员权限。
我找到了this question,但那是在谈论压缩文件以保留在HDFS中,而且似乎应该有一种在创建、获取和删除压缩副本的情况下在传输中压缩字节的方法。从我对典型Hadoop使用的理解来看,获取和放置非常大的文本文件应该是一个典型的用例,并且已经证明文本文件可以很好地压缩。
我也会接受一个回答,显示这是一个已记录的缺失功能,已经被有意地省略在Hadoop中,或者预计将在某个未来版本中添加。
2个回答

1
我认为假设大多数人已经在HDFS中使用了文件级压缩,因此应用传输级压缩不会为您带来任何好处。
你还要注意不要使用某些类型的压缩,否则你无法轻松地将文件拆分为map-reduce作业的输入。你需要使用Snappy或LZO,因为它们是“可分割”的输入文件,而Gzip不是。
我相信,如果你愿意提供一个Hadoop补丁,他们愿意接受支持-get中的压缩更改(也许还有-put),假设这是可选的。 < p > -get 的实现可以在 CopyCommands.java 中找到。您可以看到它使用 IOUtils.copyBytesFSDataOutputStream 上进行复制。您需要在那时添加压缩,但目前还没有完成。

然而,提供类似于 MapR 提供的 HDFS 透明压缩可能会更好。


看起来有人已经提出了透明压缩的建议:https://issues.apache.org/jira/browse/HDFS-2115 但是似乎这个问题并没有得到太多关注。 - Tom Panning
获取有关工单的最简单方法是提供一个补丁。 - b4hand
我还没准备好添加透明压缩。但是我应该可以为“-get”和“-put”添加可选压缩,所以我已经为此添加了一个工单 https://issues.apache.org/jira/browse/HDFS-6323 - Tom Panning

0

由于您的带宽较低,压缩必须在将文件获取到本地机器之前进行。您需要在群集上配置LZO或任何其他压缩编解码器并运行MapReduce作业。这样,您就会得到一个已经压缩的输出,然后可以下载。由于该作业将在群集中运行,并且会更快地考虑数据局部性。

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


我很惊讶 hadoop hdfs -gethadoop hdfs -put 命令没有内置某种程度的压缩,或者一些等价命令。毕竟有很多人需要上传/下载几个GB或TB级别的文件吧? - Tom Panning
MapR发行版内置了压缩功能,但我认为其他发行版或核心Hadoop目前都没有这个功能。有关MapR的更多详细信息,请访问http://answers.mapr.com/questions/38/what-compression-algorithm-does-mapr-use。 - Sudarshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接