从数据湖 (gen1) 复制到 blob 存储时,数据工厂失去权限
data factory loses permissions when copying from data lake (gen1) to blob storage
数据工厂在尝试从数据湖 gen1 复制到 blob 存储时出现此错误:
"message": "Failure happened on 'Sink' side. ErrorCode=UserErrorFailedFileOperation,
'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Upload file failed at
path myblobcontainer\file_that_im_tryin_to_copy.xml.,Source=Microsoft.DataTransfer.Common,''Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Failed to read a 'AzureDataLakeStore' file. File path: 'SourceFolderInDataLake/2019/09/26/SomeOtherFile.usql'.,Source=Microsoft.DataTransfer.ClientLibrary,''Type=System.Net.WebException,Message=The remote server returned an error: (403) Forbidden.
我有一个 U-SQL Script
activity 将执行 1-Patient.usql
:
接下来 activity 是 copy data
步骤:
来源
下沉
我已经使用 this tutorial 配置了 roles/permissions。
我可以通过 Data Explorer --> Access
:
解决这个问题
然后我点击 Advanced
:
点击Apply to all children
后,复制成功!
请注意 先于 Copy Data
activity,数据工厂正在 gen1
中执行 usql
脚本.该脚本存储在 gen1 中,它在数据湖和文件夹中生成文件。 从来没有任何权限问题运行这个脚本。
我做错了什么?
我可以重现你的问题。实际上 Apply folder permissions to sub-folders
是没有必要的。问题应该是data lake gen1的访问控制问题,问题的关键是上传文件的顺序和权限设置。
您可以先查看Access control in Azure Data Lake Storage Gen1,然后参考下面我测试的信息。
我假设您将如下所示的权限添加到根 /
。
如果您的文件在设置权限前已经存在,则操作会影响该文件,即设置该文件的访问权限,您可以访问该文件。
但是如果设置权限后上传文件或新建文件夹,文件夹和文件将没有访问权限,您将无法访问它们。可以select文件,点击Access
直接查看
设置完上面的权限后,如果再设置A default permission entry
,不会影响已有的文件夹和文件,但如果新建文件夹和文件,就会获得所有文件夹和文件的访问权限.即旧文件夹和文件仍然无法访问,新文件夹和文件将可以访问。如果你想获得旧的访问权限,只需再次像截图一样添加权限,Apply folder permissions to sub-folders
是相同的逻辑。
总而言之,如果您希望您的服务 principal/MSI 访问数据湖中的所有文件,您可以添加第三个选项 An access permission entry and a default permission entry
,然后您将能够访问现有的和新的 folders/files.
数据工厂在尝试从数据湖 gen1 复制到 blob 存储时出现此错误:
"message": "Failure happened on 'Sink' side. ErrorCode=UserErrorFailedFileOperation,
'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Upload file failed at
path myblobcontainer\file_that_im_tryin_to_copy.xml.,Source=Microsoft.DataTransfer.Common,''Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Failed to read a 'AzureDataLakeStore' file. File path: 'SourceFolderInDataLake/2019/09/26/SomeOtherFile.usql'.,Source=Microsoft.DataTransfer.ClientLibrary,''Type=System.Net.WebException,Message=The remote server returned an error: (403) Forbidden.
我有一个 U-SQL Script
activity 将执行 1-Patient.usql
:
接下来 activity 是 copy data
步骤:
来源
下沉
我已经使用 this tutorial 配置了 roles/permissions。
我可以通过 Data Explorer --> Access
:
然后我点击 Advanced
:
点击Apply to all children
后,复制成功!
请注意 先于 Copy Data
activity,数据工厂正在 gen1
中执行 usql
脚本.该脚本存储在 gen1 中,它在数据湖和文件夹中生成文件。 从来没有任何权限问题运行这个脚本。
我做错了什么?
我可以重现你的问题。实际上 Apply folder permissions to sub-folders
是没有必要的。问题应该是data lake gen1的访问控制问题,问题的关键是上传文件的顺序和权限设置。
您可以先查看Access control in Azure Data Lake Storage Gen1,然后参考下面我测试的信息。
我假设您将如下所示的权限添加到根 /
。
如果您的文件在设置权限前已经存在,则操作会影响该文件,即设置该文件的访问权限,您可以访问该文件。
但是如果设置权限后上传文件或新建文件夹,文件夹和文件将没有访问权限,您将无法访问它们。可以select文件,点击Access
直接查看
设置完上面的权限后,如果再设置A default permission entry
,不会影响已有的文件夹和文件,但如果新建文件夹和文件,就会获得所有文件夹和文件的访问权限.即旧文件夹和文件仍然无法访问,新文件夹和文件将可以访问。如果你想获得旧的访问权限,只需再次像截图一样添加权限,Apply folder permissions to sub-folders
是相同的逻辑。
总而言之,如果您希望您的服务 principal/MSI 访问数据湖中的所有文件,您可以添加第三个选项 An access permission entry and a default permission entry
,然后您将能够访问现有的和新的 folders/files.