我正在使用Azcopy Java Sdk将文件从本地传输到Blob,与cli相比,它花费的时间更多(几乎两倍)。对于1GB的文件,cli需要8秒钟,而并发请求计数为1的SDK则需要2和40和20秒。超出2时,我发现传输时间没有任何改善。有什么方法可以使用sdk来提高性能。请找到我正在使用的代码段。

CloudStorageAccount storageAccount = null;
CloudBlobContainer container = null;
CloudBlockBlob blob = null;
BlobRequestOptions blobRequestOptions = new BlobRequestOptions();
blobRequestOptions.setConcurrentRequestCount(6);
storageAccount = CloudStorageAccount.parse(storageConnectionString);
CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
container = blobClient.getContainerReference("content");
blob = container
   .getBlockBlobReference(sourceFile.getName());
blob.uploadFromFile(sourceFile.getAbsolutePath(), null, blobRequestOptions, null);


Edit1:Iam尝试使用以下代码进行上传,并且花费20秒,而azcopy cli需要8秒

  blob.setStreamWriteSizeInBytes(100 * 1024 * 1024);

最佳答案

Azycopy和Azure Storage SDK承担相同的职责,但是AZcopy与SDK相比具有一些优势。

Azcopy:


  默认情况下,AzCopy将在两个存储端点之间异步复制数据。因此,复制操作将使用备用带宽容量在后台运行,该备用带宽容量就复制Blob的速度而言没有SLA,并且AzCopy会定期检查复制状态,直到复制完成或失败。
  
  / SyncCopy选项可确保复制操作获得一致的速度。 AzCopy通过下载要从指定源复制到本地内存的Blob,然后将它们上传到Blob存储目标来执行同步复制。


Java SDK:


  我们的Java库中的所有Blob下载API都是同步的。在下载完成之前,该方法不会终止。通常,Java 6(我们使用的版本)不支持异步方法。
  希望这可以帮助!


快速上传许多Blob


  要快速上传许多Blob,请并行上传。这比通过并行块上传同时上传单个Blob更快,因为它可以将上传内容分散到存储服务的多个分区中。单个Blob仅支持60 MB /秒(约480 Mbps)的吞吐量。在撰写本文时,基于美国的LRS帐户支持高达20 Gbps的入口,这远远超过单个Blob支持的吞吐量。默认情况下,AzCopy将并行执行上传,因此建议在这种情况下使用。


资料来源:

https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy
https://github.com/Azure/azure-storage-java/issues/95
https://docs.microsoft.com/en-us/azure/storage/common/storage-performance-checklist#subheading22

关于java - Azcopy Java SDK运行缓慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49632920/

10-11 14:30