小前言:我正在使用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
部分进行调试,并面临以下问题-
Microsoft.Azure.Management.DataLake.Store.Models.AdlsErrorException 未由用户代码处理 HResult=-2146233088 消息 = 操作返回无效的状态代码"禁止" Source=Microsoft.Azure.Management.DataLake.Store 堆栈跟踪: at Microsoft.Azure.Management.DataLake.Store.FileSystemOperations.d__28.MoveNext(( --- 从引发异常的先前位置的堆栈跟踪结束--- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task( at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task( at Microsoft.Azure.Management.DataLake.Store.FileSystemOperationsExtensions.d__39.MoveNext(( --- 从引发异常的先前位置的堆栈跟踪结束--- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task( at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task( at Microsoft.Azure.Management.DataLake.Store.FileSystemOperationsExtensions.Delete(IFileSystemOperations operations, String accountName, String filePath, Nullable'1 recursive( at DataLakeApplication.DotNetADLApplication.ADLApplication(List'1 dataSetsToDelete( in C:\Projects\C#\DataLakeApplication\DataLakeApplication\Program.cs:line 117 内部异常:
delete
操作的代码片段:
var fileDeleterResult =
_adlsFileSystemClient.FileSystem.Delete(_adlsAccountName, strInputToDelete, null);
我在我的.NET代码中使用AAD Service Principal
与ADLS
进行通信,身份验证部分还可以,甚至我也尝试了其他几个FileSystemOperations
ListFileStatus
和GetFileStatus
- 这些工作正常。只有我的Delete
抛出了上述错误,所以我想重新检查我的Service Principal
ADLS
的权限,该权限被授予Owner
- 角色和RWX
对ADLS
文件夹的权限。
任何线索将不胜感激,如果在这方面需要任何进一步的信息,请告诉我。
我注意到 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("rn", 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");
}
}