小前言:我正在使用ADF
将文件从Azure Data Lake Store
归档(复制和删除)到Azure Blob Storage
,我的管道有两个活动1. { {1}}(将文件从Copy Activity
复制到ADLS
)2。Blob
(从Custom .NET Activity
删除文件)。
现在ADLS
已完美安排并且运行顺畅且没有错误 - ADF
一切正常并能够将文件复制到Copy Activity
。我的问题是Blob
- 没有记录错误(我正在使用Custom .NET Activity
)但文件没有被删除。所以,我开始按IActivityLogger logger
部分进行调试,并面对以下问题 -
Microsoft.Azure.Management.DataLake.Store.Models.AdlsErrorException未被用户代码处理 的HResult = -2146233088 Message = Operation返回了无效的状态代码' Forbidden' 来源= Microsoft.Azure.Management.DataLake.Store 堆栈跟踪: 在Microsoft.Azure.Management.DataLake.Store.FileSystemOperations.d__28.MoveNext() ---从抛出异常的先前位置开始的堆栈跟踪结束--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在Microsoft.Azure.Management.DataLake.Store.FileSystemOperationsExtensions.d__39.MoveNext() ---从抛出异常的先前位置开始的堆栈跟踪结束--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在Microsoft.Azure.Management.DataLake.Store.FileSystemOperationsExtensions.Delete(IFileSystemOperations操作,String accountName,String filePath,Nullable' 1递归) at DataLakeApplication.DotNetADLApplication.ADLApplication(List' 1 dataSetsToDelete)在C:\ Projects \ C#\ DataLakeApplication \ DataLakeApplication \ Program.cs:第117行 的InnerException:
ADL .NET SDK code
操作的代码段:
delete
我在我的.NET代码中使用var fileDeleterResult =
_adlsFileSystemClient.FileSystem.Delete(_adlsAccountName, strInputToDelete, null);
与AAD Service Principal
进行通信,身份验证部分没问题,甚至我尝试了其他几个ADLS
FileSystemOperations
& ListFileStatus
- 这些工作正常。只有我的GetFileStatus
引发了上述错误,因此我想检查Delete
对ADLS
的{{1}}权限,其中Service Principal
- 角色和{{1} } Owner
文件夹的权限。
任何领导都会非常感激,如果在这方面需要进一步的信息,请告诉我。
答案 0 :(得分:0)
我注意到ADLS中有一些有趣的业务权限。
要仔细检查的一些事项:
如果你还没有完成(我确定你有),请再读一遍:
Access control in Azure Data Lake Store
密切关注权限的非级联性以及掩码的工作方式。
然而,正如你所说,用户拥有所有者权限,这应该意味着所有强大的功能。
尝试重新应用包括子项在内的权限(如果适用于您的安全模型),以查看是否可以解决问题。
我也想知道data lake diagnostics是否可能找到某些东西(我不确定,我自己也没看过)。
答案 1 :(得分:0)
最后能够解决它,我的错误基本上是我试图传递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");
}
}