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
を使用してバケット内のファイルのチェックサムを取得できます。また、ローカル オブジェクトのチェックサムを計算することもできます。たとえば、次のように Cloud Life Sciences 一般公開データファイルを作業中のバケットにコピーするとします。
gcloud storage cp gs://genomics-public-data/1000-genomes/vcf/ALL.chrMT.phase1_samtools_si.20101123.snps.low_coverage.genotypes.vcf gs://example-bucket
これで、ファイルの一般公開バケット バージョンとバケット内のファイルのバージョンの両方のチェックサムを取得し、一致することを確認できます。
gcloud storage objects describe gs://example-bucket/ALL.chrMT.phase1_samtools_si.20101123.snps.low_coverage.genotypes.vcf
gcloud storage objects describe gs://genomics-public-data/1000-genomes/vcf/ALL.chrMT.phase1_samtools_si.20101123.snps.low_coverage.genotypes.vcf
次に、ローカル データセンターのファイル内にデータがあり、それを 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 値はありません。