我使用以下功能将文件上传到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代码示例。
答案 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);
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