Hadoop 将文件从s3复制并提取到HDFS

Hadoop 将文件从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

我想将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
hadoop fs -mkdir /input/test
hadoop fs -copyFromLocal test/ /input/test

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

  • 一种解决方案是使用一个简单的代码或一个并行解压缩的程序

    附录:对于ZIP,您可以遵循。而且,您可以为tar.gz提供类似的功能

  • 如果您的文件大小是巨大的100GB.zip,您可能可以使用一个文件包来读取zip存档流,提取(在上面的附录中的ZipFileRecordReader中是如何完成的),然后将其写回HDFS。我认为,单个ZIP文件是不可拆分的,不能并行提取的(如果我没弄错的话)。因此,如果您有一个100GB的zip存档,您可能无论如何都无法充分发挥MapReduce程序的潜力。因此,使用它并不重要

  • 另一个解决办法是根本不减压。对于各种内置的压缩格式,Hadoop有一个命令行实用程序,可以帮助您查看压缩文件,就像您希望在HDFS中保持其未压缩一样

    hadoop fs-text/path/fileinHDFS.bz2“


  • 您应该能够通过一些巧妙的管道来实现这一点

    类似这样(完全未经测试):


    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]