Azure数据工厂管道

时间:2016-12-07 11:59:13

标签: azure azure-data-factory

我想为Azure blob conainters创建链接服务,其帐户信息来自Azure SQL数据库。由于条目和帐户信息的数量是动态的,因此我无法在Azure数据工厂的设置部分中定义Azure blob容器的链接服务。 Azure数据工厂中的链接服务可以直接动态创建吗?

7 个答案:

答案 0 :(得分:2)

不幸的是,在当前版本的ADF中这是不可能的。您只能使用函数来引用与管道执行相关的元素(执行日期/时间)。您无法使用其他数据源动态定义Blob名称。

  

您可以使用数据工厂中的功能以及上述功能   系统变量用于以下目的:

     
      
  1. 指定数据选择查询(请参阅引用的连接器文章   通过数据移动活动文章。调用数据的语法   工厂功能是:$$用于数据选择查询等   活动和数据集中的属性。
  2.   
  3. 使用活动中的数据工厂函数指定输入依赖项   输入集合(见上面的示例)。指定时不需要$$   输入依赖表达式。
  4.   

从这里开始:https://docs.microsoft.com/en-us/azure/data-factory/data-factory-functions-variables

这就是你目前用blob输入做的一切:https://docs.microsoft.com/en-us/azure/data-factory/data-factory-azure-blob-connector

在你的情况下,我建议如果你可以重新定义你的输入blob,以获得可以从执行管道的日期/时间派生的名称/文件夹,而不是你可以获得该功能。

或者你可以进行一次从sql获取信息的usql调用,然后将blob移动到一个带日期戳的文件夹中,管道可以接收该文件夹。

答案 1 :(得分:0)

我认为通过将Powershell脚本与数据工厂cmdlet和Azure功能相结合来运行它们是可能的。因此,PowerShell需要连接并从存储中获取schmas,创建数据集并部署它们,更改管道,设置pipline计划和添加/删除元素,然后恢复(或仅设置当天的管道启动)过程。但这需要做很多工作。

但是现在预览版本2中的Data Factory提供了更多选项,包括使用SSIS,因此可以解决这个问题。

答案 2 :(得分:0)

我实际上是使用python sdk进行此操作的,不仅对链接服务进行此操作,而且对于每个Activity,我的所有元数据都存储在SQL Server表中(我称之为adf.Mapping),该表具有以下列:source_linked_service_name,source_dataset,target_linked_service_name,target_dataset

创建链接服务所需的元数据存储在另一个表中,我只是通过使用linked_service_name来获得的,我有一个计划任务,该任务每天运行我的python脚本,如果使用提到的库进行了某些更改,它将更新链接服务以上:

properties = SqlServerLinkedService(connection_string=connection_string,
                                                user_name=user_name,
                                                password=password,
                                                connect_via=ir_sql_server)

adf_client.adf_object.linked_services.create_or_update( resource_group_name=resource_group_name, factory_name=data_factory_name, linked_service_name=self.name, properties=properties)
logger.info('Created SQL Server linked service: ' + str(self.name))

答案 3 :(得分:0)

使用“执行SSIS包”任务可以在巫婆中运行ssis包,从而可以管理动态数据源。

enter image description here

第二种方法是使用“笔记本”任务。然后,您需要运行Python或Scala以连接到具有连接信息的源,然后以某种循环或其他方式创建数据集以实现目标。

enter image description here

在ADF(甚至是v2)中,通过使用ADF对象,您无法做到这一点。

答案 4 :(得分:0)

一种方法是使用Azure Databricks笔记本

另一种方法是参数化值

{
  "type":"Microsoft.DataFactory/factories/linkedservices",
  "properties":{
  "parameters": {
        "StorageAccountEndpoint": {
            "type": "String",
            "defaultValue": "https://<<yourstorageaccountname>>.blob.core.windows.net/?sv=2018-03-28&ss=b&srt=sco&sp=rwdlac&se=2019-10-20T16:33:57Z&st=2019-09-20T08:33:57Z&spr=https&sig=lDrBjD%2BjM2T1XjRW997VPMqDp99ZxVoReyRK0VEX7zQ%3D"
        }
    },
    "type": "AzureBlobStorage",
    "typeProperties": {
        "sasUri": "@{linkedService().StorageAccountEndpoint}"
    }

}}

答案 5 :(得分:0)

您可以使用参数化的链接服务来执行此操作,例如:

{
    "name": "AzureBlobStorage1",
    "properties": {
        "type": "AzureBlobStorage",
        "annotations": [],
        "parameters": {
            "storageAccountName": {
                "type": "string"
            }
        },
        "typeProperties": {
            "serviceEndpoint": "@{concat('https://',linkedService().storageAccountName,'.blob.core.windows.net')}",
            "accountKind": "StorageV2"
        }
    }
}

此代码仅允许您使用存储帐户名称,但是您可以根据需要使用完整的URL。

然后使用2个参数创建一个数据集:

  • 存储帐户名
  • 容器名称

enter image description here

然后您的数据集将如下所示:

enter image description here

在此示例中,我使用了二进制格式的数据集,但是请选择适合自己的内容。

几乎所有连接器都可以完全参数化,但并非所有人都允许从UI中进行设置;您需要像我一样在JSON中进行操作。

答案 6 :(得分:0)

P.S.--> 我没有处理动态存储帐户名称,但我已经为 ADF 管道中一个数据库帐户中的多个数据库名称动态处理了它。希望有帮助。

Azure 数据工厂中的链接服务可以动态配置为在执行时接受参数值。这些服务在 Azure 中称为参数化链接服务

您需要在链接服务中将动态/变化的值配置为参数,然后在运行时从配置文件中引用它们的值。可以通过 AzureDatafactory Pipeline 的查找活动来考虑配置文件。

显示了一个动态获取 Cosmos DB 名称的示例参数化链接服务以供参考:这里的 DBName 是在触发管道时将与实际的 DB 名称值一起传递的参数。

{
    "name": "ls_name_xyz",
    "type": "Microsoft.DataFactory/factories/linkedservices",
    "properties": {
        "type": "CosmosDbMongoDbApi",
        "parameters": {
            "DBName": {
                "type": "String"
            }
        },
        "annotations": [],
        "typeProperties": {
            "connectionString": "your_connection_string-xyz",
            "database": "@{linkedService().DBName}",
            "encryptedCredential": "your_credentials-xyz"
        }
    }
}