【问题标题】:Any AWS S3 API to move files from HDFS on Amazon EMR to Amazon S3 from spark application用于将文件从 Amazon EMR 上的 HDFS 移动到 Spark 应用程序的 Amazon S3 的任何 AWS S3 API
【发布时间】: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


【解决方案1】:

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

S3DistCp 是 DistCp 的扩展,经过优化可与 AWS,尤其是 S3 配合使用。您可以使用 S3DistCp 在 Amazon S3 存储桶之间或从 HDFS 复制数据到 Amazon S3。 S3DistCp 在跨存储桶和跨 AWS 账户并行复制大量对象方面更具可扩展性和效率。 You can find more details here.

您可以参考此示例 java 代码以获取相同的 here

希望这会有所帮助!

【讨论】:

  • 感谢您的回答。就我而言,HDFS 不是外部集群,而是由 EMR 进程启动以运行 spark 应用程序。一旦 spark 应用程序完成,集群将被终止并且无法以任何方式访问。您能否建议是否有任何 API 以便可以在 Java/Scala 中使用 S3DistCp 而不是 CLI 命令。再次感谢!
  • 可以参考这段java代码。 stackoverflow.com/a/45962117/9020698
猜你喜欢
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2015-10-03
  • 2016-08-10
  • 1970-01-01
  • 2015-12-10
相关资源
最近更新 更多