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

Posted

技术标签:

【中文标题】如何将文件从 S3 复制到 Amazon EMR HDFS?【英文标题】:How do I copy files from S3 to Amazon EMR HDFS? 【发布时间】:2011-11-21 04:26:37 【问题描述】:

我正在通过 EMR 运行 hive, 并且需要将一些文件复制到所有 EMR 实例。

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

最好的方法是什么?

【问题讨论】:

【参考方案1】:

最好的方法是使用 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 时仍然出现一些错误。在我的情况下,我想在移动 40% 或 50% 之后移动非常大的文件(超过 300GB),它开始形成不知道为什么。有什么想法吗??【参考方案2】:

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

S3DistCp 是 DistCp 的扩展,经过优化可与 亚马逊网络服务 (AWS),尤其是亚马逊简单存储服务 (亚马逊 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-.*'

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于如何将文件从 S3 复制到 Amazon EMR HDFS?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5:如何将文件从Amazon S3复制(流)到FTP?

如何在 Amazon EMR 上将连接器添加到 presto

AWS s3 同步从 s3 复制到 EMR 很慢

如何在 Amazon EMR 上引导安装 Python 模块?

如何将 s3 数据从一个 EMR 集群读取到另一个 EMR 集群?

如何使用 boto 将文件从 Amazon S3 流式传输到 Rackspace Cloudfiles?