如何将文件从 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
如何在 Amazon EMR 上引导安装 Python 模块?