【问题标题】:Copy and extract files from s3 to HDFS将文件从 s3 复制并提取到 HDFS
【发布时间】:2014-07-08 12:15:47
【问题描述】:

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

请给点建议。

【问题讨论】:

    标签: hadoop amazon-s3 hdfs


    【解决方案1】:

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

    1. 一种解决方案是使用简单的Hadoop API based 代码或并行解压缩的MapReduce code (updated)

      附录:对于 ZIP,您可以关注 this link。而且,你可以为 tar.gz 想出类似的东西。

    2. 1234563 ) 然后将其写回 HDFS。我认为,单个 ZIP 文件不可拆分和并行提取(如果我没记错的话)。因此,如果您有一个 100GB 的 zip 存档,您可能无论如何都无法释放 MapReduce 程序的全部潜力。因此,不要使用它。
    3. 其他解决方案是根本不解压缩。对于各种内置的压缩​​格式,Hadoop 有一个命令行实用程序,可以帮助您按原样查看压缩文件,就好像您打算在 HDFS 中保持未压缩文件一样。

      hadoop fs -text /path/fileinHDFS.bz2"

    【讨论】:

    • 无法访问 MapReduce 代码,压缩格式不适用于 tar 或 zip 文件。 HDFS 上的解压缩很棒,但你能分享一些 tar/zip 的代码吗? (有一种方法 unTar 但似乎不适用于 HDFS)
    • 我在上面添加了一个附录。请检查。
    • 没用,就我而言,它有 100 GB 的 zip(解压到 600GB),所以需要一种可能的方法在 HDFS 中解压缩(如使用 distcp 将文件下载到 HDFS)
    【解决方案2】:

    使用 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
    

    【讨论】:

    • 这是一个不错的选择。但我不应该使用任何本地文件系统来放置 tar.gz 文件。它类似于 S3 中的 tar.gz 文件,并在 HDFS 中仅包含文件的提取目录结构。
    【解决方案3】:

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

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

    s3cmd get [s3 path] - | tar -zxfO | hadoop dfs -put - [hadoop path]
    

    s3cmd get [s3 path] - 从 S3 获取文件并将其通过管道传输到标准输出 (-)。 tar -zxfO 从标准输入获取管道文件内容并将其提取到标准输出(-O 选项)。 hadoop dfs -put - [hadoop path] 将来自标准输入 (-) 的管道数据放入提供的 HDFS 文件中。

    【讨论】:

    • 管道不适用于 zip 和 second 如果 tar 有多个文件,它将连接并成为一个。
    猜你喜欢
    • 2016-11-23
    • 2011-11-21
    • 2019-11-14
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多