2013年5月24日金曜日

31.Google Cloud Storageに大量データをアップロードする際のテクニック(Google I/O 2013)

このエントリーをはてなブックマークに追加



Ryo Yamasaki(@vierjp)です。

Google I/Oで聞いた「Importing Large Data Sets into Google Cloud Storage」のセッションについて、
動画を見て復習したのでメモを公開。
(動画も上記URLにあります)


◯Small to medium imports

gsutilを使った小〜中規模のアップロード方法
*「gsutil」はGoogle Cloud Storageを扱うためのCUIのツールです。

・ディレクトリ構造
[Directory]
├data
|├data1.csv
|├data2.csv
|├data3.csv
|└data4.csv
└data.csv

・カレントディレクトリのファイルをUploadする
gsutil cp data* gs://iodemo

・サブディレクトリ内のファイルも再帰的にUploadする
gsutil cp -R data* gs://iodemo

・bucket内のファイルを参照する
gsutil ls gs://iodemo
(Google Cloud Consoleからも同様に確認できます)

・ローカルからCloud StorageにUploadする
gsutil cp *.txt gs://my_bucket

・Cloud StorageからローカルにDownloadする
gsutil cp gs://my_bucket/*.txt .

・S3からローカルにDownloadする
gsutil cp s3://my_bucket/*.txt .

・S3からCloud Storageにコピー
gsutil cp s3://my_bucket/*.txt gs://my_bucket

・Cloud StorageからS3にコピー
gsutil cp gs://my_bucket/*.txt s3://my_bucket

*S3との転送にも対応しているのですね



◯マルチスレッドで高速にUploadする方法

Composite Objects and Parallel Uploads - Google Cloud Storage — Google Developers

通常CPコマンドはファイルを1つずつUploadするのでファイル数が多いと時間がかかります。
そこで「-m」オプションを指定するとマルチスレッドで複数ファイルを並列にUploadできます。
(比較的最近追加された機能なので古いgsutilでは使えません。最新版を使いましょう)

gsutil -m cp 〜〜

複数ファイルを並列に同時アップロードするので帯域とDisk I/Oをフルに使ってアップロードが可能になります。



◯Use object composition to improve throughput
サイズの大きなファイルを高速にUploadする方法

1.ファイル「big-file」を「big-file-part-*」に分割
split -n 10 big-file big-file-part-
2.マルチスレッドでUpload
gsutil -m cp big-file-part-* gs://bucket/dir/
3.ローカルの分割ファイルを削除する
rm big-file-part-*
4.Cloud Storage上で分割ファイルを結合する
gsutil compose gs://bucket/dir/big-file-part-* gs://bucket/dir/big-file
5.Cloud Storage上の分割ファイルを削除する
gsutil -m rm gs://bucket/dir/big-file-part-*

* 操作が増えるのでお金は若干余計にかかるそうです。



◯S3からCloud Storageへ、5ペタByteのデータをコピーした事例


・可能な限り速くコピーする
・Live Migration(ダウンタイム無しに)
という条件。

・AppEngineのDatastoreにオブジェクト(ファイル)のリストを持っているっぽい。
・オブジェクト名の一覧をAppEngine上で取得
・AppEngineからTaskQueueを使ってCompute Engine上に配置した「コピー処理」をキック
・Compute Engineはgsutilを使ってS3からGCSにコピー
 (ピーク時に160のCompute Engineのインスタンスが走っていた)
・顧客のシステムからVerify(hash値が一致する事を確認)
(たぶんこんな感じ?間違ってるかも)

平均で秒間10GB、最大で秒間20GBのコピーを行った。



・Object Change Notification (experimental)

Object Change Notification - Google Cloud Storage — Google Developers
bucketに対する変更の通知をWebアプリで受け取ることができる。



・JSON API  (experimental)

Getting Started - Google Cloud Storage — Google Developers

Cloud Storageに対して操作を行うJSONのAPI
JSON APIを使うと「batch request」をすることができる。
「gsutil -m」のように「呼び出し側からマルチスレッドで並行に複数のリクエストを投げる」のではなく、
「一度のリクエストで複数の命令を投げる」手法。

一気に大量のオブジェクトに対してアクセス権限を設定したり削除したりする場合等に有効。



◯Partition with Prefix

ファイル名の先頭文字列毎にUploadするテクニック。
Prefixを指定してコピーすることで簡単に同時実行する。

例えばファイル名が「0-9」で始まっているなら、以下のようにすることでさらに10分割して並列にUploadできます。

gsutil -m cp 0* gs://my_bucket
gsutil -m cp 1* gs://my_bucket
gsutil -m cp 2* gs://my_bucket
・・・
gsutil -m cp 8* gs://my_bucket
gsutil -m cp 9* gs://my_bucket



◯Copying a specific list of files from a text file or program output

テキストファイルやプログラムの出力結果で指定されたファイルをアップロードするためのテクニック

・files.txt
README.md
notes.txt
images/disk_import.jpg

catした結果をパイプで繋いでgsutilに渡す。
cat files.txt | gsutil -m cp -I gs://my_bucket
→リストに書いてあるファイルが全てコピーされる



◯run gsutil near to your source or target

ネットワーク的に速い環境からコピーするため、
ファイルのコピー元かファイルのコピー先に近いところで実行するべし、というお話。

Cloud StorageにUoloadするならCompute Engineからが速そう。
そして話は次の「Offline Disk Import」に繋がります。



◯Offline Disk Import (Limited Preview)

Offline Disk Import - Google Cloud Storage — Google Developers

Uploadしたいファイルをハードディスクに入れてGoogleに送ると
Google内のネットワークからUploadしてくれる

というまさに究極手段。

Google/IO 初日の5/15にサービス開始。

・手順
1.Offline Disk ImportのInterest Formから申し込み
2.SATAのハードディスクをencfs(暗号化ファイルシステム)でフォーマットする
3.データをハードディスクにコピーする
4.Googleに郵送する
5.Googleが顧客の所有する新しいbucketにimportする(Googleの高速なネットワークを使って)
6.GoogleがHDDを郵送で送り返してくれる

現時点ではアメリカ国内の顧客限定ですが、
間違いなく今後数ヶ月の間に国際的に利用できるように拡大するし、
優先順位が上がるかもしれないので海外の顧客も「Interest Form」から連絡してください、とのこと。

料金は通常のGoogle Cloud Storageの料金「リクエスト回数, 帯域使用料,ストレージ使用料」に加えて
HDD毎に「$80」加算されます。



◯Google Cloud Storageの最近のリリース一覧

Versioning
Durable Reduced Availability storage
30% price drop
Cloud Console
Composite Objects
Notifications
JSON API
Offline disk import



個人的には、あとはリクエスト回数に対する課金額
Amazon S3のリクエスト50%~60%値下げを全リージョンで開始、これまでの半額以下に
に追従してくれれば、と思います。
2013/4/3にAmazonが半額にした結果、
これだけGoogle Cloud StorageがS3の2倍のお値段になっちゃってるんですよね(´・ω・`)
他は概ねS3より若干安い料金体系なのですが。





このエントリーをはてなブックマークに追加