Hadoop 将文件从s3复制并提取到HDFS
我想将test.tar.gz文件从S3复制到HDFS。这可以通过distcp或s3distcp完成。但我的要求是,当我将文件传输到HDFS时,它应该被动态提取,在HDFS中,我应该只有提取的文件,而不是tar.gzHadoop 将文件从s3复制并提取到HDFS,hadoop,amazon-s3,hdfs,Hadoop,Amazon S3,Hdfs,我想将test.tar.gz文件从S3复制到HDFS。这可以通过distcp或s3distcp完成。但我的要求是,当我将文件传输到HDFS时,它应该被动态提取,在HDFS中,我应该只有提取的文件,而不是tar.gz 有什么建议吗。使用bash脚本有什么问题?我的意思是: s3distcp --src [file-location] --dst . #Without the hdfs prefix tar -zxvf test.tar.gz hadoop fs -mkdir /input hado
有什么建议吗。使用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压缩文件。我建议您使用基于HadoopAPI的代码或MapReduce程序在传输到HDFS后提取压缩文件。一旦进入HDFS,您就可以提取文件,而无需将其复制到本地文件系统
您应该能够通过一些巧妙的管道来实现这一点 类似这样(完全未经测试):
s3cmd get[s3 path]-
从s3获取文件并将其管道传输到stdout(-
)。tar-zxfO
从stdin获取管道传输的文件内容并将其提取到stdout(使用-O
选项)。hadoop dfs-put-[hadoop path]
放置来自stdin的管道传输数据(-
)在提供的HDFS文件中。这是一个很好的选择。但我不应该使用任何本地文件系统来放置tar.gz文件。它类似于S3中的tar.gz文件和仅包含文件的解压目录结构,在HDFS中。无法访问MapReduce代码,压缩格式不适用于tar或zip文件。HDFS上的解压很好,但可以使用你分享了一些tar/zip的代码。(有一种方法unTar,但似乎对HDFS不起作用)我在上面添加了一个附录。请检查。这没有用,因为我的情况是它有100 GB的zip(提取到600GB),所以需要一种可能的方法在HDFS内解压缩(比如用distcp将文件下载到HDFS)管道将不能与zip和second一起工作,如果tar有多个文件,它将合并并成为一个文件。
s3cmd get [s3 path] - | tar -zxfO | hadoop dfs -put - [hadoop path]