Cloud Storage とビッグデータの使用

Cloud Storage は、Google Cloud でビッグデータを保存、操作するための重要な部分です。たとえば、Cloud Storage を使用して、BigQuery へのデータの読み込みや、Dataflow パイプラインのステージング ファイルと一時データの格納を行うことができます。また、Dataproc との統合により、Cloud Storage のデータに対して Apache Hadoop または Apache Spark ジョブを直接実行できます。

このページでは、gcloud コマンドライン ツールを使用して、サイズの大きいファイルのコピーや、多数のファイルの並列コピーなどのビッグデータ タスクを行う方法について説明します。gcloud の概要については、gcloud クイックスタートをご覧ください。

始める前に

このページで示す例を最大限に活用するには、以下の手順を完了する必要があります(まだ行っていない場合)。

多くのファイルのバケットへのコピー

cp コマンドは、必要に応じて並列(マルチスレッド / マルチ処理)コピーを自動的に実行することで、大量のファイルを効率的にアップロードします。サブディレクトリを再帰的にコピーするには、コマンドの --recursive フラグを使用します。たとえば、サブディレクトリが含まれるファイルを top-level-dir という名前のローカル ディレクトリからバケットにコピーする場合は、次のコマンドを使用できます。

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)にはないファイルが削除されます。また、2 つのバケット間で同期することもできます。

大きなファイルのバケットへのコピー

一般的に、ビッグデータを利用するときには、クラウドに移動したデータはクラウドにそのまま保存する必要があります。Google Cloud に取り込んだデータは、Compute Engine など、同じロケーションにある他のサービスに高速で転送できます。

大きなローカル ファイルをバケットにコピーするには、次のコマンドを使用します。

gcloud storage cp local-file gs://example-bucket

既存のバケットから大きなファイルをコピーするには、次のコマンドを使用します。

gcloud storage cp gs://example-source-bucket/file  gs://example-destination-bucket

gcloud storage は、Cloud Storage の再開可能なアップロードとダウンロードの機能を最大限に活用します。大きなファイルの場合、転送されるデータのサイズが大きくなると、ISP でネットワーク障害が発生する可能性が高くなるので、これは特に重要です。サーバーが実際に受信したバイト数を基にしてアップロードを再開することにより、gcloud storage は、不要なバイトの再送信を回避し、最終的にアップロードを確実に完了できます。ダウンロードにも、ローカル ファイルのサイズを基準として同じロジックが適用されます。

バケットの構成

バケットを構成する必要がある一般的なビッグデータ タスクとしては、異なるストレージ クラスへのデータの移動、オブジェクトのバージョニングの構成、ライフサイクル ルールの設定などがあります。

バケットの構成の詳細は buckets describe を使用して表示できます。

gcloud storage buckets describe gs://example-bucket

出力にバケットの構成情報が表示されますが、それらのほとんどは gcloud storage でも構成できます。

  • CORS: バケットのクロスオリジン リソース シェアリング設定を制御します。
  • ウェブサイト: バケット内のオブジェクトをウェブページとして機能させることができます。また、ウェブサイトで静的なアセットとして使用することもできます。
  • バージョニング: バケット内のオブジェクトを削除して、非現行バージョンを作成します。
  • ストレージ クラス: バケットの作成中にストレージ クラスを設定できます。
  • ライフサイクル: 定期的なオペレーションをバケット上で実行できます。最も一般的なのは、古くなったオブジェクトの削除です。

たとえば、特定のバケット内に 1 日だけファイルを保管したい場合、次のコマンドを使用してバケットのライフサイクル ルールを設定できます。

echo '{ "rule": [{ "action": {"type": "Delete"}, "condition": {"age": 1}}]}' > lifecycle_config.json
gcloud storage buckets update gs://example-bucket --lifecycle-file=lifecycle_config.json

これで、バケット内の 1 日以上経過しているオブジェクトがバケットから自動的に削除されます。buckets describe コマンドで行った構成を確認できます(他の構成コマンドも同じように機能します)。

gcloud storage buckets describe gs://example-bucket

バケット内のデータの共有

ビッグデータを利用するときには、共同でファイルを利用することが多いので、特定のユーザーまたはグループにアクセス権を付与できる必要があります。Identity and Access Management ポリシーは、ファイルにアクセスできるユーザーと、そのユーザーに許可する操作を定義します。buckets get-iam-policy コマンドを使用して、バケットの Cloud IAM ポリシーを表示できます。

gcloud storage buckets get-iam-policy gs://example-bucket

コマンドへのレスポンスで、バケットへのアクセス権が付与されているアカウントであるプリンシパルと、プリンシパルに付与されている権限のグループであるロールが示されます。

データ共有の一般的なシナリオとしては、一般公開での共有、グループとの共有、個人との共有の 3 つがあります。

  • 一般公開での共有: 内容がインターネット上のすべてのユーザーに表示され、読み取られるバケットの場合、次のように AllUsers 指定を使用して IAM ポリシーを構成できます。

    gcloud storage buckets add-iam-policy-binding gs://example-bucket --member=allUsers --role=roles/storage.objectViewer

  • グループとの共有: 他の Google Cloud リソースにアクセスできない共同編集者の場合は、Google グループを作成してから、Google グループをバケットに追加します。たとえば、my-group Google グループへのアクセス権を付与するには、次の IAM ポリシーを構成します。

    gcloud storage buckets add-iam-policy-binding gs://example-bucket --member=group:my-group@googlegroups.com --role=roles/storage.objectViewer

    詳しくは、グループを使用したオブジェクトへのアクセスの制御をご覧ください。

  • 個人との共有: 多くの共同編集者は、グループを使用してアクセス権を一括で付与できます。1 人の場合は、次のようにして読み取りアクセス権を付与できます。

    gcloud storage buckets add-iam-policy-binding gs://example-bucket --member=user:liz@gmail.com --role=roles/storage.objectViewer

バケットのクリーンアップ

次のコマンドでバケットをすばやくクリーンアップできます。

gcloud storage rm gs://example-bucket/ --recursive

チェックサムの操作

gcloud storage cp コマンドと gcloud storage rsync コマンドは、コピーを実行するときに、コピー元ファイルのチェックサムがコピー先ファイルのチェックサムと一致することを確認します。例外的にチェックサムが一致しない場合、gcloud storage が、無効なコピーを削除し、警告メッセージを出力します。詳細については、チェックサムの検証をご覧ください。

gcloud storage を使用して、バケット内のオブジェクトのチェックサムを取得できます。たとえば、次のように Landsat 一般公開データ オブジェクトを作業中のバケットにコピーするとします。

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 を使用して、ローカル ファイルのチェックサムを取得し、バケットにコピーしたファイルのチェックサムと比較できます。ローカル ファイルのチェックサムを取得するには、次のコマンドを使用します。

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 値はありません。

次のステップ