amazon-s3 - 用于将文件从 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 存储桶之间移动文件。
解决方案
我们有类似的场景,我们最终使用了 S3DistCp 。
S3DistCp 是 DistCp 的扩展,经过优化可与 AWS,尤其是 S3 一起使用。您可以使用 S3DistCp 在 Amazon S3 存储桶之间或从 HDFS 复制数据到 Amazon S3。S3DistCp 在跨存储桶和跨 AWS 账户并行复制大量对象方面更具可扩展性和效率。 您可以在此处找到更多详细信息。
您可以在此处参考此示例 Java 代码
希望这可以帮助 !
推荐阅读
- c++ - 在 Abaqus 中执行 c++ umat 时出错
- java - 使用 Apache Beam 中的用户会话窗口进行状态处理
- javascript - 多次触发使用效果
- excel - 选择公司时的Sharperlight问题
- python - 文字块内的链接因看似无关的原因而中断
- heroku - 在heroku中构建discord bot discord.py和错误
- docker - 如何与 Jenkins 集成或配置本地 SMTP 服务器?电子邮件扩展 Jenkins 插件
- python - 更改 Matplotlib 饼图标签的位置
- video - 通过 ffmpeg 录制摄像机流时出现问题 - 设备的 ioctl 不合适
- vue.js - Nuxt:如何获取源映射文件以及在生产环境中在哪里可以找到它们?