首页 > 解决方案 > 用于将文件从 Amazon EMR 上的 HDFS 移动到 Spark 应用程序的 Amazon S3 的任何 AWS S3 API

问题描述

我们需要将 Spark 作业(在 EMR 启动的 Hadoop 集群上运行)中的文件复制到相应的 S3 存储桶。到目前为止,我们正在使用 Hadoop FileSystem API (FileUtil.copy) 在两个不同的文件系统之间复制或移动文件。

val config = Spark.sparkContext.hadoopConfiguration    
FileUtil.copy(sourceFileSystem, sourceFile, destinationFileSystem, targetLocation, true, config)

此方法按要求工作,但效率不高。它流式传输给定文件,执行时间取决于文件大小和要复制的文件数量。

在另一个在同一个 S3 存储桶的两个文件夹之间移动文件的类似要求中,我们使用com.amazonaws.services.s3如下包的功能。

val uri1 = new AmazonS3URI(sourcePath)
val uri2 = new AmazonS3URI(targetPath)
s3Client.copyObject(uri1.getBucket, uri1.getKey, uri2.getBucket, uri2.getKey)

上面的包只有在两个 S3 位置之间复制/移动的方法。我的要求是在 HDFS(在 EMR 启动的集群上)和根 S3 存储桶之间复制文件。任何人都可以提出更好的方法或任何可用于 spark scala 的 AWS S3 api 来在 HDFS 和 S3 存储桶之间移动文件。

标签: amazon-s3amazon-ec2hdfsamazon-emr

解决方案


我们有类似的场景,我们最终使用了 S3DistCp 。

S3DistCp 是 DistCp 的扩展,经过优化可与 AWS,尤其是 S3 一起使用。您可以使用 S3DistCp 在 Amazon S3 存储桶之间或从 HDFS 复制数据到 Amazon S3。S3DistCp 在跨存储桶和跨 AWS 账户并行复制大量对象方面更具可扩展性和效率。 您可以在此处找到更多详细信息

您可以在此处参考此示例 Java 代码

希望这可以帮助 !


推荐阅读