首页 文章

Azure数据湖连接与数据工厂自定义活动

提问于
浏览
1

我在azure数据工厂中遇到自定义活动的问题 . 我想连接到其中的azure数据湖 . 我正在使用以下命名空间:

using Microsoft.Azure.Management.DataLake.Store;
using Microsoft.IdentityModel.Clients.ActiveDirectory
using Microsoft.Rest.Azure.Authentication;

这是我的代码:

public ConnectDataLakeStore(string applicationId, string applicationSecretKey, string tenantId)
    {
        var credentials = new ClientCredential(applicationId, applicationSecretKey);
        var creds = ApplicationTokenProvider.LoginSilentAsync(tenantId, credentials).Result;
        var fileSystemClient = new DataLakeStoreFileSystemManagementClient(creds);
    }

我得到以下异常:

Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> Microsoft.Azure.Management.DataLake.Store.Models.AdlsErrorException: Operation returned an invalid status code 'Forbidden'
   at Microsoft.Azure.Management.DataLake.Store.FileSystemOperations.<ListFileStatusWithHttpMessagesAsync>d__12.MoveNext()

当我在本地环境中运行自定义活动时,一切正常 . 部署到azure后出现问题 . 我还为广告应用程序提供了所有可能的权限 .

任何提示?

1 回答

  • 0

    我从你上面的评论中得知你已经解决了这个问题 . 但仍然认为值得为未来的类似问题增加一些细节 .

    首先使用您的服务主体和域详细信息创建凭据 .

    方法:

    private static ServiceClientCredentials AuthenticateAzure(string domainName, string clientID, string clientSecret)
        {
            SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
    
            var clientCredential = new ClientCredential(clientID, clientSecret);
            return ApplicationTokenProvider.LoginSilentAsync(domainName, clientCredential).Result;
        }
    

    也许从库配置或项目属性中获取值 .

    var creds = AuthenticateAzure(domainName, appId, appPass);
    

    接下来,根据您的需要创建数据湖帐户管理器或文件系统管理器的实例 .

    private static DataLakeStoreFileSystemManagementClient adlsFileSystemClient;
        private static DataLakeStoreAccountManagementClient adlsAccountManagementClient;
    
        adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(creds);
        adlsAccountManagementClient = new DataLakeStoreAccountManagementClient(creds);
    

    接下来创建类似下面的方法来将文件上传到data lake store .

    上传器的执行速度比创建文件方法快 .

    private static void UploadFile(string srcFilePath, string destFilePath, string accName, bool force = true)
        {
            var parameters = new UploadParameters(srcFilePath, destFilePath, accName, isOverwrite: force);
            var frontend = new DataLakeStoreFrontEndAdapter(accName, adlsFileSystemClient);
            var uploader = new DataLakeStoreUploader(parameters, frontend);
            uploader.Execute();
        }
    

    资料来源:

    ADF Custom Activities https://www.purplefrogsystems.com/paul/2016/11/creating-azure-data-factory-custom-activities/

    ADL Auth https://www.purplefrogsystems.com/paul/2016/12/azure-data-lake-authentication-from-azure-data-factory/

    希望这可以帮助

相关问题