Azure Data Lake Store文件大小限制

时间:2018-05-24 20:48:51

标签: c# azure hdfs azure-data-lake

我使用以下功能将文件上传到Azure Data Lake Store:

DataLakeStoreFileSystemManagementClient.FileSystem.UploadFile(store, filePath, key, overwrite: true);

对于仅大于〜4MBs的文件,它给出了以下错误:

"Found a record that exceeds the maximum allowed record length around offset 4194304"

Microsoft.Azure.Management.DataLake.Store.TransferFailedException:
   at Microsoft.Azure.Management.DataLake.Store.FileSystemOperations.UploadFile (Microsoft.Azure.Management.DataLake.Store, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)

如果这是Azure Data Lake中的某个设置或我可以在客户端调整的内容,是否有人可以提供任何见解?

谢谢!

我已经用Google搜索了错误,唯一返回的是Java代码示例。

3 个答案:

答案 0 :(得分:1)

根据Azure subscription limits and quotas

  

Azure Data Lake Store是一个适用于大数据分析工作负载的企业级超大规模存储库。通过Data Lake Store,您可以在一个位置捕获任何大小,类型和摄取速度的数据,以进行操作和探索性分析。您可以在Data Lake Store帐户中存储的数据量没有限制。

但是,根据“使用Azure Data Lake Store的最佳实践”一章中的章节Performance and scale considerations,“Optimize”段落写着“使用Data Lake Store驱动程序缓冲区”

  

要从Hadoop写入Data Lake Store时优化性能并降低IOPS,请尽可能接近Data Lake Store驱动程序缓冲区大小执行写入操作。在刷新之前尽量不要超过缓冲区大小,例如使用Apache Storm或Spark流式工作负载进行流式传输时。从HDInsight / Hadoop写入Data Lake Store时,重要的是要知道 Data Lake Store有一个4 MB缓冲区的驱动程序。与许多文件系统驱动程序一样,可以在达到4 MB大小之前手动刷新此缓冲区。如果不是,如果下一次写入超过缓冲区的最大大小,则立即刷新到存储。在可能的情况下,在按计数或时间窗口同步/刷新策略时,必须避免缓冲区的溢出或显着欠载。

<强>答案
根据{{​​3}},使用this answer并未向您提供此问题。主要原因可能是因为他们为你做了冲洗。所以你可能使用FileSystem.UploadFile方法太接近金属了;)

根据这篇文章DataLakeStoreUploader应该从一个空文件开始并添加&lt;冲洗前4mb块。

答案 1 :(得分:0)

根据我的理解,如果使用最新的Microsoft.Azure.Management.DataLake.Store 2.21,则没有此限制。

我不能在我身边重现它。我也用Fiddler工具检查它。在我使用Azure库将文件上传到Azure Datalake的过程中,我们发现它使用追加模式上传文件。您可以尝试使用我的以下代码。

以下是演示代码和包

 var creds = new ClientCredential("clientId", "secretkey");
 var clientCreds = ApplicationTokenProvider.LoginSilentAsync("tenantId", creds).Result;
 var client = new DataLakeStoreFileSystemManagementClient(clientCreds);
 var source = "D:\\1.txt"; //file size>15M
 var fileInfo = new FileInfo(source);
 var size = fileInfo.Length;
 var destination = "/tomtest/1.txt";
 client.FileSystem.UploadFile("tomdatalake", source, destination, overwrite: true);

测试结果: enter image description here

Packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.Azure.Management.DataLake.Store" version="2.2.1" targetFramework="net471" />
  <package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.14.0" targetFramework="net471" />
  <package id="Microsoft.IdentityModel.Logging" version="1.1.2" targetFramework="net471" />
  <package id="Microsoft.IdentityModel.Tokens" version="5.1.2" targetFramework="net471" />
  <package id="Microsoft.Rest.ClientRuntime" version="2.3.11" targetFramework="net471" />
  <package id="Microsoft.Rest.ClientRuntime.Azure" version="3.3.7" targetFramework="net471" />
  <package id="Microsoft.Rest.ClientRuntime.Azure.Authentication" version="2.3.3" targetFramework="net471" />
  <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net471" />
</packages>

答案 2 :(得分:0)

帮助我确定

uploadAsBinary: true

我找到了AdlsClient.BulkUpload的此参数行为的解释,但我猜想该API应该是相同的。

  

如果为false,则将文件写入换行边界处的数据湖   如果文件在4MB的块中没有换行符,它将引发异常。   如果为true,则不保证在新行边界上载,但   上传会更快。默认情况下为false(如果文件没有换行符)   在4MB的块内,应传递true

https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.datalake.store.adlsclient.bulkupload?view=azure-dotnet