【发布时间】:2019-12-05 00:25:50
【问题描述】:
我们需要将 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 存储桶之间复制文件。 任何人都可以提出更好的方法或任何 AWS S3 api 可用于 spark scala 在 HDFS 和 S3 存储桶之间移动文件。
【问题讨论】:
-
您可以使用很多。只要您使用的 cli 配置文件具有正确的权限,您就可以运行 aws cli
aws s3 cp ./my-source-file s3://my-bucket将本地文件复制到存储桶。您可以只包含一个 shell 脚本,该脚本接受所需的变量并从 scala 运行它。 -
感谢您的回复。我编辑了问题以更好地表达我的问题。我无法使用 cli,因为我正在执行的操作是 spark 应用程序的一部分,需要在终止应用程序之前完成。
标签: amazon-s3 amazon-ec2 hdfs amazon-emr