Pipelines e atividades no Azure Data Factory e no Azure Synapse Analytics

APLICA-SE A: Azure Data Factory Azure Synapse Analytics

Importante

O suporte para o Estúdio de ML (clássico) terminará a 31 de agosto de 2024. Recomendamos a transição para o Azure Machine Learning até essa data.

A partir de 1 de dezembro de 2021, não poderá criar novos recursos do Machine Learning Studio (clássico) (área de trabalho e plano de serviço Web). Até 31 de agosto de 2024, pode continuar a utilizar as experimentações e serviços Web existentes do Machine Learning Studio (clássico).

A documentação do Estúdio de ML (clássico) está a ser descontinuada e poderá não ser atualizada no futuro.

Este artigo ajuda-o a compreender os pipelines e as atividades no Azure Data Factory e no Azure Synapse Analytics e a utilizá-los para construir fluxos de trabalho orientados por dados ponto a ponto para os seus cenários de movimento de dados e processamento de dados.

Descrição Geral

Uma Área de Trabalho do Data Factory ou do Synapse pode ter um ou mais pipelines. Um pipeline é um agrupamento lógico de atividades que, em conjunto, executam uma tarefa. Por exemplo, um pipeline pode conter um conjunto de atividades que ingerem e limpam dados de registos e, em seguida, iniciam um fluxo de dados de mapeamento para analisar os dados de registo. O pipeline permite-lhe gerir as atividades como um conjunto, em vez de cada uma individualmente. Implementa e agenda o pipeline, em vez das atividades de forma independente.

As atividades num pipeline definem as ações a executar nos seus dados. Por exemplo, pode utilizar uma atividade de cópia para copiar dados de SQL Server para um Armazenamento de Blobs do Azure. Em seguida, utilize uma atividade de fluxo de dados ou uma atividade do Databricks Notebook para processar e transformar dados do armazenamento de blobs num conjunto do Azure Synapse Analytics sobre o qual as soluções de relatórios de business intelligence são criadas.

Azure Data Factory e Azure Synapse Analytics têm três agrupamentos de atividades: atividades de movimento de dados, atividades de transformação de dados e atividades de controlo. Uma atividade pode utilizar zero ou mais conjuntos de dados de entrada e produzir um ou mais conjuntos de dados de saída. O diagrama seguinte mostra a relação entre o pipeline, a atividade e o conjunto de dados:

Relação entre conjuntos de dados, atividades e pipelines

Um conjunto de dados de entrada representa a entrada de uma atividade no pipeline e um conjunto de dados de saída representa o resultado da atividade. Os conjuntos de dados identificam dados dentro de diferentes arquivos de dados, como tabelas, ficheiros, pastas e documentos. Depois de criar um conjunto de dados, pode utilizá-lo com atividades num pipeline. Por exemplo, um conjunto de dados pode ser um conjunto de dados de entrada/saída de uma atividade Cópia ou de uma atividade HDInsightHive. Para obter mais informações sobre os conjuntos de dados, veja o artigo Datasets in Azure Data Factory (Conjuntos de Dados no Azure Data Factory).

Atividades de movimento de dados

A Atividade de Cópia no Data Factory copia os dados de um arquivo de dados de origem para um arquivo de dados sink. O Data Factory suporta os arquivos de dados apresentados na tabela nesta secção. Os dados de qualquer origem podem ser escritos em qualquer sink.

Para obter mais informações, veja o artigo Copy Activity - Overview (Atividade de Cópia - Descrição Geral).

Clique num arquivo de dados para saber como copiar dados de e para esse arquivo.

Categoria Arquivo de dados Suportado como origem Suportado como sink Suportado pelo IR do Azure Suportado pelo IR autoalojado
Azure Armazenamento de Blobs do Azure
  Índice do Azure Cognitive Search
  Azure Cosmos DB para NoSQL
  Azure Cosmos DB para MongoDB
  Azure Data Explorer
  Armazenamento do Azure Data Lake Ger1
  Azure Data Lake Storage Gen2 (Armazenamento do Azure Data Lake Gen2)
  Azure Database for MariaDB
  Base de Dados do Azure para MySQL
  Base de Dados do Azure para PostgreSQL
  Delta Lake no Azure Databricks
  Ficheiros do Azure
  Base de Dados SQL do Azure
  Instância Gerida do SQL no Azure
  Azure Synapse Analytics
  Armazenamento de tabelas do Azure
Base de Dados Amazon RDS para Oracle
  Amazon RDS para SQL Server
  Amazon Redshift
  DB2
  Drill
  Google BigQuery
  Greenplum
  HBase
  Hive
  Apache Impala
  Informix
  MariaDB
  Microsoft Access
  MySQL
  Netezza
  Oracle
  Phoenix
  PostgreSQL
  Presto
  SAP Business Warehouse via Open Hub
  SAP Business Warehouse via MDX
  SAP HANA Sink suportado apenas com o Conector ODBC e o controlador ODBC sap HANA
  Tabela SAP
  Snowflake
  Spark
  SQL Server
  Sybase
  Teradata
  Vertica
NoSQL Cassandra
  Couchbase (Pré-visualização)
  MongoDB
  MongoDB Atlas
Ficheiro Amazon S3
  Armazenamento Compatível com o Amazon S3
  Sistema de Ficheiros
  FTP
  Google Cloud Storage
  HDFS
  Google Cloud Storage
  SFTP
Protocolo genérico HTTP genérico
  OData genérico
  ODBC genérico
  REST genérico
Serviços e aplicações Serviço Web do Amazon Marketplace
  Concur (Pré-visualização)
  Dataverse
  Dynamics 365
  Dynamics AX
  Dynamics CRM
  AdWords do Google
  HubSpot
  Jira
  Magento (Pré-visualização)
  Marketo (Pré-visualização)
  Microsoft 365
  Oracle Eloqua (Pré-visualização)
  Oracle Responsys (Pré-visualização)
  Oracle Service Cloud (Pré-visualização)
  PayPal (Pré-visualização)
  QuickBooks (Pré-visualização)
  Salesforce
  Salesforce Service Cloud
  Salesforce Marketing Cloud
  SAP Cloud for Customer (C4C)
  SAP ECC
  ServiceNow
Lista do SharePoint Online
  Shopify (Pré-visualização)
  Square (Pré-visualização)
  Tabela Web (tabela HTML)
  Xero
  Zoho (Pré-visualização)

Nota

Se um conector estiver marcado como Pré-visualização, pode experimentá-lo e enviar-nos comentários. Se quiser realizar uma dependência em conectores de pré-visualização na sua solução, contacte o suporte do Azure.

Atividades de transformação de dados

Azure Data Factory e Azure Synapse Analytics suportam as seguintes atividades de transformação que podem ser adicionadas individualmente ou em cadeia com outra atividade.

Para obter mais informações, veja o artigo Data Transformation Activities (Atividades de Transformação de Dados).

Atividade de transformação de dados Ambiente de computação
Fluxo de Dados Clusters do Apache Spark geridos por Azure Data Factory
Função do Azure Funções do Azure
Hive HDInsight [Hadoop]
Pig HDInsight [Hadoop]
MapReduce HDInsight [Hadoop]
Hadoop Streaming HDInsight [Hadoop]
Spark HDInsight [Hadoop]
Atividades do ML Studio (clássico): Execução em Lote e Atualizar Recurso VM do Azure
Procedimento Armazenado SQL do Azure, Azure Synapse Analytics ou SQL Server
U-SQL Azure Data Lake Analytics
Atividade Personalizada Azure Batch
Databricks Notebook Azure Databricks
Atividade Jar do Databricks Azure Databricks
Atividade Python do Databricks Azure Databricks

Atividades de fluxo de controlo

São suportadas as atividades de fluxo de controlo abaixo:

Atividade de controlo Descrição
Acrescentar Variável Adicione um valor a uma variável de matriz existente.
Executar Pipeline A atividade Executar Pipeline permite que um pipeline do Data Factory ou do Synapse invoque outro pipeline.
Filtro Aplicar uma expressão de filtro a uma matriz de entrada
Para Cada A atividade ForEach define um fluxo de controlo de repetição no seu pipeline. Esta atividade é utilizada para iterar uma coleção e executa atividades especificadas em ciclo. A implementação de ciclo desta atividade é semelhante à estrutura de ciclo Foreach nas linguagens de programação.
Obter Metadados A atividade GetMetadata pode ser utilizada para obter metadados de quaisquer dados num pipeline do Data Factory ou do Synapse.
Atividade Se Condição Se Condição pode ser utilizada com base em ramos numa condição que é avaliada como verdadeira ou falsa. A atividade Se Condição disponibiliza a mesma funcionalidade que as instruções “se” fornecem nas linguagens de programação. Avalia um conjunto de atividades quando a condição é avaliada true como e outro conjunto de atividades quando a condição é avaliada como false.
Atividade de Pesquisa A atividade de Pesquisa pode ser utilizada para ler ou procurar registos/nomes de tabelas/valores em qualquer origem externa. Este resultado pode ser ainda referenciado por atividades subsequentes.
Definir Variável Defina o valor de uma variável existente.
Até a Atividade Implementa o ciclo Do-Until que é semelhante à estrutura de ciclo Do-Until nas linguagens de programação. Executa um conjunto de atividades num ciclo até que a condição associada às atividades seja avaliada como verdadeira. Pode especificar um valor de tempo limite para a atividade until.
Atividade de Validação Confirme que um pipeline só continua a ser executado se existir um conjunto de dados de referência, cumprir um critério especificado ou se tiver sido atingido um tempo limite.
Aguardar Atividade Quando utiliza uma atividade de Espera num pipeline, o pipeline aguarda pelo tempo especificado antes de continuar com a execução de atividades subsequentes.
Atividade Web A Atividade Web pode ser utilizada para chamar um ponto final REST personalizado a partir de um pipeline. Pode transmitir conjuntos de dados e serviços ligados aos quais a atividade tem acesso e que pode consumir.
Atividade de Webhook Com a atividade do webhook, chame um ponto final e transmita um URL de chamada de retorno. A execução do pipeline aguarda que a chamada de retorno seja invocada antes de avançar para a atividade seguinte.

Criar um pipeline com a IU

Para criar um novo pipeline, navegue para o separador Autor no Data Factory Studio (representado pelo ícone de lápis), clique no sinal de adição e selecione Pipeline no menu e Pipeline novamente a partir do submenu.

Mostra os passos para criar um novo pipeline com o Azure Data Factory Studio.

A fábrica de dados apresentará o editor de pipelines onde pode encontrar:

  1. Todas as atividades que podem ser utilizadas no pipeline.
  2. A tela do editor de pipelines, onde as atividades serão apresentadas quando adicionadas ao pipeline.
  3. O painel de configurações do pipeline, incluindo parâmetros, variáveis, definições gerais e saída.
  4. O painel de propriedades do pipeline, onde o nome do pipeline, a descrição opcional e as anotações podem ser configurados. Este painel também mostrará quaisquer itens relacionados com o pipeline na fábrica de dados.

Mostra o painel editor de pipelines no Azure Data Factory studio com cada uma das secções descritas acima realçadas.

JSON dos pipelines

Eis como os pipelines são definidos no formato JSON:

{
    "name": "PipelineName",
    "properties":
    {
        "description": "pipeline description",
        "activities":
        [
        ],
        "parameters": {
        },
        "concurrency": <your max pipeline concurrency>,
        "annotations": [
        ]
    }
}
Etiqueta Descrição Tipo Necessário
name Nome do pipeline. Especifique um nome que represente a ação que o pipeline realiza.
  • Número máximo de carateres: 140
  • Tem de começar com uma letra, um número ou um caráter de sublinhado (_)
  • Não são permitidos os seguintes carateres: ".", "+", "?", "/", "<",">","*"," %"," &"":"," "
String Yes
descrição Especifique o texto que descreve para o que é utilizado o pipeline. String No
atividades A secção atividades pode ter uma ou mais atividades definidas na mesma. Veja a secção JSON da Atividade para obter detalhes sobre o elemento JSON das atividades. Matriz Yes
parâmetros A secção parâmetros pode ter um ou mais parâmetros definidos no pipeline, tornando-o flexível para reutilização. Lista No
simultaneidade O número máximo de execuções simultâneas que o pipeline pode ter. Por predefinição, não existe um máximo. Se o limite de simultaneidade for atingido, as execuções adicionais do pipeline serão apresentadas em fila até serem concluídas as anteriores Número No
anotações Uma lista de etiquetas associadas ao pipeline Matriz No

JSON da Atividade

A secção atividades pode ter uma ou mais atividades definidas na mesma. Existem dois tipos principais de atividades: atividades de Execução e de Controlo.

Atividades de Execução

As atividades de execução incluem atividades de movimento de dados e de transformação de dados. Têm a estrutura de nível superior abaixo:

{
    "name": "Execution Activity Name",
    "description": "description",
    "type": "<ActivityType>",
    "typeProperties":
    {
    },
    "linkedServiceName": "MyLinkedService",
    "policy":
    {
    },
    "dependsOn":
    {
    }
}

A tabela seguinte descreve as propriedades na definição JSON da atividade:

Etiqueta Descrição Necessário
name Nome da atividade. Especifique um nome que represente a ação que a atividade realiza.
  • Número máximo de carateres: 55
  • Tem de começar com um número de letra ou um caráter de sublinhado (_)
  • Não são permitidos os seguintes carateres: ".", "+", "?", "/", "<",">","*"," %"," &"":"," "
Yes
descrição Texto que descreve para o que é utilizada a atividade Yes
tipo Tipo de atividade. Veja as secções Atividades de Movimento de Dados, Atividades de Transformação de Dados e Atividades de Controlo para obter diferentes tipos de atividades. Yes
linkedServiceName Nome do serviço ligado utilizado pela atividade.

Uma atividade pode exigir que especifique o serviço ligado que liga ao ambiente de computação necessário.
Sim para Atividade do HDInsight, Atividade de Classificação em Lote do ML Studio (clássico), Atividade de Procedimento Armazenado.

Não para todas as outras.
typeProperties As propriedades na secção typeProperties dependem de cada tipo de atividade. Para ver as propriedades do tipo de uma atividade, clique nas ligações para a atividade na secção anterior. No
política Políticas que afetam o comportamento de runtime da atividade. Esta propriedade inclui um tempo limite e um comportamento de repetição. Se não for especificado, são utilizados valores predefinidos. Para obter mais informações, veja a secção Política das atividades. No
dependsOn Esta propriedade é utilizada para definir as dependências de atividade e de que forma as atividades subsequentes dependem de atividades anteriores. Para obter mais informações, veja Dependência das atividades No

Política das atividades

As políticas afetam o comportamento de tempo de execução de uma atividade, dando opções de configuração. As políticas das Atividades só estão disponíveis para as atividades de execução.

Definição JSON da política de atividade

{
    "name": "MyPipelineName",
    "properties": {
      "activities": [
        {
          "name": "MyCopyBlobtoSqlActivity",
          "type": "Copy",
          "typeProperties": {
            ...
          },
         "policy": {
            "timeout": "00:10:00",
            "retry": 1,
            "retryIntervalInSeconds": 60,
            "secureOutput": true
         }
        }
      ],
        "parameters": {
           ...
        }
    }
}
Nome JSON Descrição Valores Permitidos Necessário
tempo limite Especifica o tempo limite para a execução da atividade. Timespan N.º O tempo limite predefinido é de 12 horas.
retry Número máximo de repetições Número inteiro N.º A predefinição é 0
retryIntervalInSeconds O atraso entre as tentativas de repetição em segundos Número inteiro N.º A predefinição é 30 segundos
secureOutput Quando definido como verdadeiro, o resultado da atividade é considerado seguro e não é registado para monitorização. Booleano N.º A predefinição é falso.

Atividade de controlo

As atividades de controlo têm a estrutura de nível superior seguinte:

{
    "name": "Control Activity Name",
    "description": "description",
    "type": "<ActivityType>",
    "typeProperties":
    {
    },
    "dependsOn":
    {
    }
}
Etiqueta Descrição Necessário
name Nome da atividade. Especifique um nome que represente a ação que a atividade realiza.
  • Número máximo de carateres: 55
  • Tem de começar com uma letra, um número ou um caráter de sublinhado (_)
  • Não são permitidos os seguintes carateres: ".", "+", "?", "/", "<",">","*"," %"," &"":"," "
Yes
    descrição Texto que descreve para o que é utilizada a atividade Yes
    tipo Tipo de atividade. Veja os diferentes tipos de atividades nas secções sobre as atividades de movimento de dados, as atividades de transformação de dados e as atividades de controlo. Yes
    typeProperties As propriedades na secção typeProperties dependem de cada tipo de atividade. Para ver as propriedades do tipo de uma atividade, clique nas ligações para a atividade na secção anterior. No
    dependsOn Esta propriedade é utilizada para definir a Dependência da Atividade e de que forma as atividades subsequentes dependem de atividades anteriores. Para obter mais informações, veja Dependência de atividade. No

    Dependência das atividades

    A Dependência de Atividade define como as atividades subsequentes dependem de atividades anteriores, determinando a condição de continuar a executar a tarefa seguinte. Uma atividade pode depender de uma ou várias atividades anteriores com condições de dependência diferentes.

    As condições de dependência diferentes são: Bem-sucedida, Falha, Ignorada, Concluída.

    Por exemplo, se um pipeline tiver Atividade A –> Atividade B, os diferentes cenários que podem ocorrer são:

    • A Atividade B tem a condição de dependência de a Atividade A ser bem-sucedida - a Atividade B só é executada se o estado final de A for “bem-sucedida”
    • A Atividade B tem a condição de dependência de a Atividade A falhar - a Atividade B só é executada se o estado final de A for “falha”
    • A Atividade B tem a condição de dependência de a Atividade A ser concluída - a Atividade B só é executada se o estado final de A for “concluída”
    • A Atividade B tem uma condição de dependência na Atividade A com ignorada: a Atividade B é executada se a Atividade A tiver um estado final de ignorada. Ignorada ocorre no cenário de Atividade X –> Atividade Y –> Atividade Z, em que cada atividade é executada apenas se a atividade anterior for bem-sucedida. Se a Atividade X falhar, a Atividade Y tem o estado "Ignorado" porque nunca é executado. Da mesma forma, a Atividade Z também tem o estado "Ignorado".

    Exemplo: a Atividade 2 depende de a Atividade 1 ser bem-sucedida

    {
        "name": "PipelineName",
        "properties":
        {
            "description": "pipeline description",
            "activities": [
             {
                "name": "MyFirstActivity",
                "type": "Copy",
                "typeProperties": {
                },
                "linkedServiceName": {
                }
            },
            {
                "name": "MySecondActivity",
                "type": "Copy",
                "typeProperties": {
                },
                "linkedServiceName": {
                },
                "dependsOn": [
                {
                    "activity": "MyFirstActivity",
                    "dependencyConditions": [
                        "Succeeded"
                    ]
                }
              ]
            }
          ],
          "parameters": {
           }
        }
    }
    
    

    Pipeline de cópia de exemplo

    No pipeline de exemplo seguinte, existe uma atividade do tipo Cópia na secção activities. Neste exemplo, a atividade de cópia copia dados de um armazenamento de Blobs do Azure para uma base de dados na Base de Dados do SQL do Azure.

    {
      "name": "CopyPipeline",
      "properties": {
        "description": "Copy data from a blob to Azure SQL table",
        "activities": [
          {
            "name": "CopyFromBlobToSQL",
            "type": "Copy",
            "inputs": [
              {
                "name": "InputDataset"
              }
            ],
            "outputs": [
              {
                "name": "OutputDataset"
              }
            ],
            "typeProperties": {
              "source": {
                "type": "BlobSource"
              },
              "sink": {
                "type": "SqlSink",
                "writeBatchSize": 10000,
                "writeBatchTimeout": "60:00:00"
              }
            },
            "policy": {
              "retry": 2,
              "timeout": "01:00:00"
            }
          }
        ]
      }
    }
    

    Tenha em atenção os seguintes pontos:

    • Na secção atividades, existe apenas uma atividade cujo type está definido como Copy.
    • A entrada da atividade está definida como InputDataset e a saída como OutputDataset. Veja o artigo Conjuntos de dados para saber como definir conjuntos de dados em JSON.
    • Na secção typeProperties, BlobSource está especificado como o tipo de origem e SqlSink como o tipo de sink. Na secção atividades de movimento de dados, clique no arquivo de dados que pretende utilizar como origem ou sink para saber mais sobre como mover dados de/para esse arquivo.

    Para obter instruções completas sobre como criar este pipeline, veja Início Rápido: criar um Data Factory.

    Pipeline de transformação de exemplos

    No pipeline de exemplo seguinte, existe uma atividade do tipo HDInsightHive na secção activities. Neste exemplo, a atividade Hive do HDInsight transforma dados de um armazenamento de Blobs do Azure mediante a execução de um ficheiro de script de Hive num cluster do Hadoop para o Azure HDInsight.

    {
        "name": "TransformPipeline",
        "properties": {
            "description": "My first Azure Data Factory pipeline",
            "activities": [
                {
                    "type": "HDInsightHive",
                    "typeProperties": {
                        "scriptPath": "adfgetstarted/script/partitionweblogs.hql",
                        "scriptLinkedService": "AzureStorageLinkedService",
                        "defines": {
                            "inputtable": "wasb://adfgetstarted@<storageaccountname>.blob.core.windows.net/inputdata",
                            "partitionedtable": "wasb://adfgetstarted@<storageaccountname>.blob.core.windows.net/partitioneddata"
                        }
                    },
                    "inputs": [
                        {
                            "name": "AzureBlobInput"
                        }
                    ],
                    "outputs": [
                        {
                            "name": "AzureBlobOutput"
                        }
                    ],
                    "policy": {
                        "retry": 3
                    },
                    "name": "RunSampleHiveActivity",
                    "linkedServiceName": "HDInsightOnDemandLinkedService"
                }
            ]
        }
    }
    

    Tenha em atenção os seguintes pontos:

    • Na secção “activities”, existe apenas uma atividade cujo type está definido como HDInsightHive.
    • O ficheiro de script do Hive, partitionweblogs.hql, é armazenado na conta de Armazenamento do Azure (especificada pelo scriptLinkedService, denominado AzureStorageLinkedService) e na pasta script no contentor adfgetstarted.
    • A secção defines é utilizada para especificar as definições de runtime que são transmitidas ao script do Hive como valores de configuração do Hive (por exemplo, ${hiveconf:inputtable} e ${hiveconf:partitionedtable}).

    A secção typeProperties é diferente para cada atividade de transformação. Para saber mais sobre as propriedades de tipos suportadas para atividades de transformação, clique na atividade de transformação em Atividades de transformação de dados.

    Para obter instruções completas para criar este pipeline, veja Tutorial: transformar dados com o Spark.

    Múltiplas atividades num pipeline

    Os dois pipelines de exemplo anteriores só contêm uma atividade. Pode ter mais de uma atividade num pipeline. Se tiver múltiplas atividades num pipeline e as atividades subsequentes não estiverem dependentes das atividades anteriores, as atividades podem ser executadas em paralelo.

    Pode utilizar a dependência das atividades para encadear duas atividades; a dependência define de que forma é que as atividades subsequentes dependem das atividades anteriores, determinando a condição de continuação da execução da tarefa seguinte. Uma atividade pode depender de uma ou várias atividades anteriores com condições de dependência diferentes.

    Agendamento de pipelines

    Os pipelines são agendados por acionadores. Existem diferentes tipos de acionadores (acionador scheduler, que permite que os pipelines sejam acionados numa agenda de relógios de parede, bem como o acionador manual, que aciona pipelines a pedido). Para obter mais informações sobre os acionadores, veja o artigo Pipeline execution and triggers (Execução e acionadores de pipelines).

    Para que o seu acionador arranque uma execução de pipeline, tem de incluir uma referência ao pipeline desse pipeline na definição do acionador. & Os acionadores de pipelines têm uma relação n-m. Múltiplos acionadores podem arrancar um pipeline individual e o mesmo acionador pode arrancar vários pipelines. Quando o acionador estiver definido, tem de iniciá-lo para que o mesmo comece a acionar o pipeline. Para obter mais informações sobre os acionadores, veja o artigo Pipeline execution and triggers (Execução e acionadores de pipelines).

    Por exemplo, digamos que tem um acionador scheduler, "Acionador A", que pretendo iniciar o meu pipeline, "MyCopyPipeline". Defina o acionador, conforme mostrado no exemplo seguinte:

    Definição do Acionador A

    {
      "name": "TriggerA",
      "properties": {
        "type": "ScheduleTrigger",
        "typeProperties": {
          ...
          }
        },
        "pipeline": {
          "pipelineReference": {
            "type": "PipelineReference",
            "referenceName": "MyCopyPipeline"
          },
          "parameters": {
            "copySourceName": "FileSource"
          }
        }
      }
    }
    

    Passos seguintes

    Veja os tutoriais seguintes para obter instruções passo a passo para criar pipelines com atividades:

    Como obter CI/CD (integração contínua e entrega) com Azure Data Factory