1. 程式人生 > >通過 s5cmd 在 S3 上處理多個物件任務

通過 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 對本博文中的內容或準確性不承擔任何責任。

相關推薦

通過 s5cmdS3 處理物件任務

此開源專案來自我們的客戶社群。此專案由 Peak Games 開發,用於為其自己的 S3 工作流程提供幫助,該專案包含 Tab 補全以及支援在 S3 命令中對檔案使用內建萬用字元等諸多功能。希望您能喜歡!- Deirdré 背景 到目前為止,

spring cloud實戰與思考(二) 微服務之間通過fiegn文件1

jar 多文件 上傳文件 ret nmap spa 不同 port 問題 需求場景: 微服務之間調用接口一次性上傳多個文件。 上傳文件的同時附帶其他參數。 多個文件能有效的區分開,以便進行不同處理。   Spring cloud的微服務之間接口調用使用Feign。原裝的

通過Nginx在同一臺伺服器配置二級域名

背景:同個域名下的三個子域名各自綁定了一個專案,每個專案都在自己的tomcat裡執行,而且這三個tomcat都在同一個伺服器上。 www.portal.a.com www.blog.a.com www.backadmin.a.com 需求:都通過瀏覽器預

物件通過反射轉為Map(物件中有物件)

private static final String JAVAP = "java."; private static final String JAVADATESTR = "java.util.Date"; /** * 利用遞迴呼叫將Ob

android通過遍歷處理按鈕點選事件

如果我們有很多的按鈕都有點選事件的話,那麼單單靠switch case是很麻煩的,因為你需要在每個case後面加上一個R.id.xx。這樣的程式碼看起來不整潔也很麻煩。那麼如果我們使用遍歷的方法來處理的話就是方便許多。首先我們先來了解一下獲取控制元件id的方式:1:反射:tr

一個簡單的MapReduce示例(MapReduce任務處理

.lib exceptio apr private util sum length reat lin 一、需求   有一個列表,只有兩列:id、pro,記錄了id與pro的對應關系,但是在同一個id下,pro有可能是重復的。   現在需要寫一個程序,統計一下每個id下有

git 在一臺機器配置賬戶

rac ssh xxxxxx pla 必須 account ack entity 設置 前提: 必須知道怎樣配置git賬戶,請參考git官方教程:https://help.github.com/articles/generating-ssh-keys 這個教程能教你怎

一臺電腦配置tomcat

壓縮版 protocol proto 控制 catalina xml文件 prot red star 很多時候我們要配置多個tomcat 但是啟動時候就會好多錯誤和沖突 要麽startup的時候就把兩個tomcat全給起了。。。不好控制 下面給出解決方案 一臺電腦同

HTTP使用 multipart/form-data 字段(包括文件字節流 octet-stream)

sprintf logs pcs cer lpstr struct written all normal 自己用到的一個向服務器上傳多個字段的實例,代碼不全,僅做參考。 用的是WinINet,上傳的字段中包括文件字節流 /* PHttpRequest中自行組裝body

文件

sda str type reat doc nts else if pre targe 上傳多個文件<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8">

如何在一臺電腦安裝jdk

tput support -c win index text different ref recent Technote (FAQ) Question How to install multiple versions of Java on a workstation? C

Windows安裝MySQL實例(轉)

windows 小寫 install current -o iter 不同的 包安裝 class 在學習和開發過程中有時候會用到多個MySQL數據庫,比如Master-S

如何在同一臺機器安裝MySQL的實例(轉)

其他 搭建 如果 com 啟動mysql default vim 比喻 width   最近由於工作的需要,需要在同一臺機器上搭建兩個MySQL的實例,(註:已經存在了一個3306的MySQL的實例)。  先說下,什麽是mysql的多實例,簡單的來說就是一臺機器上安裝了多個

單機啟動elasticsearch實例

sse sysctl ofo 啟動文件 ping service sco tcp mit 使用elasticsearch的默認配置的話,一臺機器上只能啟動一個elasticsearch實例,下面是配置多實例的過程。1.環境介紹操作系統:centos7elasticsearc

AngularJs通過路由傳參解決頁面資源浪費問題

blank class resource 對象 傳參 提高 控制器 開發效率 $scope 在實際開發中會遇到很多類似模塊界面大體都一致只是極少的細節部分不一樣,這時不管是在html頁面還有js及數據交互的時候我們就沒必要因為這些不同的頁面分出不同的文件,這樣很浪費內存及效

處理請求

AR spa .get cat host weight true serve exceptio /** * 連接好多的客戶端 */ public void getManyCon(){ ServerSocket serverS

阿裏雲安裝版本庫

AI auth 技術 admin 權限 註意 開啟 更改 svn服務 1.已經在阿裏雲上成功安裝了svn服務端,但是沒有搞明白URL應用,嘗試安裝第二個版本庫。 2.進入svn目錄下 3.創建admin版本庫 4.查看是否創建成功 5.配置svn文件配置 先進入con

在同一臺機器啟動tomcat服務

技術 服務 target 們的 home default catalina server cat 一臺機器上啟動多個tomcat服務應用,能夠讓我們更好的測試下自己的分布式應用,下面簡單介紹下如何在一臺機器上開啟多個tomcat應用,其實會弄兩個,之後的多個都是一樣的了

如何在同一臺機器安裝MySQL的實例 轉

oal 源碼包 就會 端口號 tar 進程 信息 什麽 cnblogs https://www.cnblogs.com/shangzekai/p/4375271.html 最近由於工作的需要,需要在同一臺機器上搭建兩個MySQL的實例,(註:已經存在了一個3306

如何用input標簽圖片並回顯

poi 標簽設置 技術分享 chan load 記錄 input 為我 獲得 本文主要記錄如何用input標簽和jquery實現多圖片的上傳和回顯,不會涉及後端的交互,大概的效果看圖 我們從零來做一個這樣的demo 第一步: 我們先完善一下我們的頁面,默認的input-f