写点什么

OpenSource,通过 s5cmd 在 S3 上处理多个对象任务

2019 年 10 月 24 日

OpenSource,通过 s5cmd 在 S3 上处理多个对象任务

此开源项目来自我们的客户社区。此项目由 Peak Games 开发,用于为其自己的 S3 工作流程提供帮助,该项目包含 Tab 补全以及支持在 S3 命令中对文件使用内置通配符等诸多功能。希望您能喜欢!- Deirdré




背景

到目前为止,通过命令行在 Amazon S3 上处理多个对象意味着,使用可提供一定支持的工具调用多个命令或者使用通配符。每次命令调用都相当于在系统级别执行了另一次 fork/exec,当您需要运行几百项或更多的操作时,其开销会累加。


工具

通过 s5cmd,调用一个可执行文件便可运行多个操作 (使用/不使用通配符)。例如,如果您必须删除 (或复制) 几百万个对象,则无需几百万次地调用 CLI 工具。通过将命令发送到 s5cmd,您只需调用该工具一次,然后让其运行几百个工作线程来执行给定的工作。由于 s5cmd 已经有工作线程池,因此可以将一个工作线程用于 ListObjects 调用 (可以匹配更多通配符) 来完成通配符操作,然后让其他工作线程执行实际处理操作。它还支持自动补齐 bash 和 zsh 的 shell,因此,如果您想将其用作较为常用的 CLI 工具,可以仅单击 TAB 键,让其自动为您补齐选项、存储桶以及路径/对象。


安装

在 Mac OS X 上安装 s5cmd:


$ brew tap peakgames/s5cmd https://github.com/peakgames/s5cmd$ brew install s5cmd
复制代码


该工具使用 Go 编写,其他平台可以使用以下命令对其进行编译和安装:


$ go get -u github.com/peakgames/s5cmd
复制代码


像使用 awscli 工具时那样设置凭证:使用 ~/.aws/credentials 文件和/或环境变量。(如果在 EC2 上运行,还支持角色。)


使用

命令采用“command [command options] argument1 [argument2]”格式。s5cmd 也会采用选项,这会影响运行的所有命令。要获取 s5cmd 选项列表,请运行以下命令:


$ s5cmd -help
复制代码


要获取可用命令列表,请在不指定任何参数的情况运行:


$ s5cmd
复制代码


s5cmd 实际应用

假设有一个名为“reports-bkt”的存储桶,其内部有一些文件。首先,我们下载一个文件:


$ s5cmd get s3://reports-bkt/a/2018/03/14/reports_19_13716285583145.csv.gz                     # Downloading reports_19_13716285583145.csv.gz...2018/03/21 11:46:05 +OK "get s3://reports-bkt/a/2018/03/14/reports_19_13716285583145.csv.gz ./reports_19_13716285583145.csv.gz"
复制代码



现在,我们扫描上个月的所有 CSV 报告,并用通配符匹配每天的报告:


$ s5cmd du -g -h s3://reports-bkt/a/2018/02/*/reports*csv.gz                            + 10.7M bytes in 367 objects: s3://reports-bkt/a/2018/02/*/reports*csv.gz [STANDARD]2018/03/21 11:46:24 +OK "du s3://reports-bkt/a/2018/02/*/reports*csv.gz" (1)
复制代码


上个月有 367 份报告,占用了大约 10MB 的空间,所有报告均使用标准存储。我们将其全部下载下来:


$ s5cmd cp --parents s3://reports-bkt/a/2018/02/*/reports*csv.gz .
复制代码



使用 --parents 选项,上个月每天的报告将下载到其自己的目录下。(此选项会从指定的第一个通配符开始创建目录结构。)上述示例只是冰山一角。另一种选项是使用文件或其他命令的输出来发送命令。您可能已经发现,我们的存储桶采用常见的“字母前缀”模式。假设您要下载给定日期的所有文件用于所有前缀。结构如下所示:


- a/[yyyy]/[mm]/[dd]/object_unique_id.gz- b/[yyyy]/[mm]/[dd]/object_unique_id.gz- c/[yyyy]/[mm]/[dd]/object_unique_id.gz... up to ...- z/[yyyy]/[mm]/[dd]/object_unique_id.gz
复制代码


如果您有几百天时间和几十亿个对象,在第一级指定通配符实际上不起作用。由于您已经知道范围 (字母 a 到 z),您可以为每个前缀生成命令。仅调用该工具一次,然后让它完成工作。试试:


$ for X in {a..z}; do echo get -n s3://reports-bkt/${X}/2018/03/14/reports*csv.gz; done | s5cmd -f -2018/03/21 11:48:03 # Stats: Total             379 281 ops/sec 1.350311978s
复制代码



第一个命令将生成大量“get”命令,然后将这些命令传递到 s5cmd 完成工作。请注意,我们使用了“-n”(no-clobber) 选项,以防在对象名称并不真正唯一的情况下出现改写。我们不能使用 --parents 选项,因为通配符不在目录名称中。您可以查看 stat 计数器来了解完成的操作数目 (以及所用的时间)。


投稿

欢迎大家为该项目献言献策,所有来稿均使用 github.com/peakgames/s5cmd 处的问题跟踪器进行管理。如果您要提交 PR,我们建议您先提出问题,以便与团队进行讨论。




本客座博文来自 Peak Games,该公司使用 S3 作为将数据转化成知识的综合管道的一部分,从而进一步改善其世界一流的手机游戏的用户体验。本博文中的内容和观点均源自第三方作者,AWS 对本博文中的内容或准确性不承担任何责任。


!


Deirdré Straughan


作者介绍:


Deirdré Straughan


Deirdré 她 30 年间一直在沟通技术并帮助其他人这样做了。 迄今为止她已经写作了一本书,正在编辑两本新书,制作和交付技术培训,制作了数百个视频和技术讲座直播; 写作,编辑和管理博客,以及管理各项活动。 自 2010 年以来,她一直将这一技能应用于云计算,并在更长的时间内应用于开源。 她于 2017 年 6 月加入 AWS,担任 AWS 开源团队的内容负责人。 你可以在 Twitter @deirdres 上找到她。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/parallelizing-s3-workloads-with-s5cmd/


2019 年 10 月 24 日 08:00207

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布
暂无评论
发现更多内容

架构师训练营第4周总结

aoeiuvzcs

程序员的晚餐 | 7 月 3 日 好久没做饭

清远

美食

分布式缓存

Arthur

阿里技术官:这样带你学Spring全家桶,其实没你想的那么难

小吴选手

spring Spring Cloud Spring Boot

高承实:区块链在新基建中的作用和未来发展

CECBC区块链专委会

新基建 政策扶持 技术特征 链上数据 产业场景

一个简单的技术选型心得

i风语

Java 架构

Redis系列(五):你要的Redis集群搭建来了,实践与否你自己选!

z小赵

Java redis 分布式 高并发

深入理解编译优化之循环展开和粗化锁

程序那些事

JIT 编译优化 循环展开 粗化锁

Week5命题作业

星河寒水

极客大学架构师训练营

锦囊篇|一文摸懂SharedPreferences和MMKV(二)

ClericYi

猿灯塔:疫情冲击,去体验远程面试被怼10分钟,今年Java开发找工作真难

猿灯塔

逆袭之路,普通二本的八年开发码农如何进阿里拿年薪百万

小谈

Java 面试

为什么我建议你读一读历史?

Phoenix

历史 中国历史

ARTS Week6

时之虫

ARTS 打卡计划

第四周

仪轩

Android架构组件-App架构指南,你还不收藏嘛

小吴选手

架构 架构师 架构总结 架构要素 P7架构师

18个Java8日期处理的实践,太有用了建议收藏

码哥小胖

MySQL SQL语法 sql查询

六月我在工作中蜕变,勤奋小人打架终于赢了

程序员小跃

效率工具 加班 沟通 复盘

农产品电商平台的S曲线分析

石云升

增长 S型曲线 破局点

为什么建议项目中统一线程池类?

张挺

Redis分布式锁课堂开课了!

小闫

redis Spring Cloud Redis项目

java架构-一些设计上的基本常识

猿灯塔

Java

太牛 了!快码住!GitHub上标星75k!超牛的《Java面试突击版》

犬来八荒

Java git Linux 面试 Java 面试

我是如何解决邮件焦虑的

vinkyqy

效率 职场 邮件

面试细节: i = i++和 i = ++i

Java小咖秀

JVM Java 面试 经验分享

游戏夜读 | 互动剧的黎明到了?

game1night

Go: 字符串和转换优化

陈思敏捷

go golang string 字符串

简直了!顶级架构师分享心得,如何在项目中兼容多种数据库

犬来八荒

Java MySQL 数据库 面试

马匹、马镫、马车,和华为的数据基础设施革新

脑极体

向女朋友解释乐观锁与悲观锁的小妙招!

小闫

spring 面试 Spring Cloud 乐观锁 悲观锁

理解 Mysql 索引底层原理只需这一篇就够了

小谈

MySQL 数据结构 Spring Cloud Spring Boot Java 面试

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

OpenSource,通过 s5cmd 在 S3 上处理多个对象任务-InfoQ