我有数据采集&包含Azure ADLS gen2、CSV和Delta格式的约5-10 TB数据的数据仓库。ADLS的Performance/Tier=Standard/Hot,replication=GRS,type=StorageV2。
备份ADLS第2代数据的最佳方式是什么
- 从数据损坏的角度来看,我想备份原始摄入的数据。这可以定期增量地、少量地完成
- 从PROD可用性的角度来看,我希望在复杂的PROD迁移之前很少备份所有5-10 TB。是的,数据可以从原始数据中获得,但可能需要几天甚至一周的时间(包括重新配置、测试甚至更多(
注意事项:
- Azure备份不支持ADLS
- 借助Azure Storage Explorer复制数据速度较慢,因为速度在50到1000 Mbps之间不稳定。我的数据量可能需要几天或几周的时间我说得对吗Azure Storage Explorer的速度不取决于我的本地网速
- 我还没有尝试过AzCopy,但希望它的速度与Azure Storage Explorer相同
- 在DBFS中将
data_container
装载到archive_container
,并尝试使用Databrick的dbutils.fs.cp
复制数据的速度甚至比Azure Storage Explorer:3GB/10分钟在大型10个notes 30 DBU集群上的速度还要慢为什么 - ADF还没有尝试过,但我不喜欢复制活动需要表/格式级别的详细信息。我想备份整个容器,而不需要实现逻辑,也不需要依赖于文件夹数量和命名
对于原始数据/文件夹备份,我使用Microsoft数据移动服务将blob目录从ADLS Gen2复制到存储帐户中。
为此,创建一个每日时间触发函数来执行blob目录的增量复制。您可以配置类似的内容。
使用每周一(日期(的完整备份创建一个新文件夹,并将增量更改保留到周日。一个月后删除旧的备份文件夹。
这是我的实现。
public async Task<string> CopyBlobDirectoryAsync(BlobConfiguration sourceBlobConfiguration, BlobConfiguration destBlobConfiguration, string blobDirectoryName)
{
CloudBlobDirectory sourceBlobDir = await GetCloudBlobDirectoryAsync(sourceBlobConfiguration.ConnectionString, sourceBlobConfiguration.ContainerName, blobDirectoryName);
CloudBlobDirectory destBlobDir = await GetCloudBlobDirectoryAsync(destBlobConfiguration.ConnectionString, destBlobConfiguration.ContainerName, destBlobConfiguration.BlobDirectoryPath + "/" + blobDirectoryName);
// You can also replace the source directory with a CloudFileDirectory instance to copy data from Azure File Storage. If so:
// 1. If recursive is set to true, SearchPattern is not supported. Data movement library simply transfer all azure files
// under the source CloudFileDirectory and its sub-directories.
CopyDirectoryOptions options = new CopyDirectoryOptions()
{
Recursive = true
};
DirectoryTransferContext context = new DirectoryTransferContext();
context.FileTransferred += FileTransferredCallback;
context.FileFailed += FileFailedCallback;
context.FileSkipped += FileSkippedCallback;
// Create CancellationTokenSource used to cancel the transfer
CancellationTokenSource cancellationSource = new CancellationTokenSource();
TransferStatus trasferStatus = await TransferManager.CopyDirectoryAsync(sourceBlobDir, destBlobDir, CopyMethod.ServiceSideAsyncCopy, options, context, cancellationSource.Token);
return TransferStatusToString(blobDirectoryName, trasferStatus);
}