Amazon s3 用于将文件从Amazon EMR上的HDFS移动到spark应用程序中的Amazon S3的任何AWS S3 API

Amazon s3 用于将文件从Amazon EMR上的HDFS移动到spark应用程序中的Amazon S3的任何AWS S3 API,amazon-s3,amazon-ec2,hdfs,amazon-emr,Amazon S3,Amazon Ec2,Hdfs,Amazon Emr,我们需要将Spark作业中的文件(运行在由EMR提供的Hadoop集群上)复制到相应的S3存储桶中。 到目前为止,我们正在使用Hadoop文件系统API(FileUtil.copy)在两个不同的文件系统之间复制或移动文件 val config = Spark.sparkContext.hadoopConfiguration FileUtil.copy(sourceFileSystem, sourceFile, destinationFileSystem, targetLocation,

我们需要将Spark作业中的文件(运行在由EMR提供的Hadoop集群上)复制到相应的S3存储桶中。 到目前为止,我们正在使用Hadoop文件系统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 bucket之间复制文件。
有人能推荐一种更好的方法或任何AWS S3 api,用于spark scala中在HDFS和S3 bucket之间移动文件。

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

S3DistCp是DistCp的一个扩展,优化后可用于AWS,尤其是S3。您可以使用S3DistCp在Amazon S3存储桶之间复制数据,或从HDF复制到Amazon S3。S3DistCp在跨存储桶和AWS帐户并行复制大量对象方面具有更高的可扩展性和效率。

您可以参考此示例java代码以了解相同的信息


希望这有帮助

你可以使用很多。只要您使用的cli配置文件具有正确的权限,就可以运行aws cli
aws s3 cp./my source file s3://my bucket
,将本地文件复制到bucket。您只需包含一个shell脚本,该脚本接收所需的变量并从scala运行即可。谢谢您的回复。我编辑了这个问题,以便更好地表达我的观点。我无法使用cli,因为我正在执行的移动是spark应用程序的一部分,需要在终止应用程序之前完成。感谢您的回答。在我的例子中,HDFS不是一个外部集群,而是通过一个EMR进程来运行spark应用程序。spark应用程序完成后,群集将终止,并且无法以任何方式访问。您是否可以建议是否有API,以便在Java/Scala中使用S3DistCp而不是CLI命令。再次感谢!您可以参考此java代码。