Condividi tramite


Usare attività personalizzate in una pipeline di Azure Data Factory o di Azure Synapse Analytics

APPLICABILE A: Azure Data Factory Azure Synapse Analytics

Suggerimento

Data Factory in Microsoft Fabric è la nuova generazione di Azure Data Factory, con un'architettura più semplice, un'intelligenza artificiale predefinita e nuove funzionalità. Se non si ha familiarità con l'integrazione dei dati, iniziare con Fabric Data Factory. I carichi di lavoro di Azure Data Factory esistenti possono eseguire l'aggiornamento a Fabric per accedere a nuove funzionalità tra data science, analisi in tempo reale e creazione di report.

Esistono due tipi di attività che è possibile usare in una pipeline Azure Data Factory o Synapse.

Per spostare i dati da e verso un archivio dati non supportato dal servizio o per trasformare/elaborare i dati in modo non supportato dal servizio, è possibile creare un'attività personalizzata con la propria logica di spostamento o trasformazione dei dati e usare l'attività in una pipeline. L'attività personalizzata esegue la logica del codice personalizzata in un pool di macchine virtuali Azure Batch.

Nota

È consigliabile usare il modulo Az PowerShell Azure per interagire con Azure. Per iniziare, vedere Installare Azure PowerShell. Per informazioni su come eseguire la migrazione al modulo Az PowerShell, vedere Migrate Azure PowerShell da AzureRM ad Az.

Se si è nuovi al servizio Azure Batch, vedere gli articoli seguenti:

Importante

Quando si crea un nuovo pool di Azure Batch, è necessario usare 'VirtualMachineConfiguration' e NON 'CloudServiceConfiguration'.

Aggiungere attività personalizzate a una pipeline con l'interfaccia utente

Per usare un'attività personalizzata in una pipeline, completare la procedura seguente:

  1. Cercare Personalizza nel riquadro Attività della pipeline, quindi trascinare un'attività Personalizza nel canvas della pipeline.

  2. Selezionare la nuova attività Personalizzata nell'area di disegno, se non è già selezionata.

  3. Selezionare la scheda Azure Batch per selezionare o creare un nuovo servizio collegato Azure Batch che eseguirà l'attività personalizzata.

    Mostra l'interfaccia utente per un'attività personalizzata.

  4. Selezionare la scheda Impostazioni e specificare un comando da eseguire nel Azure Batch e dettagli avanzati facoltativi.

    Mostra l'interfaccia utente per la scheda Impostazioni per un'attività personalizzata.

Azure Batch servizio collegato

Il codice JSON seguente definisce un esempio Azure Batch servizio collegato. Per informazioni dettagliate, vedere Ambienti di calcolo supportati

{
    "name": "AzureBatchLinkedService",
    "properties": {
        "type": "AzureBatch",
        "typeProperties": {
            "accountName": "batchaccount",
            "accessKey": {
                "type": "SecureString",
                "value": "access key"
            },
            "batchUri": "https://batchaccount.region.batch.azure.com",
            "poolName": "poolname",
            "linkedServiceName": {
                "referenceName": "StorageLinkedService",
                "type": "LinkedServiceReference"
            }
        }
    }
}

Per ulteriori informazioni sul servizio collegato Azure Batch, consultare l'articolo Servizi collegati di calcolo.

Attività personalizzata

Il frammento di codice JSON seguente definisce una pipeline con una semplice attività personalizzata. La definizione dell'attività ha un riferimento al servizio collegato Azure Batch.

{
  "name": "MyCustomActivityPipeline",
  "properties": {
    "description": "Custom activity sample",
    "activities": [{
      "type": "Custom",
      "name": "MyCustomActivity",
      "linkedServiceName": {
        "referenceName": "AzureBatchLinkedService",
        "type": "LinkedServiceReference"
      },
      "typeProperties": {
        "command": "helloworld.exe",
        "folderPath": "customactv2/helloworld",
        "resourceLinkedService": {
          "referenceName": "StorageLinkedService",
          "type": "LinkedServiceReference"
        }
      }
    }]
  }
}

In questo esempio, il helloworld.exe è un'applicazione personalizzata archiviata nella cartella customactv2/helloworld dell'account Archiviazione di Azure usato nella risorsaLinkedService. L'attività Personalizzata invia l'applicazione personalizzata da eseguire in Azure Batch. È possibile sostituire il comando con qualsiasi applicazione preferita che può essere eseguita nel sistema operativo di destinazione dei nodi pool Azure Batch.

Nella tabella seguente vengono descritti i nomi e le descrizioni delle proprietà specifiche per questa attività.

Proprietà Descrizione Richiesto
nome Nome dell'attività nella pipeline
descrizione Testo che descrive l'attività. No
tipo Per l'attività personalizzata, il tipo corrisponde a Custom.
NomeServizioCollegato Servizio collegato a Azure Batch. Per informazioni su questo servizio collegato, vedere l'articolo Servizi collegati di calcolo.
Comando Comando dell'applicazione personalizzata da eseguire. Se l'applicazione è già disponibile nel nodo del pool Azure Batch, è possibile ignorare la risorsaLinkedService e folderPath. Ad esempio, è possibile specificare il comando da cmd /c dir, supportato in modo nativo dal nodo del pool batch di Windows.
resourceLinkedService Archiviazione di Azure servizio collegato all'account di archiviazione in cui è archiviata l'applicazione personalizzata No*
folderPath Percorso della cartella dell'applicazione personalizzata e di tutte le relative dipendenze

Se sono presenti dipendenze archiviate in sottocartelle, ovvero in una struttura di cartelle gerarchica in folderPath, la struttura di cartelle è attualmente appiattita quando i file vengono copiati in Azure Batch. Vale a dire, tutti i file vengono copiati in un'unica cartella senza sottocartelle. Per ovviare a questo comportamento, si potrebbe valutare di comprimere i file, copiare il file compresso e poi decomprimerlo con codice personalizzato nella posizione desiderata.
No*
oggetti di riferimento Matrice di servizi collegati e set di dati esistenti. I servizi collegati e i set di dati a cui si fa riferimento vengono passati all'applicazione personalizzata in formato JSON, in modo che il codice personalizzato possa fare riferimento alle risorse del servizio No
extendedProperties Proprietà definite dall'utente che possono essere passate all'applicazione personalizzata in formato JSON. Il codice personalizzato può quindi fare riferimento a proprietà aggiuntive No
retentionTimeInDays Tempo di conservazione per i file inviati per l'attività personalizzata. Il valore predefinito è 30 giorni. No

* Le proprietà resourceLinkedService e folderPath devono essere specificate o entrambe o entrambe omesse.

Nota

Se si passano come oggetti di riferimento i servizi collegati nell'attività personalizzata, è una buona pratica di sicurezza utilizzare un servizio collegato abilitato da Azure Key Vault (poiché non contiene stringhe protette) e recuperare le credenziali dal codice utilizzando direttamente il nome del segreto da Key Vault. È possibile trovare un esempio here che fa riferimento al servizio collegato abilitato per AKV, recupera le credenziali da Key Vault e quindi accede alla risorsa di archiviazione nel codice.

Nota

Attualmente è supportato solo Azure Blob Storage per resourceLinkedService nell'attività personalizzata; è l'unico servizio collegato che viene creato automaticamente, e non c'è alcuna opzione per scegliere altri connettori come ADLS Gen2.

Autorizzazioni per le attività personalizzate

L'attività personalizzata imposta l'account utente automatico di Azure Batch su Utente non amministratore con ambito attività (specifica predefinita dell'utente automatico). Non è possibile modificare il livello di autorizzazione dell'account utente automatico. Per altre informazioni, vedere Eseguire attività con account utente in Batch | Account utente automatici.

Esecuzione di comandi

È possibile eseguire direttamente un comando tramite l'attività personalizzata. L'esempio seguente esegue il comando "echo hello world" sui nodi di destinazione del pool di Azure Batch e stampa l'output su stdout.

{
  "name": "MyCustomActivity",
  "properties": {
    "description": "Custom activity sample",
    "activities": [{
      "type": "Custom",
      "name": "MyCustomActivity",
      "linkedServiceName": {
        "referenceName": "AzureBatchLinkedService",
        "type": "LinkedServiceReference"
      },
      "typeProperties": {
        "command": "cmd /c echo hello world"
      }
    }]
  }
}

Passaggio di oggetti e proprietà

Questo esempio illustra come usare referenceObjects e extendedProperties per passare oggetti e proprietà definite dall'utente dal servizio all'applicazione personalizzata.

{
  "name": "MyCustomActivityPipeline",
  "properties": {
    "description": "Custom activity sample",
    "activities": [{
      "type": "Custom",
      "name": "MyCustomActivity",
      "linkedServiceName": {
        "referenceName": "AzureBatchLinkedService",
        "type": "LinkedServiceReference"
      },
      "typeProperties": {
        "command": "SampleApp.exe",
        "folderPath": "customactv2/SampleApp",
        "resourceLinkedService": {
          "referenceName": "StorageLinkedService",
          "type": "LinkedServiceReference"
        },
        "referenceObjects": {
          "linkedServices": [{
            "referenceName": "AzureBatchLinkedService",
            "type": "LinkedServiceReference"
          }]
        },
        "extendedProperties": {          
          "connectionString": {
            "type": "SecureString",
            "value": "aSampleSecureString"
          },
          "PropertyBagPropertyName1": "PropertyBagValue1",
          "propertyBagPropertyName2": "PropertyBagValue2",
          "dateTime1": "2015-04-12T12:13:14Z"
        }
      }
    }]
  }
}

Quando l'attività viene eseguita, le proprietà referenceObjects ed extendedProperties vengono archiviate nei file descritti di seguito, che vengono distribuiti nella stessa cartella di esecuzione di SampleApp.exe:

  • activity.json

    Contiene extendedProperties e le proprietà dell'attività personalizzata.

  • linkedServices.json

    Contiene una matrice di servizi collegati definiti nella proprietà referenceObjects.

  • datasets.json

    Contiene una matrice di set di dati definiti nella proprietà referenceObjects.

Il codice di esempio seguente illustra come SampleApp.exe è in grado di accedere alle informazioni necessarie dai file JSON:

using Newtonsoft.Json;
using System;
using System.IO;

namespace SampleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //From Extend Properties
            dynamic activity = JsonConvert.DeserializeObject(File.ReadAllText("activity.json"));
            Console.WriteLine(activity.typeProperties.extendedProperties.connectionString.value);

            // From LinkedServices
            dynamic linkedServices = JsonConvert.DeserializeObject(File.ReadAllText("linkedServices.json"));
            Console.WriteLine(linkedServices[0].properties.typeProperties.accountName);
        }
    }
}

Recuperare i risultati di esecuzione

Per avviare una pipeline, eseguire il comando di PowerShell seguente:

$runId = Invoke-AzDataFactoryV2Pipeline -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -PipelineName $pipelineName

Quando la pipeline è in esecuzione, è possibile controllare l'output dell'esecuzione usando i comandi seguenti:

while ($True) {
    $result = Get-AzDataFactoryV2ActivityRun -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -PipelineRunId $runId -RunStartedAfter (Get-Date).AddMinutes(-30) -RunStartedBefore (Get-Date).AddMinutes(30)

    if(!$result) {
        Write-Host "Waiting for pipeline to start..." -foregroundcolor "Yellow"
    }
    elseif (($result | Where-Object { $_.Status -eq "InProgress" } | Measure-Object).count -ne 0) {
        Write-Host "Pipeline run status: In Progress" -foregroundcolor "Yellow"
    }
    else {
        Write-Host "Pipeline '"$pipelineName"' run finished. Result:" -foregroundcolor "Yellow"
        $result
        break
    }
    ($result | Format-List | Out-String)
    Start-Sleep -Seconds 15
}

Write-Host "Activity `Output` section:" -foregroundcolor "Yellow"
$result.Output -join "`r`n"

Write-Host "Activity `Error` section:" -foregroundcolor "Yellow"
$result.Error -join "`r`n"

Il stdout e stderr dell'applicazione personalizzata vengono salvati nel contenitore adfjobs nel servizio collegato di Archiviazione di Azure che hai definito durante la creazione del servizio collegato di Azure Batch, con un GUID dell'attività. È possibile ottenere il percorso dettagliato dall'output di Esecuzione attività, come illustrato nel frammento di codice seguente:

Pipeline ' MyCustomActivity' run finished. Result:

ResourceGroupName : resourcegroupname
DataFactoryName   : datafactoryname
ActivityName      : MyCustomActivity
PipelineRunId     : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
PipelineName      : MyCustomActivity
Input             : {command}
Output            : {exitcode, outputs, effectiveIntegrationRuntime}
LinkedServiceName :
ActivityRunStart  : 10/5/2017 3:33:06 PM
ActivityRunEnd    : 10/5/2017 3:33:28 PM
DurationInMs      : 21203
Status            : Succeeded
Error             : {errorCode, message, failureType, target}

Activity Output section:
"exitcode": 0
"outputs": [
  "https://<container>.blob.core.windows.net/adfjobs/<GUID>/output/stdout.txt",
  "https://<container>.blob.core.windows.net/adfjobs/<GUID>/output/stderr.txt"
]
"effectiveIntegrationRuntime": "DefaultIntegrationRuntime (East US)"
Activity Error section:
"errorCode": ""
"message": ""
"failureType": ""
"target": "MyCustomActivity"

Se si desidera utilizzare il contenuto di stdout.txt nelle attività downstream, è possibile ottenere il percorso del file stdout.txt nell'espressione "@activity('MyCustomActivity').outputs[0]".

Importante

  • Activity.json, linkedServices.json e datasets.json vengono archiviati nella cartella di runtime dell'attività Batch. Per questo esempio, le activity.json, le linkedServices.json e le datasets.json vengono archiviate nel https://adfv2storage.blob.core.windows.net/adfjobs/<GUID>/runtime/ percorso. Se necessario, è necessario pulirli separatamente.
  • Per i servizi collegati che usano il Self-Hosted Integration Runtime, le informazioni riservate come chiavi o password vengono crittografate dal Self-Hosted Integration Runtime per garantire che le credenziali rimangano nell'ambiente di rete privata definito dal cliente. Alcuni campi riservati potrebbero risultare mancanti se il codice dell'applicazione personalizzata fa riferimento a tali campi in questo modo. Se necessario, usare SecureString in extendedProperties anziché un riferimento a servizi collegati.

Passare gli output a un'altra attività

È possibile inviare valori personalizzati dal codice di un'attività personalizzata al servizio. È possibile farlo scrivendoli in outputs.json dall'applicazione. Il servizio copia il contenuto di outputs.json e lo aggiunge all'Activity Output come valore della proprietà customOutput. Il limite di dimensioni è 2 MB. Se si desidera utilizzare il contenuto di outputs.json nelle attività downstream, è possibile ottenere il valore usando l'espressione @activity('<MyCustomActivity>').output.customOutput.

Recuperare gli output SecureString

I valori delle proprietà sensibili designati come tipo SecureString, come illustrato in alcuni esempi di questo articolo, vengono mascherati nella scheda Monitoraggio nell'interfaccia utente. Nell'esecuzione effettiva della pipeline, tuttavia, una proprietà SecureString viene serializzata come JSON all'interno del activity.json file come testo normale. Ad esempio:

"extendedProperties": {
  "connectionString": {
    "type": "SecureString",
    "value": "aSampleSecureString"
  }
}

Questa serializzazione non è propriamente sicura e non è progettata per esserlo. L'intenzione è un'indicazione per il servizio di mascherare il valore nella scheda Monitoraggio.

Per accedere alle proprietà di tipo SecureString da un'attività personalizzata, leggere il activity.json file, che viene inserito nella stessa cartella del .EXE, deserializzare il codice JSON e quindi accedere alla proprietà JSON (extendedProperties => [propertyName] => value).

Ridimensionamento automatico di Azure Batch

È anche possibile creare un pool di Azure Batch con autoscale. Ad esempio, è possibile creare un pool batch Azure con 0 macchine virtuali dedicate e una formula di scalabilità automatica in base al numero di attività in sospeso.

La formula di esempio seguente consente di ottenere il comportamento seguente: quando il pool viene creato inizialmente, inizia con 1 macchina virtuale. La metrica $PendingTasks definisce il numero di attività in esecuzione e quelle in coda. La formula trova il numero medio di attività in sospeso negli ultimi 180 secondi e imposta TargetDedicated di conseguenza. Assicura che TargetDedicated non vada mai oltre 25 macchine virtuali. Pertanto, quando vengono inviate nuove attività, il pool si espande automaticamente e al completamento delle attività le macchine virtuali diventano disponibili una alla volta e la scalabilità automatica le riduce. È possibile regolare startingNumberOfVMs e maxNumberofVMs in base alle esigenze.

Formula di scalabilità automatica:

startingNumberOfVMs = 1;
maxNumberofVMs = 25;
pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);
pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));
$TargetDedicated=min(maxNumberofVMs,pendingTaskSamples);

Per informazioni dettagliate, vedere Scalabilità automatica dei nodi di calcolo in un pool di Azure Batch.

Se il pool usa il valore predefinito autoScaleEvaluationInterval, possono essere necessari 15-30 minuti perché il servizio Batch prepari la VM prima di eseguire l'attività personalizzata. Se il pool usa un valore autoScaleEvaluationInterval diverso, il servizio Batch può richiedere un valore autoScaleEvaluationInterval + 10 minuti.

Vedere gli articoli seguenti, che illustrano altre modalità di trasformazione dei dati: