2014-05-20 48 views
5

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

请提出任何建议。

回答

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 
+0

这是一个不错的选择。但我不应该使用任何本地文件系统来放置tar.gz文件。它像S3中的tar.gz文件,在HDFS中仅提取文件的目录结构。 – Ilango

+1

是的,它也不可扩展 – mtariq

2

当您通过网络传输时,通常最好是文件保持压缩状态。想象一下,传输100GB而不是传输20GB bz2压缩文件。一旦传输完成到HDFS,我建议您使用基于Hadoop API的代码或MapReduce程序来提取压缩文件。一旦进入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"

+0

无法访问MapReduce代码,压缩格式不支持tar或zip文件。 HDFS上的解压缩非常好,但是可以共享一些tar/zip代码。 (有一种方法unar,但似乎不能在HDFS上工作) – mtariq

+0

我已经在上面添加了一个附录。请检查。 –

+0

没有用,因为我的情况是它的100 GB GB zip(提取到600GB),所以需要一种可能的方式在HDFS中解压缩(作为使用distcp将文件下载到HDFS) – mtariq

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文件中。

+0

管道将不能使用zip,如果tar有多个文件,它将连续并成为一个。 – mtariq