我想将test.tar.gz文件从S3复制到HDFS。这可以通过distcp或s3distcp来完成。但我的要求是,当我将文件传输到HDFS时,它应该在运行中提取,在HDFS中,我应该只提取文件而不是tar.gz.
请提出任何建议。
答案 0 :(得分:2)
当您通过网络进行转移时,通常最好将文件保持压缩状态。想象一下,传输100GB而不是传输20GB bz2压缩文件。我建议您使用基于Hadoop API的代码或MapReduce程序在传输到HDFS后提取压缩文件。一旦进入HDFS,您就可以提取文件而无需将它们复制到本地文件系统。
一种解决方案是使用简单的Hadoop API based代码或MapReduce code (updated)并行解压缩。
附录:对于ZIP,您可以关注this link。而且,你可以为tar.gz提出类似的东西。
如果你的文件大小是100GB.zip,你可以使用Hadoop API based program来读取Zip档案的流,提取(check this link它是如何在ZipFileRecordReader在上面的附录中)然后将其写回HDFS。我认为,单个ZIP文件不可拆分并且可以并行提取(如果我没有弄错的话)。因此,如果您有一个100GB的zip存档,那么您可能无法释放MapReduce程序的全部潜力。因此,不要点使用它。
其他解决方案是根本不解压缩。对于各种内置压缩格式,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文件中的标准输入(-
)的数据中。