搭配大數據使用 Cloud Storage

Cloud Storage 是在 Google Cloud Platform 上儲存和使用大數據的重要部分。範例包含:

  • 載入資料到 BigQuery。

  • 使用 Cloud Dataproc 自動安裝與 HDFS 相容的 Cloud Storage 連接器,讓您可以同時使用 Cloud Storage 值區和 HDFS。

  • 使用值區,以保存 Cloud Dataflow 管道的暫存檔案和暫存資料。

對於 Cloud Dataflow,必須使用 Cloud Storage 值區。對 BigQuery 和 Cloud Dataproc 而言,使用 Cloud Storage 值區並非必要,但建議您使用。

gsutil 是一種指令列工具,可讓您輕鬆穩當地使用 Cloud Storage 值區和物件,特別是用於大數據。例如,使用 gsutil,您可以使用單一指令平行複製許多檔案、有效率複製大型檔案、計算資料的總和檢查碼,以及測量本機電腦到 Cloud Storage 的效能。

本頁的重點在於如何使用 gsutil 執行大數據工作。如需 gsutil 的簡單說明,請參閱快速入門:使用 gsutil 工具。 所有 gsutil 指令的詳細說明文件均提供線上版本,您也可以執行 gsutil help 以參閱內建說明。

若要充分利用本頁所顯示的範例,您需要:

將許多檔案複製到值區

如果要上傳的檔案數量很多,可以使用 gsutil -m 選項執行平行(多執行緒/多重處理)複製。若要以遞迴方式複製子目錄,請使用 cp 指令的 -R 旗標。舉例來說,如要將包含子目錄的檔案從本機目錄 top-level-dir 複製到值區,您可以使用:

gsutil -m cp -R top-level-dir gs://example-bucket

您可以使用萬用字元來比對作業的一組特定名稱。例如,若只要複製開頭為 image 的檔案:

gsutil -m cp -R top-level-dir/subdir/image* gs://example-bucket

您可以使用相同的萬用字元移除檔案:

gsutil -m rm gs://example-bucket/top-level-dir/subdir/image*

除了將本機檔案複製到雲端,或將雲端檔案複製到本機,您也可以在雲端中複製檔案,例如:

gsutil -m cp gs://example-bucket/top-level-dir/subdir/** gs://example-bucket/top-level-dir/subdir/subdir2

gsutil 會自動偵測您正在移動多個檔案,並在新目錄 subdir2 中建立這些檔案。

同步處理本機目錄

如果您要將本機目錄同步到值區,或將值區同步到本機目錄,可以使用 gsutil rsync 指令。例如,若要讓 gs://example-bucket 符合 local-dir 本機目錄的內容,您可以使用:

gsutil -m rsync -r local-dir gs://example-bucket

如果您使用 rsync -d 旗標,則會通知 gsutil 在目的地 (上述指令中的 gs://example-bucket) 刪除來源 (local-dir) 中不存在的檔案。您也可以在兩個值區之間進行同步。

將大型檔案複製到值區

一般來說,處理大數據時,只要資料在雲端中,就應該留在雲端。若您將資料放在 Google 的雲端,就可以將資料很快地移轉到其他服務,如 Compute Engine 等。此外,從值區輸出到相同位置或子位置的 Google Cloud 服務是免費的。詳情請參閱網路定價

若要將大型本機檔案複製到值區,請使用:

gsutil cp local-file gs://example-bucket

要複製現有值區中的大型檔案 (例如,Cloud Storage 公開資料),請使用:

gsutil cp gs://example-source-bucket/file  gs://example-destination-bucket

gsutil 可充分利用 Google Cloud Storage 的可續傳上傳和下載功能。對大型檔案而言,此功能格外重要,因為 ISP 網路故障的可能性會隨著移轉資料的大小而增加。依據伺服器實際接收的位元組續傳上傳資料,gsutil 就不需要重新傳送位元組,並可確保上傳作業最終一定能完成。同樣的邏輯也適用於以本機檔案大小為基礎的下載作業。

如果 gsutil cp 無法提供上傳大型檔案所需的效能,您可以考慮設定複合式上傳

設定值區

設定值區常見的大數據工作包括將資料移動到不同的儲存空間級別、設定記錄存取權、設定物件版本管理或設定生命週期規則

您可以使用 gsutil ls -L -b 列出值區的設定詳細資料:

gsutil ls -L -b gs://example-bucket

請在輸出中注意值區設定資訊,其中大部分資訊也可以透過 gsutil 設定:

  • CORS:控制值區的跨源資源共享設定。
  • 記錄:允許您記錄值區使用情況。
  • 網站:允許值區中的物件做為網頁使用,或用做網站中的靜態資產。
  • 版本管理:刪除值區中的物件以建立封存版本。
  • 儲存空間級別:可讓您在建立值區期間設定儲存空間級別。
  • 生命週期:允許在值區中執行定期作業 - 最常見的作業是刪除過時物件。

例如,假設您只想將檔案保存在特定值區中一天,則可以使用下列指令設定值區的生命週期規則:

echo '{ "rule": [{ "action": {"type": "Delete"}, "condition": {"age": 1}}]}' > lifecycle_config.json
gsutil lifecycle set lifecycle_config.json gs://example-bucket

現在,系統會自動刪除在這個值區中存在時間超過一天的物件。您可以使用 gsutil lifecycle 指令驗證剛剛設定的配置 (其他設定指令也是以類似的方式運作):

gsutil lifecycle get gs://example-bucket

共享值區中的資料

使用大數據時,您可能需要合作處理檔案,因此您要能將存取權授予特定使用者或群組。 每個物件都有一份 ACL,說明具有存取權的使用者。 您可以使用 gsutil acl 指令,輕鬆檢視物件的 ACL:

gsutil acl get gs://example-bucket/file

上傳物件的實體 (在此情況下是以 OAuth2 更新憑證代表的 Google 帳戶) 會自動取得物件的擁有者存取權 (請參閱專案成員與權限)。

物件 ACL 的其餘部分是由值區中的預設物件 ACL 決定。這是容易混淆的地方:值區 ACL 控制值區的存取權 (例如,建立和列出物件的能力),而預設物件 ACL 控制物件在建立時所取得的 ACL;兩者不一定相同!如要進一步瞭解這兩者之間的差異,請參閱存取權控管

您可以設定值區,使擁有 Google 帳戶的使用者都可以列出值區中的檔案。請注意,這不會讓使用者存取資料。所以,雖然使用者可以看到值區中有 bigfile,但看不到其內容。

gsutil acl ch -g 'AllAuthenticatedUsers:R' gs://example-bucket

您可以使用 ls -Lb 指令檢視值區的 ACL:

gsutil ls -Lb gs://example-bucket

現在,透過 Google 帳戶驗證的使用者都可以列出值區中的檔案。

以下三節說明三種常見情境:公開分享資料、與群組分享資料及與個人分享資料。

公開

若為可公開讀取的值區,您可以設定:

# Read access on the bucket so that is contents can be listed
gsutil acl ch -g AllUsers:R gs://example-bucket

# Default bucket ACL so any new objects added at a later date are readable.
gsutil defacl ch -g AllUsers:R gs://example-bucket

# Read access to all of its current contents.
gsutil -m acl ch -R -g AllUsers:R gs://example-bucket

與群組分享

若協作者不是 Google Cloud Platform 專案的成員,建議您建立 Google 網路論壇,然後將 Google 網路論壇加入值區。例如,若為 gs-announce Google 網路論壇,您可以設定:

# Read access to the bucket so that its contents can be listed.
gsutil acl ch -g 'gs-announce@googlegroups.com:R' gs://example-bucket

# Default bucket ACL so any new objects added at a later date are readable.
gsutil defacl ch -g 'gs-announce@googlegroups.com:R' gs://example-bucket

# Read access to all of a bucket's current contents.
gsutil -m acl ch -R -g 'gs-announce@googlegroups.com:R' gs://example-bucket

詳情請參閱使用群組控制物件的存取權

與個人分享

若有許多協同者,請使用群組。若為個人,您可以依照下列方式設定存取權:

# Read access to the bucket so that its contents can be listed.
gsutil acl ch -u liz@gmail.com:R gs://example-bucket

# Default bucket ACL so any new objects added at a later date are readable.
gsutil defacl ch -u liz@gmail.com:R gs://example-bucket

# Read access to all of a bucket's current contents.
gsutil -m acl ch -R -u liz@gmail.com:R gs://example-bucket

顯示值區中的資料量

您可以使用 gsutil du 指令來顯示指定值區中所有物件使用的總空間。例如:

gsutil du -sh gs://example-bucket

如需瞭解您可以使用的更多選項,請參閱 gsutil du 指令說明,包括如何傳回某前置字元下所有物件的大小。

您也可以設定值區記錄,系統會每天一次自動報告值區大小。詳情請參閱存取記錄。如果值區中的物件數量很多 (例如,數十萬或數百萬),這能更有效的追蹤空間用量。gsutil du 指令是透過發出值區列出要求來計算空間用量。若是大型值區,此程序需要很長的時間。

您可以使用下列指令計算值區中的檔案數:

gsutil ls gs://example-bucket/** | wc -l

清理值區

您可以使用下列指令快速清理值區:

gsutil -m rm gs://example-bucket/**

使用總和檢查碼

執行複製作業時,gsutil cpgsutil rsync 指令會驗證來源檔案的總和檢查碼是否與目的地檔案的總和檢查碼相符。在總和檢查碼不相符的極少數情況下,gsutil 會刪除無效複本並輸出警告訊息。詳情請參閱總和檢查碼驗證

您也可以使用 gsutil 以取得值區中檔案的總和檢查碼,或計算本機物件的總和檢查碼。例如,假設您使用下列指令,將 Cloud Life Sciences 公開資料檔案複製到工作值區:

gsutil -m cp gs://genomics-public-data/1000-genomes/vcf/ALL.chrMT.phase1_samtools_si.20101123.snps.low_coverage.genotypes.vcf gs://example-bucket

現在,您可以取得檔案的公開值區版本的總和檢查碼和您值區中的檔案版本的總和檢查碼,確認兩者是否相符:

gsutil ls -L gs://example-bucket/ALL.chrMT.phase1_samtools_si.20101123.snps.low_coverage.genotypes.vcf
gsutil ls -L gs://genomics-public-data/1000-genomes/vcf/ALL.chrMT.phase1_samtools_si.20101123.snps.low_coverage.genotypes.vcf

現在,假設您的資料是在本機資料中心的檔案中,且您將該資料複製到 Cloud Storage。您可以使用 gsutil hash 獲取本機檔案的總和檢查碼,然後將其與複製到值區中的檔案的總和檢查碼進行比較。若要取得本機檔案的總和檢查碼,請使用下列指令:

gsutil hash local-file

MD5 值

針對非複合物件,對值區中的物件執行 gsutil ls -L 會傳回類似下方的輸出:

gs://example-bucket/100MBfile.txt:
        Creation time:          Thu, 26 Mar 2015 20:11:51 GMT
        Content-Length:         102400000
        Content-Type:           text/plain
        Hash (crc32c):          FTiauw==
        Hash (md5):             daHmCObxxQdY9P7lp9jj0A==
        ETag:                   CPjo7ILqxsQCEAE=
        Generation:             1427400711419000
        Metageneration:         1
        ACL:            [
        ....

在本機檔案上執行 gsutil hash 會傳回如下輸出:

Hashing     100MBfile.txt:
Hashes [base64] for 100MBfile.txt:
        Hash (crc32c):          FTiauw==
        Hash (md5):             daHmCObxxQdY9P7lp9jj0A==

這兩個輸出都有 CRC32c 和 MD5 值。以複合物件上傳的物件沒有 MD5 值,就像您為 gsutil 設定複合式上傳一樣。

設定平行複合式上傳

若要提升上傳大型檔案時的效能,請設定 gsutil 將每個檔案拆成幾部分以上傳檔案、平行上傳這些部分,然後使用 Cloud Storage 的複合物件功能,將這些部分重新組合成複合物件。詳情請參閱平行複合式上傳。 平行複合式上傳功能預設為停用。

設定平行複合式上傳之前,您應瞭解此功能的優缺點。主要優點是大型檔案的上傳速度會大幅加快,只要網路和磁碟速度不是限制因素。平行複合式上傳的缺點為:

  • 當您 (或您的協作者) 使用 gsutil 下載複合上傳資料 (例如使用 gsutil 平行複合式上傳功能建立的資料) 時,我們強烈建議安裝經過編譯的 crcmod,如 gsutil help crcmod 所述。如果未安裝,則會出現一則警告訊息,指出不使用經過編譯的 crcmod 下載複合物件會讓執行速度非常緩慢。請注意,我們建議使用經過編譯的 crcmod 執行下載作業,不論您是否啟用了平行複合式上傳選項。

  • 值區中的複合物件沒有 MD5 雜湊

按照 gsutil help crcmod 中的步驟設定並編譯 crcmod 後,請設定 .boto 檔案,讓平行複合式上傳選項預設為啟用。詳情請參閱 gsutil config,尤其是 .boto 檔案中 GSUtil 區段的 parallel_composite_upload_* 設定。

如果您已啟用平行複合式上傳功能,並將一個大型檔案上傳至值區,您會發現檔案是以 50 MB 為單位的區塊上傳,而非以單一檔案上傳。如果發生失敗,例如因為發生暫時性網路問題,您可以使用 no-clobber (-n) 旗標重新執行複本,以便只傳送遺漏的檔案。

請記住,檢查值區中以複合物件上傳的檔案的資料完整性時,只有 CRC32c 雜湊值,沒有 MD5 值。

如果您設定了平行複合式上傳,可能會有因中止上傳而留下來的暫存檔案。如果您不想續傳,可以刪除這些暫存檔案:

gsutil -m rm gs://example-bucket/**/gsutil/tmp/parallel_composite_uploads/for_details_see/gsutil_help_cp**
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Storage
需要協助嗎?請前往我們的支援網頁