将文件从s3复制并解压缩到HDFS

时间:2014-05-20 09:46:28

标签: hadoop amazon-s3 hdfs

我想将test.tar.gz文件从S3复制到HDFS。这可以通过distcp或s​​3distcp来完成。但我的要求是,当我将文件传输到HDFS时,它应该在运行中提取,在HDFS中,我应该只提取文件而不是tar.gz.

请提出任何建议。

3 个答案:

答案 0 :(得分:2)

当您通过网络进行转移时,通常最好将文件保持压缩状态。想象一下,传输100GB而不是传输20GB bz2压缩文件。我建议您使用基于Hadoop API的代码或MapReduce程序在传输到HDFS后提取压缩文件。一旦进入HDFS,您就可以提取文件而无需将它们复制到本地文件系统。

  1. 一种解决方案是使用简单的Hadoop API based代码或MapReduce code (updated)并行解压缩。

    附录:对于ZIP,您可以关注this link。而且,你可以为tar.gz提出类似的东西。

  2. 如果你的文件大小是100GB.zip,你可以使用Hadoop API based program来读取Zip档案的流,提取(check this link它是如何在ZipFileRecordReader在上面的附录中)然后将其写回HDFS。我认为,单个ZIP文件不可拆分并且可以并行提取(如果我没有弄错的话)。因此,如果您有一个100GB的zip存档,那么您可能无法释放MapReduce程序的全部潜力。因此,不要点使用它。

  3. 其他解决方案是根本不解压缩。对于各种内置压缩格式,Hadoop有一个命令行实用程序,可以帮助您查看压缩文件,如果您打算在HDFS中保持它未压缩。

    hadoop fs -text /path/fileinHDFS.bz2"

答案 1 :(得分:0)

使用bash脚本的问题是什么?我的意思是:

s3distcp --src [file-location] --dst . #Without the hdfs prefix
tar -zxvf test.tar.gz
hadoop fs -mkdir /input
hadoop fs -mkdir /input/test
hadoop fs -copyFromLocal test/ /input/test

答案 2 :(得分:0)

你应该能够通过一些聪明的管道实现这一目标......

这样的事情(完全未经测试):

s3cmd get [s3 path] - | tar -zxfO | hadoop dfs -put - [hadoop path]

s3cmd get [s3 path] -从S3获取文件并将其传递给stdout(-)。 tar -zxfO从stdin获取管道文件内容并将其提取到stdout(-O选项)。 hadoop dfs -put - [hadoop path]将管道传输到来自提交的HDFS文件中的标准输入(-)的数据中。