【发布时间】:2014-07-08 12:15:47
【问题描述】:
我想将 test.tar.gz 文件从 S3 复制到 HDFS。这可以通过 distcp 或 s3distcp 完成。但是我的要求是当我将文件传输到 HDFS 时,它应该被即时提取,而在 HDFS 中我应该只有提取的文件而不是 tar.gz。
请给点建议。
【问题讨论】:
我想将 test.tar.gz 文件从 S3 复制到 HDFS。这可以通过 distcp 或 s3distcp 完成。但是我的要求是当我将文件传输到 HDFS 时,它应该被即时提取,而在 HDFS 中我应该只有提取的文件而不是 tar.gz。
请给点建议。
【问题讨论】:
当您通过网络传输时,文件通常最好保持压缩状态。想象一下传输一个 100GB 以上而不是传输一个 20GB bz2 压缩文件。我建议您在传输到 HDFS 后使用基于 Hadoop API 的代码或 MapReduce 程序来提取压缩文件。一旦进入 HDFS,您就可以提取文件,而无需将它们复制到本地文件系统。
一种解决方案是使用简单的Hadoop API based 代码或并行解压缩的MapReduce code (updated)。
附录:对于 ZIP,您可以关注 this link。而且,你可以为 tar.gz 想出类似的东西。
其他解决方案是根本不解压缩。对于各种内置的压缩格式,Hadoop 有一个命令行实用程序,可以帮助您按原样查看压缩文件,就好像您打算在 HDFS 中保持未压缩文件一样。
hadoop fs -text /path/fileinHDFS.bz2"
【讨论】:
使用 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
【讨论】:
你应该能够通过一些巧妙的管道来实现这一点......
类似这样的东西(完全未经测试):
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 文件中。
【讨论】: