【问题标题】:Use of spark to optimize S3 to S3 transfer使用 spark 优化 S3 到 S3 的传输
【发布时间】:2018-04-16 23:49:37
【问题描述】:

我正在学习 spark/scala 并尝试使用 scala 语言尝试以下场景。 场景:将多个文件从一个 S3 存储桶文件夹复制到另一个 S3 存储桶文件夹。

到目前为止所做的事情:
1)使用AWS S3 SDK和scala: - 从 S3 源位置创建文件列表。 - 遍历列表,传递步骤 1 中的源和目标 S3 位置,并使用 S3 API copyObject 将每个文件复制到目标位置(已配置)。 这行得通。

但是,我想了解我是否在多个文件夹中有大量文件,这是最有效的方法还是我可以使用 spark 来并行化这个文件副本?

我正在考虑的方法是:
1) 使用 S3 SDK 获取类似于上面解释的源路径
2) 使用 sc.parallelize() 为每个文件创建一个 RDD - 这些行有什么? sc.parallelize(objs.getObjectSummaries.map(_.getKey).toList) .flatMap { key => Source.fromInputStream(s3.getObject(bucket, key).getObjectContent: InputStream).getLines }
3) 我可以以某种方式使用 sc.wholeTextFiles 来完成这项工作吗? 到目前为止,我不确定如何实现这一目标。

您能否帮助我了解我的想法是否正确以及这种方法是否正确?

谢谢

【问题讨论】:

    标签: scala amazon-web-services apache-spark amazon-s3 sdk


    【解决方案1】:

    我认为 AWS 并没有让它变得复杂。

    我们遇到了同样的问题,我们在将近 10 分钟内传输了大约 2TB。

    如果你想从一个桶转移到另一个桶,最好使用内置功能在 s3 本身内转移。

    https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

    AWS CLI 命令示例:

    aws s3 同步 s3://sourcebucket s3://destinationbucket

    如果您想以编程方式执行此操作,您可以使用所有 SDK 来调用相同类型的命令。我会避免重新发明相同的轮子。

    希望对你有帮助。

    【讨论】:

    • 您好,感谢您的回复。但是,我想弄清楚是否有大量文件,可以使用 spark 来加快这个过程吗?
    • 如果您有分区数据,您可以通过这些分区并行运行这些命令来提高吞吐量。如果你的对象没有被分区,那么它没有任何意义。
    • 刚刚重新审视了这个问题。 10 分钟 2 TB 怎么样?使用同步 CLI?我从 AWS 基础设施本身获得最大 200 MBps 的速度。是 2 TB 还是 2 GB?
    • 仔细检查您到 ec2 的网络吞吐量。还要保持地区相同。在 c5n.18xlarge 上测试。
    • 好的,这会有所不同c5n。我用的是t2 micro。谢谢你的解释。
    【解决方案2】:

    我有一个代码被截断,cloudCp 它使用 spark 进行高性能并行上传;它类似于为复制做一些事情,您将在其中拖放到 AWS 库中进行该操作。

    但是:您可能不需要将工作推送到多台机器上,因为每个 PUT/x-copy-source 调用可能很慢,但它不使用任何带宽。您可以启动一个包含许多线程和大型 HTTP 客户端池的进程,然后在该进程中运行它们。获取列表,首先按最大的几个排序,然后随机洗牌其余的以减少节流效果。打印出计数器以帮助配置文件...

    【讨论】:

    • 谢谢。我会努力回来的
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2011-06-01
    • 2016-06-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多