Ограничение размера файла в хранилище озера данных Azure - PullRequest
0 голосов
/ 24 мая 2018

Я загружаю файлы в хранилище озера данных Azure, используя следующую функцию:

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

Это дает мне следующую ошибку для файлов ТОЛЬКО больше ~ 4 МБ:

"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 или что-то, что я могу настроить на стороне клиента?

Спасибо!

Я погуглил ошибку, и единственное, что возвращается, этоПримеры кода Java.

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Насколько я понимаю, этого ограничения нет, если используется последняя Microsoft.Azure.Management.DataLake.Store 2.21 .

Я не могу воспроизвести это на моей стороне.Я также проверяю это с помощью инструмента Fiddler.Во время загрузки файла в Azure Datalake с помощью библиотеки Azure мы могли обнаружить, что он загружает файл в режиме добавления.Вы можете попробовать использовать мой следующий код.

Ниже приведен демонстрационный код и пакеты

 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>
0 голосов
/ 02 мая 2019

Мне помогло указание

uploadAsBinary: true

Я нашел объяснение поведения этого параметра для AdlsClient.BulkUpload, но я полагаю, что оно должно быть таким же для этого API.

Если false, то файлы записываются в озеро данных на границах новой строки, однако, если файл не имеет символа новой строки в пределах 4-мегабайтных блоков, он выдаст исключение.Если это правда, тогда загрузка на новых границах линии не гарантируется, но загрузка будет быстрее.По умолчанию false, если в файле нет символов новой строки в пределах 4 МБ. Куски true должны передаваться

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

0 голосов
/ 25 мая 2018

Согласно ограничениям и квотам на подписку Azure

Хранилище озера данных Azure - это масштабное корпоративное хранилище для аналитических рабочих нагрузок больших данных.Data Lake Store позволяет собирать данные любого размера, типа и скорости загрузки в одном месте для оперативной и исследовательской аналитики.Количество данных, которые вы можете хранить в учетной записи Data Lake Store, не ограничено.

Но также, в соответствии с главой Рекомендации по производительности и масштабированию в главе «Лучшие практики»для использования хранилища озера данных Azure », параграф« Оптимизировать «запись» с помощью буфера драйвера хранилища озера данных »*

Чтобы оптимизировать производительность и снизить количество операций ввода-вывода в секунду при записи в хранилище озера данных из Hadoop, выполните операции записи следующим образом:как можно ближе к размеру буфера драйвера хранилища озера данных.Старайтесь не превышать размер буфера перед сбросом, например, при потоковой передаче с использованием потоковых рабочих нагрузок Apache Storm или Spark.При записи в Data Lake Store из HDInsight / Hadoop важно знать, что Data Lake Store имеет драйвер с буфером 4 МБ .Как и многие драйверы файловой системы, этот буфер может быть очищен вручную до достижения размера 4 МБ.Если нет, он немедленно сбрасывается в хранилище, если следующая запись превышает максимальный размер буфера.Там, где это возможно, вы должны избегать переполнения или значительного переполнения буфера при синхронизации / очистке политики по счетчику или временному окну.

Ответ
Согласно этот ответ с использованием DataLakeStoreUploader не представляет вам этой проблемы.Основная причина, вероятно, в том, что они делают промывку для вас.Таким образом, вы можете быть слишком близко к металлу, используя метод FileSystem.UploadFile;)

Согласно этому посту другое решение должно состоять в том, чтобы начать с пустого файла и добавить к нему куски <4mbдо промывки. </p>

...