2017-04-07 11 views
1

私はFileSystemOperationsExtensions.Openメソッドを使用してストリームを返し、それを読み取ることができます。Azure Data Lake Store - ファイルからの読み取り中にエラーが発生しました

System.IO.IOException: The read operation failed, see inner exception. ---> System.Net.WebException: The request was aborted: The request was canceled. 
at System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
at System.Net.Http.HttpClientHandler.WebExceptionWrapperStream.Read(Byte[] buffer, Int32 offset, Int32 count) 

"ClassName": "System.IO.IOException", 
"Message": "Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host." 
at System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size)\r\n 
at System.Net.Http.HttpClientHandler.WebExceptionWrapperStream.Read(Byte[] buffer, Int32 offset, Int32 count) 

をそして、それは、ランダムに発生します。 時々際にサービスがストリームから大きなファイルを読んでいる(〜150-300 MB)サービスは、次の例外を取得します。 また、DataLakeStoreFileSystemManagementClientクラスのオブジェクトを60分のタイムアウトで作成しますが、これらのエラーはその前に発生します。 3分、10分、20分またはそれ以上の時間がかかります。 もちろん、オフセットを使ってストリームを再読み込みできますが、開発には余分な時間が必要です。 おそらく、これらの例外を回避する別の方法があります。 誰かが私にそれを手伝ってもらえますか?

+0

この質問への回答:http://stackoverflow.com/questions/43400730/azure-data-湖の店舗の既存接続は強制的にリモートで閉鎖されました –

答えて

1

私は270M +サイズのファイルで3回デモテストを行いますが、いつも正しく動作します。テストするには、次のコードを使用してみてください。また、​​からデータレックストアデモコードを取得することもできます。

enter image description here

デモコード:

var applicationId = "Application Id"; 
       var secretKey = "secretkey"; 
       var tenantId = "tenant id"; 
       var adlsAccountName = "Account name"; 
       var creds = ApplicationTokenProvider.LoginSilentAsync(tenantId, applicationId, secretKey).Result; 
       var adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(creds,clientTimeoutInMinutes:60); 
       var srcPath = "/mytempdir/ForDemoCode.zip"; 
       var destPath = @"c:\tom\ForDemoCode1.zip"; 

       Stopwatch stopWatch = new Stopwatch(); 
       stopWatch.Start(); 
       using (var stream = adlsFileSystemClient.FileSystem.Open(adlsAccountName, srcPath)) 
       using (var fileStream = new FileStream(destPath, FileMode.Create)) 
       { 
        stream.CopyTo(fileStream); 
       } 
       var file = new FileInfo(destPath); 
       Console.WriteLine($"File size :{file.Length}"); 
       stopWatch.Stop(); 
       // Get the elapsed time as a TimeSpan value. 
       TimeSpan ts = stopWatch.Elapsed; 
       // Format and display the TimeSpan value. 
       string elapsedTime = $"{ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}.{ts.Milliseconds/10:00}"; 
       Console.WriteLine("RunTime " + elapsedTime); 
       Console.ReadKey(); 

パッケージの設定ファイル:

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="Microsoft.Azure.Management.DataLake.Store" version="2.1.1-preview" targetFramework="net452" /> 
    <package id="Microsoft.Azure.Management.DataLake.StoreUploader" version="1.0.0-preview" targetFramework="net452" /> 
    <package id="Microsoft.IdentityModel.Clients.ActiveDirectory" version="3.13.8" targetFramework="net452" /> 
    <package id="Microsoft.Rest.ClientRuntime" version="2.3.5" targetFramework="net452" /> 
    <package id="Microsoft.Rest.ClientRuntime.Azure" version="3.3.5" targetFramework="net452" /> 
    <package id="Microsoft.Rest.ClientRuntime.Azure.Authentication" version="2.2.0-preview" targetFramework="net452" /> 
    <package id="Newtonsoft.Json" version="9.0.2-beta1" targetFramework="net452" /> 
</packages> 
+0

、** ApplicationTokenProvider.LoginSilentAsync **のネームスペースは何ですか? 私はこれに次のエラーがありました。 ** "'ApplicationTokenProvider'という名前は現在のコンテキストに存在しません" ** –

+0

'Microsoft.Rest.Azure.Authentication'名前空間では、packages.configファイルセクションでも触れました。以下の.dllファイル 'Microsoft.Rest.ClientRuntime.Azure.Authentication'を参照してください。 –

+0

、ありがとう、それは私のために働いています。 –

関連する問題