Compartir por


Uso de actividades personalizadas en una canalización de Azure Data Factory o Azure Synapse Analytics

APPLIES TO: Azure Data Factory Azure Synapse Analytics

Sugerencia

Data Factory en Microsoft Fabric es la próxima generación de Azure Data Factory, con una arquitectura más sencilla, inteligencia artificial integrada y nuevas características. Si no está familiarizado con la integración de datos, comience con Fabric Data Factory. Las cargas de trabajo de ADF existentes pueden actualizarse a Fabric para acceder a nuevas funcionalidades en ciencia de datos, análisis en tiempo real e informes.

Hay dos tipos de actividades que se pueden usar en una canalización de Azure Data Factory o Synapse.

Para mover datos desde y hacia un almacén de datos incompatible con el servicio, o para transformar o procesar datos de algún modo incompatible con el servicio, puede crear una actividad personalizada con su propia lógica de movimiento o transformación de datos y usarla en una canalización. La actividad personalizada ejecuta la lógica de código personalizada en un grupo de máquinas virtuales Azure Batch.

Nota

Se recomienda usar el módulo Az de PowerShell de Azure para interactuar con Azure. Para empezar, consulte Install Azure PowerShell. Para obtener información sobre cómo migrar al módulo Az PowerShell, consulte Migrate Azure PowerShell de AzureRM a Az.

Consulte los artículos siguientes si no está familiarizado con Azure Batch servicio:

Importante

Al crear un nuevo grupo de Azure Batch, se debe usar "VirtualMachineConfiguration" y NOT "CloudServiceConfiguration".

Agrega actividades personalizadas a una canalización con la interfaz de usuario

Para usar una actividad personalizada en una canalización, complete los pasos siguientes:

  1. Busque el valor Personalizado en el panel Actividades de canalización y arrastre una actividad personalizada al lienzo de canalización.

  2. Seleccione la nueva actividad personalizada en el lienzo si aún no está seleccionada.

  3. Seleccione la pestaña Azure Batch para seleccionar o crear un nuevo servicio vinculado de Azure Batch que ejecutará la actividad personalizada.

    Muestra la UI de una actividad personalizada.

  4. Seleccione la pestaña Settings y especifique un comando que se va a ejecutar en la Azure Batch y detalles avanzados opcionales.

    Muestra la UI de la pestaña Configuración de una actividad personalizada.

Servicio vinculado de Azure Batch

El siguiente JSON define un servicio vinculado de ejemplo para Azure Batch. Para obtener más información, consulte Entorno de proceso compatibles

{
    "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"
            }
        }
    }
}

Para obtener más información sobre el servicio vinculado de Azure Batch, consulte el artículo Servicios vinculados de computación.

Actividad personalizada

El siguiente fragmento de código JSON define una canalización con una actividad personalizada simple. La definición de actividad tiene una referencia al servicio vinculado 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"
        }
      }
    }]
  }
}

En este ejemplo, el helloworld.exe es una aplicación personalizada almacenada en la carpeta customactv2/helloworld de la cuenta de Azure Storage usada en resourceLinkedService. La actividad Personalizada envía esta aplicación personalizada para que se ejecute en Azure Batch. Puede reemplazar el comando a cualquier aplicación preferida que se pueda ejecutar en el sistema operativo de destino de los nodos del grupo de Azure Batch.

En la tabla siguiente se describen los nombres y descripciones de las propiedades que son específicas de esta actividad.

Propiedad Descripción Obligatorio
nombre Nombre de la actividad en la canalización
descripción Texto que describe para qué se usa la actividad. No
tipo Para la actividad personalizada, el tipo de actividad es Custom.
nombreDelServicioVinculado Servicio vinculado a Azure Batch. Para obtener más información sobre este servicio vinculado, consulte el artículo Compute linked services.
comando Comando de la aplicación personalizada que se va a ejecutar. Si la aplicación ya está disponible en el nodo de grupo de Azure Batch, se puede omitir resourceLinkedService y folderPath. Por ejemplo, puede especificar el comando que se va a cmd /c dir, que el nodo de grupo de proceso por lotes de Windows admite de forma nativa.
resourceLinkedService Azure Storage servicio vinculado a la cuenta de almacenamiento donde se almacena la aplicación personalizada No*
folderPath Ruta de acceso a la carpeta de la aplicación personalizada y todas sus dependencias

Si tiene dependencias almacenadas en subcarpetas, es decir, en una estructura jerárquica de carpetas en folderPath, la estructura de carpetas se simplifica actualmente cuando los archivos se copian en Azure Batch. Es decir, todos los archivos se copian en una sola carpeta sin subcarpetas. Para evitar este comportamiento, considere la posibilidad de comprimir los archivos, copiar el archivo comprimido y, a continuación, descomprimirlo con código personalizado en la ubicación deseada.
No*
objetos de referencia Matriz de servicios vinculados y conjuntos de datos existentes. Los servicios vinculados y los conjuntos de datos a los que se hace referencia se pasan a la aplicación personalizada en formato JSON, por lo que el código personalizado puede hacer referencia a recursos del servicio No
extendedProperties Propiedades definidas por el usuario que se pueden pasar a la aplicación personalizada en formato JSON, por lo que el código personalizado puede hacer referencia a propiedades adicionales No
tiempoDeRetenciónEnDías Tiempo de retención de los archivos enviados para la actividad personalizada. El valor predeterminado es 30 días. No

* Las propiedades resourceLinkedService y folderPath deben especificarse u omitirse de forma conjunta.

Nota

Si va a pasar servicios vinculados como objetos de referencia en la actividad personalizada, es una buena práctica de seguridad pasar un servicio vinculado habilitado para Azure Key Vault (ya que no contiene ninguna cadena segura) y obtener las credenciales mediante el nombre de secreto directamente del Key Vault mediante el código. Puede encontrar un ejemplo here que hace referencia al servicio vinculado habilitado para AKV, recupera las credenciales de Key Vault y, a continuación, accede al almacenamiento en el código.

Nota

Actualmente solo se admite Azure Blob Storage para resourceLinkedService en la actividad personalizada y es el único servicio vinculado que se crea de forma predeterminada y no hay ninguna opción para elegir otros conectores como ADLS Gen2.

Permisos para actividades personalizadas

La actividad personalizada establece la cuenta de usuario automático de Azure Batch en acceso no administrativo con alcance de tarea (la especificación predeterminada del usuario automático). No se puede cambiar el nivel de permiso de la cuenta de usuario automático. Para más información, consulte Ejecución de tareas en cuentas de usuario en Batch | Cuentas de usuario automático.

Ejecutar comandos

Puede ejecutar directamente un comando mediante la actividad personalizada. En el ejemplo siguiente se ejecuta el comando "echo hello world" en los nodos de destino Azure Batch Pool e imprime la salida en 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"
      }
    }]
  }
}

Pasar objetos y propiedades

En este ejemplo se muestra cómo usar las propiedades referenceObjects y extendedProperties para pasar objetos y propiedades definidas por el usuario del servicio a la aplicación personalizada.

{
  "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"
        }
      }
    }]
  }
}

Al ejecutar la actividad, las propiedades referenceObjects y extendedProperties se almacenan en los siguientes archivos que se implementan en la misma carpeta de ejecución del archivo SampleApp.exe:

  • activity.json

    Almacena extendedProperties y las propiedades de la actividad personalizada.

  • linkedServices.json

    Almacena una matriz de servicios vinculados definidos en la propiedad referenceObjects.

  • datasets.json

    Almacena una matriz de conjuntos de datos definidos en la propiedad referenceObjects.

En el siguiente código de ejemplo se muestra cómo SampleApp.exe puede obtener acceso a la información necesaria de los archivos 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);
        }
    }
}

Recuperar los resultados de la ejecución

Puede iniciar una ejecución de canalización mediante el siguiente comando de PowerShell:

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

Durante la ejecución de la canalización, puede comprobar el resultado de la ejecución mediante los comandos siguientes:

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"

El stdout y stderr de su aplicación personalizada se guardan en el contenedor adfjobs del servicio vinculado de Azure Storage que definió al crear el servicio vinculado de Azure Batch, identificado por un GUID de la tarea. Puede obtener la ruta de acceso detallada de la salida de la ejecución de la actividad tal como se muestra en el siguiente fragmento de código:

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"

Si desea utilizar el contenido de stdout.txt en actividades posteriores, puede obtener la ruta de acceso al archivo stdout.txt en la expresión "@activity('MyCustomActivity').output.outputs[0]".

Importante

  • Los archivos activity.json, linkedServices.json y datasets.json se almacenan en la carpeta de tiempo de ejecución de la tarea de Batch. En este ejemplo, los archivos activity.json, linkedServices.json y datasets.json se almacenan en la ruta de acceso https://adfv2storage.blob.core.windows.net/adfjobs/<GUID>/runtime/. Si es necesario, usted deberá limpiarlos por separado.
  • En el caso de los servicios vinculados que usan el Self-Hosted Integration Runtime, la Self-Hosted Integration Runtime cifra la información confidencial, como claves o contraseñas, para asegurarse de que las credenciales permanecen en el entorno de red privada definido por el cliente. Si el código de la aplicación personalizada hace referencia de esta forma a algunos campos confidenciales, es posible que estos no estén presentes. Si es necesario, use SecureString en extendedProperties en lugar de usar la referencia al servicio vinculado.

Resultados del paso a otra actividad

Puede enviar los valores personalizados desde el código de una actividad personalizada al servicio. Puede hacerlo escribiéndolos en outputs.json desde la aplicación. El servicio copia el contenido de outputs.json y lo anexa a la salida de la actividad como el valor de la propiedad customOutput. (El límite de tamaño es de 2 MB). Si quiere consumir el contenido de outputs.json en las actividades posteriores, puede obtener el valor mediante la expresión @activity('<MyCustomActivity>').output.customOutput.

Recuperación de salidas de SecureString

Los valores de propiedades confidenciales designados como de tipo SecureString, tal y como se muestra en algunos de los ejemplos de este artículo, se enmascaran en la pestaña Supervisión de la interfaz de usuario. Sin embargo, en la ejecución de la canalización real, una propiedad SecureString se serializa como JSON dentro del archivo activity.json como texto sin formato. Por ejemplo:

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

Esta serialización no es verdaderamente segura y no está pensada para serlo. La intención es una sugerencia al servicio para enmascarar el valor en la pestaña Supervisión.

Para acceder a las propiedades de tipo SecureString desde una actividad personalizada, lea el archivo activity.json, que se coloca en la misma carpeta que el archivo .EXE, deserialice el archivo JSON y, a continuación, acceda a la propiedad JSON (extendedProperties => [propertyName] => valor).

Escalado automático de Azure Batch

También puede crear un grupo de Azure Batch con la característica de autoscale. Por ejemplo, podría crear un grupo de lotes de Azure con 0 máquinas virtuales dedicadas y una fórmula de escalado automático en función del número de tareas pendientes.

La fórmula de ejemplo obtiene el siguiente comportamiento: Cuando el grupo se crea inicialmente, se inicia con una VM (máquina virtual). La métrica $PendingTasks define el número de tareas que están en ejecución o activas (en cola). La fórmula busca el número promedio de tareas pendientes en los últimos 180 segundos y establece TargetDedicated en consecuencia. Garantiza que TargetDedicated nunca supera las 25 VM. Por tanto, a medida que se envían nuevas tareas, el grupo crece automáticamente y a medida que estás se completan, las VM se liberan una a una y el escalado automático las reduce. startingNumberOfVMs y maxNumberofVMs se pueden adaptar a sus necesidades.

Fórmula de escalado automático

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

Consulte Escalado automático de nodos de proceso en un grupo de Azure Batch para obtener más información.

Si el grupo usa el valor predeterminado de la propiedad autoScaleEvaluationInterval, el servicio Batch puede tardar de 15 a 30 minutos en preparar la máquina virtual antes de ejecutar la actividad personalizada. Si el grupo usa otro valor de autoScaleEvaluationInterval diferente, el servicio Batch podría tardar el valor de autoScaleEvaluationInterval más 10 minutos.

Vea los siguientes artículos, en los que se explica cómo transformar datos de otras maneras: