Cloud Storage 是在Google Cloud上儲存及處理大數據的關鍵環節。舉例來說,您可以使用 Cloud Storage 將資料載入 BigQuery、保留 Dataflow 管道的暫存檔案和臨時資料,以及與 Managed Service for Apache Spark 整合,以便直接對 Cloud Storage 中的資料執行 Apache Hadoop 或 Apache Spark 工作。
本頁面說明如何使用 gcloud 指令列工具完成大數據工作,例如複製大型檔案或同時複製多個檔案。如要瞭解 gcloud 簡介,請參閱 gcloud 快速入門導覽課程。
事前準備
如要充分運用這個頁面顯示的範例,請完成下列步驟 (如果尚未完成):
將許多檔案複製到值區
cp 指令會視需要自動執行平行 (多執行緒/多處理) 複製作業,有效率地上傳大量檔案。如要以遞迴方式複製子目錄,請在指令中使用 --recursive 旗標。舉例來說,如要將名為 top-level-dir 的本機目錄中的檔案 (包括子目錄) 複製到 bucket,可以使用:
gcloud storage cp top-level-dir gs://example-bucket --recursive
您可以使用萬用字元比對作業的特定名稱組合。舉例來說,如要只複製開頭為 image 的檔案,請輸入:
gcloud storage cp top-level-dir/subdir/image* gs://example-bucket --recursive
您可以使用相同的萬用字元移除檔案:
gcloud storage rm gs://example-bucket/top-level-dir/subdir/image*
除了將本機檔案複製到雲端,或將雲端檔案複製到本機,您也可以在雲端中複製檔案,例如:
gcloud storage cp gs://example-bucket/top-level-dir/subdir/** gs://example-bucket/top-level-dir/subdir/subdir2
gcloud storage 會自動偵測到您正在移動多個檔案,並在名為 subdir2 的新目錄中建立這些檔案。
同步處理本機目錄
如果您要將本機目錄同步到值區,或將值區同步到本機目錄,可以使用 gcloud storage rsync 指令。例如,若要讓 gs://example-bucket 符合 local-dir 本機目錄的內容,您可以使用:
gcloud storage rsync local-dir gs://example-bucket --recursive
如果使用 --delete-unmatched-destination-objects 旗標,指令會刪除目的地 (上述指令中的 gs://example-bucket) 存在,但來源 (local-dir) 沒有的檔案。您也可以在兩個 bucket 之間同步處理。
將大型檔案複製到值區
一般來說,處理大數據時,資料一旦進入雲端,就應該留在雲端。資料進入 Google Cloud後,就能快速轉移至相同位置的其他服務,例如 Compute Engine。
如要將大型本機檔案複製到 bucket,請使用:
gcloud storage cp local-file gs://example-bucket
如要從現有 bucket 複製大型檔案,請使用:
gcloud storage cp gs://example-source-bucket/file gs://example-destination-bucket
gcloud storage 充分運用 Cloud Storage 支援續傳的上傳作業和下載功能。對大型檔案而言,此功能格外重要,因為 ISP 網路故障的可能性會隨著移轉資料的大小而增加。gcloud storage 會根據伺服器「實際收到」的位元組數繼續上傳,避免不必要地重新傳送位元組,並確保上傳作業最終能完成。同樣的邏輯也適用於以本機檔案大小為基礎的下載作業。
設定 bucket
您可能需要設定 bucket 的典型大數據工作,包括將資料移至不同的儲存空間級別、設定物件版本管理,或設定生命週期規則。
您可以使用 buckets describe 列出 bucket 的設定詳細資料:
gcloud storage buckets describe gs://example-bucket
在輸出內容中,請注意 bucket 設定資訊,其中大部分也可以透過 gcloud storage 設定:
- CORS:控制 bucket 的跨源資源共享設定。
- 網站:允許值區中的物件做為網頁使用,或用做網站中的靜態資產。
- 版本管理:刪除 bucket 中的物件,建立非現行版本。
- 儲存空間級別:可在建立 bucket 時設定儲存空間級別。
- 生命週期:允許在值區中執行定期作業 - 最常見的作業是刪除過時物件。
例如,假設您只想將檔案保存在特定值區中一天,則可以使用下列指令設定值區的生命週期規則:
echo '{ "rule": [{ "action": {"type": "Delete"}, "condition": {"age": 1}}]}' > lifecycle_config.json
gcloud storage buckets update gs://example-bucket --lifecycle-file=lifecycle_config.json
現在,系統會自動刪除在這個值區中存在時間超過一天的物件。您可以使用 buckets describe 指令驗證剛剛設定的配置 (其他設定指令也是以類似的方式運作):
gcloud storage buckets describe gs://example-bucket
分享值區中的資料
使用大數據時,您可能需要合作處理檔案,因此您要能將存取權授予特定使用者或群組。
身分與存取權管理政策會定義哪些使用者可以存取檔案,以及允許他們執行的操作。您可以使用 buckets get-iam-policy 指令查看 bucket 的 IAM 政策:
gcloud storage buckets get-iam-policy gs://example-bucket
指令的回應會顯示「主體」(有權存取 bucket 的帳戶) 和「角色」(授予主體的權限群組)。
分享資料的三種常見情境包括公開分享、與群組分享,以及與特定使用者分享:
公開共用:如果 bucket 的內容可供網際網路上的任何人列出及讀取,您可以使用「AllUsers」指定項目設定 IAM 政策:
gcloud storage buckets add-iam-policy-binding gs://example-bucket --member=allUsers --role=roles/storage.objectViewer
與群組共用:如果協作者無法存取其他 Google Cloud 資源,建議您建立 Google 群組,然後將 Google 群組新增至 bucket。舉例來說,如要授予
my-groupGoogle 群組存取權,您可以設定下列 IAM 政策:gcloud storage buckets add-iam-policy-binding gs://example-bucket --member=group:my-group@googlegroups.com --role=roles/storage.objectViewer
詳情請參閱使用群組控制物件的存取權。
與一人共用:如要與多位協作者共用,請使用群組大量授予存取權。如要授予某位使用者讀取權限,請按照下列步驟操作:
gcloud storage buckets add-iam-policy-binding gs://example-bucket --member=user:jeffersonloveshiking@gmail.com --role=roles/storage.objectViewer
清理 bucket
您可以使用下列指令快速清理值區:
gcloud storage rm gs://example-bucket/ --recursive
使用總和檢查碼
執行複製作業時,gcloud storage cp 和 gcloud storage rsync 指令會驗證來源檔案的核對和是否與目的地檔案的核對和相符。如果總和檢查碼不相符 (極少發生),
gcloud storage 會刪除無效副本並列印警告訊息。詳情請參閱「核對和驗證」。
您可以使用 gcloud storage 取得 bucket 中物件的核對和。舉例來說,假設您使用下列指令,將 Landsat 公開資料物件複製到工作 bucket:
gcloud storage cp gs://gcp-public-data-landsat/LC08/01/001/003/LC08_L1GT_001003_20140812_20170420_01_T2/LC08_L1GT_001003_20140812_20170420_01_T2_B3.TIF gs://example-bucket
現在,您可以取得檔案的公開值區版本的總和檢查碼和您值區中的檔案版本的總和檢查碼,確認兩者是否相符:
gcloud storage objects describe gs://example-bucket/LC08_L1GT_001003_20140812_20170420_01_T2_B3.TIF
gcloud storage objects describe gs://gcp-public-data-landsat/LC08/01/001/003/LC08_L1GT_001003_20140812_20170420_01_T2/LC08_L1GT_001003_20140812_20170420_01_T2_B3.TIF
您也可以使用 gcloud storage 計算本機檔案的核對和。舉例來說,假設您的資料位於本機資料中心的檔案中,而您將資料複製到 Cloud Storage。您可以使用 gcloud storage hash 取得本機檔案的核對和,然後與複製到 bucket 的檔案核對和進行比較。如要取得本機檔案的核對和,請使用:
gcloud storage hash local-file
MD5 值
對於非複合物件,在值區中的物件上執行 gcloud storage objects describe 會傳回類似下列內容的輸出內容:
bucket: example-bucket contentType: text/plain crc32c: FTiauw== customTime: '1970-01-01T00:00:00+00:00' etag: CPjo7ILqxsQCEAE= generation: '1629833823159214' id: example-bucket/100MBfile.txt/1629833823159214 kind: storage#object md5Hash: daHmCObxxQdY9P7lp9jj0A== ...
在本機檔案上執行 gcloud storage hash 會傳回如下輸出:
--- crc32c_hash: IJfuvg== digest_format: base64 md5_hash: +bqpwgYMTRn0kWmp5HXRMw== url: file.txt
這兩個輸出都有 CRC32c 和 MD5 值。複合物件 (例如透過平行複合上傳建立的物件) 沒有 MD5 值。