繁体   English   中英

尝试从Azure Data Lake删除文件时引发异常

[英]Exception raised while trying to delete file from Azure Data Lake

小前言:我正在使用ADF将文件从Azure Data Lake Store存档(复制和删除)到Azure Blob Storage ,我的管道有两个活动1. Copy Activity (将文件从ADLS复制到Blob )2. Custom .NET Activity (删除) ADLS文件)。

现在, ADF的计划已经完美并且可以流畅运行,没有任何错误- Copy Activity很好,并且能够查看复制到Blob文件。 我的问题与Custom .NET Activity -没有记录任何错误(我正在使用IActivityLogger logger ),但是没有删除文件。 因此,我开始通过ADL .NET SDK code部分进行调试,并遇到以下问题-

用户代码HResult = -2146233088未处理Microsoft.Azure.Management.DataLake.Store.Models.AdlsErrorException消息=操作返回了无效的状态代码“禁止”源= Microsoft.Azure.Management.DataLake.Store StackTrace:Microsoft.Azure .Management.DataLake.Store.FileSystemOperations.d__28.MoveNext()-从上一个引发异常的位置开始的堆栈跟踪结束--在System.Runtime的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处。 Microsoft.Azure.Management.DataLake.Store.FileSystemOperationsExtensions.d__39.MoveNext()处的CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)-从上一个引发异常的位置开始的堆栈结束跟踪-在System.Runtime.CompilerServices System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的.TaskAwaiter.ThrowForNonSuccess(任务任务),Microsoft.Azure.Management.DataLake.Store.FileSystemOperationsExtensions.Delete (IFileSystemOperations操作,String accountName,String filePath,Nullable'1递归)位于C:\\ Projects \\ C#\\ DataLakeApplication \\ DataLakeApplication \\ Program.cs:line 117中的DataLakeApplication.DotNetADLApplication.ADLApplication(List'1 dataSetsToDelete):行117内部异常:

delete操作的代码段:

var fileDeleterResult =
_adlsFileSystemClient.FileSystem.Delete(_adlsAccountName, strInputToDelete, null);

我在.NET代码中使用AAD Service PrincipalADLS进行通信,身份验证部分还可以,甚至我还尝试了其他几个FileSystemOperations ListFileStatusGetFileStatus这些工作正常。 只有我的Delete会引发上述错误,因此我想为我的Service Principal重新检查对ADLS的权限,该权限已授予ADLS文件夹的Owner -角色和RWX权限。

任何线索将不胜感激,如果有任何进一步的信息需要告知我。

我注意到ADLS中有一些有趣的生意。

需要仔细检查的几件事:

如果您还没有做过(我确定您已经做过),请另外阅读:

Azure Data Lake Store中的访问控制

密切注意权限的非层叠性质以及掩码的工作方式。

但是,正如您所说的,用户具有所有者权限,这意味着所有强大的功能。

尝试重新应用包括子级在内的权限(如果适用于您的安全模型),以查看是否可以解决问题。

我也想知道数据湖诊断程序是否可以找到某些东西(我不确定,我自己还没有看过)。

终于能够解决它,我的错误基本上是我试图传递Azure Data Lake文件夹路径,而不是传递给我Forbidden错误消息的文件路径。 我实现的用于删除文件夹中文件的代码-

foreach (string strInputToDelete in dataSetsToDelete)
{
   Console.WriteLine("Listing files and directories.");
   var itemList = _adlsFileSystemClient.FileSystem.ListFileStatus(_adlsAccountName, strInputToDelete).FileStatuses.FileStatus.ToList();
   var fileMenuItems = itemList.Select(a => String.Format("{0,15} {1}", a.Type, a.PathSuffix));
   Console.WriteLine(String.Join("\r\n", fileMenuItems));
   Console.WriteLine("Files and directories listed.");

   for (int i = 0; i < itemList.Count; i++)
   {
        Console.WriteLine("Deleting files...");
        var fileDeleteResult =_adlsFileSystemClient.FileSystem.Delete(_adlsAccountName, strInputToDelete + itemList[i].PathSuffix);
        Console.WriteLine("Deletion result: " + fileDeleteResult.OperationResult.ToString());
        Console.WriteLine("Files deleted");
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM