我正在学习spark/scala,并尝试使用scala语言尝试下面的场景。场景:从一个S3存储桶文件夹复制多个文件到另一个S3存储桶文件夹。
到目前为止所做的事情:
1)使用亚马逊网络服务S3开发工具包和scala:-从S3源位置创建文件列表。-遍历列表,传递步骤1中的源和目标S3位置,并使用S3接口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来实现这一点吗?到目前为止,我不确定如何实现这一点。
你能帮助我理解我是否在思考正确的方向,以及这种方法是否正确?
谢谢
发布于 2018-04-16 03:12:45
不过,我认为AWS并没有让事情变得复杂。
我们也有同样的问题,我们在10分钟内传输了大约2TB的数据。
如果您想从一个存储桶传输到另一个存储桶,最好在s3内部使用内置功能进行传输。
https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
AWS CLI命令示例:
aws s3同步s3://源存储桶s3://目标存储桶
如果你想以编程的方式完成,你可以使用所有的SDK来调用相同类型的命令。我会避免重复发明同样的轮子。
希望能有所帮助。
发布于 2018-04-16 23:49:37
我有一个代码片段,cloudCp,它使用spark进行高性能的并行上传;它类似于为copy做一些事情,在那里你可以将该操作放到AWS lib中。
但是:您可能不需要将工作推送到许多机器上,因为每个PUT/x-copy-source调用都可能很慢,但它不会占用任何带宽。您可以启动一个具有许多线程的进程&一个大型HTTP客户端池,然后在该进程中运行所有线程。获取列表,首先按最大的几个排序,然后随机打乱其余的,以减少节流效应。打印计数器以帮助分析...
https://stackoverflow.com/questions/49843855
复制相似问题