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

27

我正在EMR上运行Hive,需要将一些文件复制到所有EMR实例中。

据我了解,一种方法是只需将文件复制到每个节点的本地文件系统,另一种方法是将文件复制到HDFS,但我还没有找到从S3直接复制到HDFS的简单方法。

那么,最好的做法是什么?

3个回答

28
最好的方法是使用Hadoop的distcp命令。例如(在集群节点中的一个):
``` % ${HADOOP_HOME}/bin/hadoop distcp s3n://mybucket/myfile /root/myfile ```
这将把名为myfile的文件从名为mybucket的S3存储桶复制到HDFS中的`/root/myfile`目录下。请注意,此示例假定您正在使用S3文件系统的“本地”模式;这意味着Hadoop将S3中的每个对象视为文件。如果您改用S3块模式,您将在上面的示例中将s3n替换为s3。有关本机S3和块模式之间的区别以及上述示例的详细信息,请参见http://wiki.apache.org/hadoop/AmazonS3
我发现distcp是一个非常强大的工具。除了能够将大量文件进出S3,还可以使用大数据集进行快速的集群间复制。distcp不同于将所有数据推送到单个节点,它使用多个节点并行执行传输。这使得distcp在传输大量数据时比将所有内容复制到本地文件系统作为中介要快得多。

使用distcp将s3移动到hdfs时仍然出现一些错误。在我的情况下,我正在尝试移动非常大的文件(超过300GB),在移动了40或50%后,它会重新开始,不知道为什么。有任何想法吗? - Rohit Gupta

15

现在,亚马逊本身已经实现了一个基于distcp的封装器,名为:s3distcp

S3DistCp是对DistCp的扩展,专门针对亚马逊网络服务(AWS),特别是Amazon Simple Storage Service(Amazon S3)。您可以通过在作业流程中添加S3DistCp步骤来使用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-.*'

4
请注意,根据亚马逊的说法,在 http://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/FileSystemConfig.html 《Amazon Elastic MapReduce - 文件系统配置》中,S3块文件系统已被弃用,其URI前缀现在为s3bfs://,他们明确不建议使用它,因为“它可能会触发竞态条件,导致作业流失败”。
根据同一页面,虽然HDFS是短暂的(当Hadoop作业结束时消失),但现在已成为S3下的“一流”文件系统。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接