我想将test.tar.gz文件从S3复制到HDFS。这可以通过distcp或s3distcp完成。但我的要求是,当我将文件传输到HDFS时,应该立即提取文件并在HDFS中提取文件,而不是tar.gz。将s3中的文件复制并提取到HDFS
请提出任何建议。
我想将test.tar.gz文件从S3复制到HDFS。这可以通过distcp或s3distcp完成。但我的要求是,当我将文件传输到HDFS时,应该立即提取文件并在HDFS中提取文件,而不是tar.gz。将s3中的文件复制并提取到HDFS
请提出任何建议。
使用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
当您通过网络传输时,通常最好是文件保持压缩状态。想象一下,传输100GB而不是传输20GB bz2压缩文件。一旦传输完成到HDFS,我建议您使用基于Hadoop API的代码或MapReduce程序来提取压缩文件。一旦进入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"
你应该能够与一些聪明的管道来实现这个...
像这样(没有经过测试):
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文件中。
管道将不能使用zip,如果tar有多个文件,它将连续并成为一个。 – mtariq
这是一个不错的选择。但我不应该使用任何本地文件系统来放置tar.gz文件。它像S3中的tar.gz文件,在HDFS中仅提取文件的目录结构。 – Ilango
是的,它也不可扩展 – mtariq