我正在尝试从hadoop hdfs中检索一个总容量为几千字节的文本文件目录。我可以和你一起做
hadoop hdfs -get /path/to/directory/* .
但是我到hadoop集群的链接大约是1mb/s,所以这需要相当长的时间。像大多数文本文件这些压缩非常好,所以我想他们被压缩下载。是吗 hadoop hdfs -get
命令在传输过程中自动压缩(http和许多其他协议可以实现的方式)?
如果不是,使用压缩获取文件最直接的方法是什么?如果有关系的话,集群运行的是cdh4.5.0,我对集群没有任何管理员权限。
我发现了这个问题,但这是关于压缩一个文件以保存在hdfs中,似乎应该有一种方法来压缩传输中的字节,而不必创建、获取、然后删除压缩副本。从我对hadoop典型用法的理解来看,获取和放置非常大的文本文件应该是一个典型的用例,而且文本文件的压缩效果也很好。
我也会接受这样一个答案,即这是一个有文档记录的缺少的特性,它要么是有意地被排除在hadoop之外,要么有望在将来的某个版本中被添加。
2条答案
按热度按时间qgelzfjb1#
由于带宽较低,因此必须在本地计算机上获取文件之前进行压缩。您需要在集群上配置lzo或任何其他压缩编解码器的情况下运行mapreduce作业。这样,您将有一个压缩输出,然后您可以下载。因为作业将在集群中运行,所以将数据局部性生效会更快。
看一看hadoophar,它与上面提到的完全一样。它运行一个mr并创建一个压缩的hadoop归档文件。您可以使用-gettolocal命令下载相同的文件,并使用winrar打开它。有关更多信息,请查看hadoop归档
sq1bmfud2#
我相信这个假设是大多数人已经在hdfs中使用了文件级压缩,所以应用传输级压缩不会给您带来任何好处。
您还必须小心不要使用某些类型的压缩,因为这样您就无法轻松地拆分文件以进行输入以Mapreduce作业。您需要使用snappy或lzo,因为它们是“可拆分”的输入文件,而gzip不是。
我敢肯定,如果您愿意为hadoop提供补丁,他们会愿意接受支持压缩的更改
-get
(也许-put
以及)假设它是可选的。实施
-get
在copycommands.java中找到。您可以看到它使用ioutils.copybytes在FSDataOutputStream
. 此时需要分层压缩,但目前尚未完成。然而,在hdfs中提供透明压缩可能会更好,就像mapr提供的那样。