以编程方式将文件从 Azure Blob Storage 传输到 Google Cloud Storage
Posted
技术标签:
【中文标题】以编程方式将文件从 Azure Blob Storage 传输到 Google Cloud Storage【英文标题】:Transfer file from Azure Blob Storage to Google Cloud Storage programmatically 【发布时间】:2017-04-30 15:39:36 【问题描述】:我有许多文件通过 Azure 数据工厂传输到 Azure Blob 存储。不幸的是,这个工具似乎没有为任何值设置 Content-MD5 值,所以当我从 Blob Storage API 中提取该值时,它是空的。
我的目标是将这些文件从 Azure Blob 存储转移到 Google 存储。我在https://cloud.google.com/storage/transfer/reference/rest/v1/TransferSpec#HttpData 看到的关于 Google 的 Storagetransfer 服务的文档表明,如果我提供文件列表及其 URL、字节长度和每个文件的 MD5 哈希值,我可以轻松启动此类传输。
好吧,我可以轻松地从 Azure 存储中提取前两个,但第三个似乎不会自动被 Azure 存储填充,我也找不到任何方法让它这样做。
不幸的是,我的其他选择看起来很有限。到目前为止的可能性:
-
下载文件到本地机器,确定hash并更新Blob MD5值
看看我是否不能在同一区域编写一个 Azure Functions 应用程序来计算哈希值并将其写入容器中每个的 blob
使用来自数据工厂的 Amazon S3 出口,然后使用 Google 对从 S3 导入的支持从那里拉取它,每个 https://cloud.google.com/storage/transfer/reference/rest/v1/TransferSpec#AwsS3Data 但这似乎真的是在浪费带宽(我必须设置一个 Amazon帐户)。
理想情况下,我希望能够编写一个脚本,然后点击 go 并不管它。我没有从 Azure 获得最快的下载速度,因此 #1 不太理想,因为它需要很长时间。
还有其他方法吗?
【问题讨论】:
【参考方案1】:我知道现在为您回答这个问题有点晚了,但它可能会帮助其他试图将数据迁移从 Azure Blob 存储 到 谷歌云存储
Google Cloud Storage 和 Azure Blob Storage 这两个平台都是存储服务,没有命令行界面,我们可以简单地在其中运行传输命令。为此,我们需要一个实际上能够运行所需命令的中间计算实例。我们将按照以下步骤实现云到云传输。
首先,在 Google Cloud Platform 中创建一个计算实例。您无需创建计算能力强大的实例,您只需要一台具有 2 核 CPU 和 4 GB 内存的 Debian-10GB 机器。
在早期,您会将数据下载到 GCP 中的计算实例,然后将其进一步移动到 Google Cloud Storage。但现在随着 gcsfuse
的引入,我们可以简单地将 Google 存储帐户挂载为文件系统。
创建计算实例后,只需从 Google 控制台使用 SSH
登录到该实例并安装以下软件包。
Install Google Cloud Storage Fuse
export GCSFUSE_REPO=gcsfuse-`lsb_release -c -s`
echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update -y
sudo apt-get install gcsfuse -y
# Create local folder
mkdir local_folder_name
# Mount the Storage Account as a bucket
gcsfuse <bucket_name> <local_folder_path>
Install Azcopy
wget https://aka.ms/downloadazcopy-v10-linux
tar -xvf downloadazcopy-v10-linux
sudo cp ./azcopy_linux_amd64_*/azcopy /usr/bin/
安装这些软件包后,下一步就是创建共享签名访问密钥。如果你有 Azure Blob 存储资源管理器,只需右键单击目录树中的存储帐户名称并选择 Generate Shared Access Signature
现在您必须为您的 blob 对象创建一个 URL。为此,只需右键单击任何 blob 对象,选择 Properties
并从对话框中复制 URL。
您的最终网址应该是这样的。
<https://URL_to_file> + <SAS Token>
https://myaccount.blob.core.windows.net/sascontainer/sasblob.txt?sv=2015-04-05&st=2015-04-29T22%3A18%3A26Z&se=2015-04-30T02%3A23%3A26Z&sr=b&sp=rw&sip=168.1.5.60-168.1.5.70&spr=https&sig=Z%2FRHIX5Xcg0Mq2rqI3OlWTjEg2tYkboXr1P9ZUXDtkk%3D
现在,使用以下命令开始将文件从 Azure 复制到 GCP 存储。
azcopy cp --recursive=true "<-source url->" "<-destination url->"
如果您的工作失败,您可以使用以下方式列出您的工作:
azcopy jobs list
并恢复失败的工作:
azcopy jobs resume jobid <-source sas->
您可以将所有步骤整理到一个 bash 中,让它一直运行,直到您的数据传输完成。
仅此而已!我希望它可以帮助别人
【讨论】:
有人能告诉我什么是“”吗?我尝试使用 Google Cloud 存储桶中的链接 URL,我想将文件复制到其中,但它不起作用。其实我不明白为什么我们需要在Compute Instance中创建一个新目录!!我们是否先将文件从 Azure Blob 复制到此实例,然后再复制到 Google bukcet?当我使用最后一个命令时,而不是目标 url,我将本地目录复制到 Compute 实例,它只工作文件,但是当我传递最后一个目标的存储桶 url 时它不起作用。 @TwinPenguins 您可能错过了将谷歌云存储桶作为文件系统挂载到该计算实例的步骤。关于目标 URL,它只是使用 GCSFUSE 挂载的文件夹名称。例如,您在计算实例上的/home/username
中创建了一个文件夹 bucket_mount
,那么目标 URL 将是 - /home/username/bucket_mount
不,我们根本不会将这些文件复制到计算实例,因为我们使用存储桶作为文件系统。计算实例只是帮助我们挂载存储桶并运行复制命令。其他方法包括使用 GCP 或 Azure 的付费数据传输服务。【参考方案2】:
2020 年 5 月更新:Google Cloud Data Transfer 现在支持将 Azure Blob 存储作为源。这是一个无代码解决方案。
我们使用它将大约 1TB 的文件从 Azure Blob 存储传输到 Google 云存储。我们还每天刷新一次,因此 Azure Blob 中的任何新文件都会自动复制到 Cloud Storage。
【讨论】:
这对我也有用。生成 SAS 令牌的 Azure 页面为您提供“连接字符串”、“SAS 令牌”和 4 个包含 SAS 令牌的不同 URL 选择;转移所需的是“SAS 令牌”。 数据传输完美适用于传输多个文件。任何人都可以建议,作为数据传输的一部分,如何在目的地将 csv 文件转换为 txt 文件?【参考方案3】:我们已将大约 3TB 文件从 Azure 迁移到 Google 存储。我们已经在 Google 计算引擎中启动了一个带有几 TB 本地磁盘的廉价 Linux 服务器。通过blobxfer将Azure文件传输到本地磁盘,然后通过gsutil rsync
将文件从本地磁盘复制到Google存储(gsutil cp
也可以)。
您可以使用其他工具从 Azure 传输文件,您甚至可以在 GCE 中启动 Windows 服务器并在 Windows 上使用gsutils
。
花了几天时间,但简单明了。
【讨论】:
【参考方案4】:您是否考虑过使用用于数据转换的 Azure 数据工厂custom activity 支持?在后端,如果您使用 ADF 自定义活动,您可以使用 Azure Batch 下载、更新文件并将其上传到 Google 存储。
【讨论】:
以上是关于以编程方式将文件从 Azure Blob Storage 传输到 Google Cloud Storage的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 blob 服务以编程方式删除 Azure 存储中未提交的块?
当文件上传到 azure 文件共享时,如何添加触发器以将文件从 azure 文件共享移动到 azure blob?
将文件从 Azure 文件共享复制到 Azure Blob 的 C# 代码