我在 EMR 上运行 hive,需要将一些文件复制到所有 EMR 实例。
据我了解,一种方法是将文件复制到每个节点上的本地文件系统,另一种是将文件复制到 HDFS,但是我还没有找到一种简单的方法来直接从 S3 复制到 HDFS。
解决此问题的最佳方法是什么?
最好的方法是使用 Hadoop 的 distcp 命令。示例(在集群节点之一上):
% ${HADOOP_HOME}/bin/hadoop distcp s3n://mybucket/myfile /root/myfile
这会将名为 myfile 的文件从名为 mybucket 的 S3 存储桶复制到/root/myfile
HDFS 中。请注意,此示例假定您在“本机”模式下使用 S3 文件系统;这意味着 Hadoop 将 S3 中的每个对象视为一个文件。如果您在块模式下使用 S3,则在上面的示例中将 s3n 替换为 s3。有关本机 S3 和块模式之间差异的更多信息,以及对上述示例的详细说明,请参阅http://wiki.apache.org/hadoop/AmazonS3。
我发现 distcp 是一个非常强大的工具。除了能够使用它来复制大量文件进出 S3 之外,您还可以使用大型数据集执行快速的集群到集群的复制。distcp 不是通过单个节点推送所有数据,而是使用多个节点并行执行传输。与将所有内容复制到本地文件系统作为中介的替代方案相比,这使得 distcp 在传输大量数据时要快得多。
现在亚马逊本身有一个通过 distcp 实现的包装器,即:s3distcp。
S3DistCp 是 DistCp 的扩展,经过优化可与 Amazon Web Services (AWS) 一起使用,尤其是 Amazon Simple Storage Service (Amazon 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-.*'
请注意,根据亚马逊的说法,在http://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/FileSystemConfig.html “Amazon Elastic MapReduce - 文件系统配置”中,S3 Block FileSystem 已被弃用,其 URI 前缀现在为 s3bfs: // 他们特别不鼓励使用它,因为“它会触发可能导致工作流程失败的竞争条件”。
根据同一页面,HDFS 现在是 S3 下的“一流”文件系统,尽管它是短暂的(当 Hadoop 作业结束时消失)。