こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。
今回はGCSとAzure Blob間でファイルを並列コピーする方法についてです。
GCS <=> S3はTransferサービスがありますが、GCS <=> Blobはお手軽に使えるダイレクトなものがありません。
というわけで、コマンドラインでササっと片付けました。
1. VMインスタンスを作成する
GCPまたはAzure上にVMインスタンスを用意します。
私はAzureのVMで東日本リージョンにUbuntuインスタンスを1台立ててるので、今回はそれを使います。
2. VMに必要なツール類をインストールする
GCS -> Blobにファイルをコピーするにあたって使ったツール類は以下のものです。
それぞれ手順に従ってインストールします。
Azure CLI
blobfuse
Google Cloud SDK
Cloud Storage FUSE
GNU Parallel ※aptでインストール可
3. BlobとGCSをUbuntuにマウントする
上記でインストールしたblobfuseとgcsfuseを使って、BlobとGCSをホームディレクトリ配下にマウントします。
~/blob と ~/gcs にそれぞれマウントしました。
blobfuse
$ blobfuse ~/blob --tmp-path=/mnt/blobfusetemp --config-file=/home/hoge/fuse_connection.cfg -o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120
fuse_connection.cfgの中身はこのようになってます。
accountName ストレージアカウント名 accountKey アカウントキー containerName Blobコンテナ名
gcsfuse
$ gcsfuse mygcsbucketname ~/gcs
4. GNU Parallelを使って並列コピーする
それぞれFUSEを使ってファイルシステムにマウントしたので、あとはcpコマンドなりrsyncで同期する事も出来ますが、ファイルが沢山あるので今回はparallelを使って並列コピーしました。
このように使います。
$ ls gcs/*.csv | parallel -X -r -j10 cp -v {} ~/blob
これで、gcs内のCSVファイルを同時に10ファイルずつblobにコピーします。
上記で使ったparallelコマンドのオプションですが、
-X … 引数の置き換え。パイプで渡された入力と{}を置き換えます。
-r … 標準入力が空白だけだったら無視。
-j … 同時実行のジョブ数。デフォルトはCPUコア数なので、CPU以上の数を同時実行したい場合は-jの後ろに同時実行数をつける。
というわけで、GCSとBlobをVMにマウントしてparallelで同時コピーというお手軽解決策でした。
弊社ではデジタルマーケティング領域とビッグデータ領域にまたがる分析業務を主に行っておりまして、この分野ではLinuxとマルチクラウドは欠かせない技術です。
弊社へのお問合わせはこちらからどうぞ。
ブログへの記事リクエストはこちらまで