如何将文件从S3复制到Amazon EMR HDFS?

时间:2011-09-20 14:57:39

标签: amazon-s3 hadoop hive hdfs emr

我在EMR上运行蜂巢, 并需要将一些文件复制到所有EMR实例。

据我所知,一种方法是将文件复制到每个节点上的本地文件系统,另一种方法是将文件复制到HDFS,但是我还没有找到一种简单的方法将stright从S3复制到HDFS。

最好的方法是什么?

3 个答案:

答案 0 :(得分:27)

执行此操作的最佳方法是使用Hadoop的distcp命令。示例(在其中一个群集节点上):

% ${HADOOP_HOME}/bin/hadoop distcp s3n://mybucket/myfile /root/myfile

这会将名为mybucket的S3存储块中名为myfile的文件复制到HDFS中的/root/myfile。请注意,此示例假定您在“本机”模式下使用S3文件系统;这意味着Hadoop将S3中的每个对象视为一个文件。如果在块模式下使用S3,则在上面的示例中将s3n替换为s3。有关本机S3和块模式之间差异的更多信息,以及上述示例的详细说明,请参阅http://wiki.apache.org/hadoop/AmazonS3

我发现distcp是一个非常强大的工具。除了能够使用它来复制进出S3的大量文件之外,您还可以使用大型数据集执行快速的群集到群集副本。 distcp不是通过单个节点推送所有数据,而是并行使用多个节点来执行传输。与将所有内容作为中介复制到本地文件系统的替代方法相比,这使得在传输大量数据时distcp速度更快。

答案 1 :(得分:15)

现在亚马逊本身有一个通过distcp实现的包装器,即: s3distcp

  

S3DistCp是DistCp的扩展,经过优化可以使用   Amazon Web Services(AWS),尤其是Amazon Simple Storage Service   (亚马逊S3)。您可以通过将S3DistCp添加为作业流程中的步骤来使用它。   使用S3DistCp,您可以有效地从中复制大量数据   Amazon S3进入HDFS,可以通过后续步骤进行处理   您的Amazon Elastic MapReduce(Amazon EMR)作业流程。你也可以使用   S3DistCp用于在Amazon S3存储桶之间或从HDFS到Amazon复制数据   S3

示例将日志文件从Amazon S3复制到HDFS

以下示例说明如何将存储在Amazon S3存储桶中的日志文件复制到HDFS中。在此示例中, - srcPattern选项用于限制复制到守护程序日志的数据。

elastic-mapreduce --jobflow j-3GY8JC4179IOJ --jar \
s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar \
--args '--src,s3://myawsbucket/logs/j-3GY8JC4179IOJ/node/,\
--dest,hdfs:///output,\
--srcPattern,.*daemons.*-hadoop-.*'

答案 2 :(得分:4)

请注意,根据亚马逊,在http://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/FileSystemConfig.html“Amazon Elastic MapReduce - 文件系统配置”中,不推荐使用S3 Block FileSystem,其URI前缀现在为s3bfs://并且他们特别不鼓励使用它,因为“它可以触发可能导致您的工作流程失败的竞争条件“。

根据同一页面,HDFS现在是S3下的“一流”文件系统,虽然它是短暂的(当Hadoop作业结束时消失)。