Compartir a través de


Tutorial: Envío de datos desde un servidor OPC UA a Azure Data Lake Storage Gen 2

En el inicio rápido, ha creado un flujo de datos que envía datos de Operaciones de IoT de Azure a Event Hubs y, a continuación, a Microsoft Fabric a través de EventStreams.

Sin embargo, también es posible enviar los datos directamente a un punto de conexión de almacenamiento sin usar Event Hubs. Este enfoque requiere crear un esquema de Delta Lake que represente los datos, cargar el esquema en Operaciones de IoT de Azure y, a continuación, crear un flujo de datos que lea los datos del servidor OPC UA y lo escriba en el punto de conexión de almacenamiento.

Este tutorial se basa en la configuración de inicio rápido y muestra cómo bifurcar los datos en Azure Data Lake Storage Gen 2. Este enfoque permite almacenar los datos directamente en un lago de datos escalable y seguro, que se puede usar para un análisis y un procesamiento posteriores.

Requisitos previos

Finalice el segundo paso del inicio rápido que obtiene los datos del servidor OPC UA al agente MQTT de Operaciones de IoT de Azure. Asegúrese de que puede ver los datos en Event Hubs.

Creación de una cuenta de almacenamiento con la funcionalidad de Data Lake Storage

En primer lugar, siga los pasos para crear una cuenta de almacenamiento con la funcionalidad de Data Lake Storage Gen 2.

  • Elija un nombre reconocible pero único para la cuenta de almacenamiento, ya que es necesario en los pasos siguientes.
  • Para obtener los mejores resultados, use una ubicación cercana al clúster de Kubernetes donde se ejecuta Azure IoT Operations.
  • Durante el proceso de creación, habilite la configuración Espacio de nombres jerárquico. Esta configuración es necesaria para que las operaciones de Azure IoT escriban en la cuenta de almacenamiento.
  • Puede dejar otras opciones de configuración como predeterminadas.

En el paso Revisar, compruebe la configuración y seleccione Crear para crear la cuenta de almacenamiento.

Captura de pantalla que muestra la página de revisión para crear la cuenta de almacenamiento con el espacio de nombres jerárquico habilitado.

Obtención del nombre de la extensión de Operaciones de IoT de Azure

En Azure Portal, busque la instancia de Operaciones de IoT de Azure que creó en el inicio rápido. En la hoja Información general , busque la sección Extensión de Arc y vea el nombre de la extensión. Debería ser parecido a este: azure-iot-operations-xxxxx.

Captura de pantalla de Azure Portal en la que se muestra dónde encontrar el nombre de la extensión.

Este nombre de extensión se usa en los pasos siguientes para asignar permisos a la cuenta de almacenamiento.

Asignación de permisos a Operaciones de IoT de Azure para escribir en la cuenta de almacenamiento

En primer lugar, en la cuenta de almacenamiento, vaya a la hoja Control de acceso (IAM) y seleccione + Agregar asignación de roles. En la hoja Agregar asignación de roles, busque el rol Colaborador de datos de blobs de almacenamiento y selecciónelo.

Captura de pantalla que muestra cómo seleccionar el rol colaborador de datos de blobs de almacenamiento.

A continuación, seleccione Siguiente para ir a la sección Miembros.

A continuación, elija Seleccionar miembros y, en el cuadro Seleccionar, busque la identidad administrada de la extensión de Operaciones de IoT de Azure de Arc denominada azure-iot-operations-xxxxx y selecciónela.

Captura de pantalla que muestra cómo buscar el nombre de la extensión de Arc y seleccionarlo en IAM.

Finalice la asignación con Revisar y asignar.

Creación de un contenedor en la cuenta de almacenamiento

En la cuenta de almacenamiento, vaya a la hoja Contenedores y seleccione + Contenedor. En este tutorial, asigne al contenedor el nombre aiotutorial. Seleccione Crear para crear el contenedor.

Captura de pantalla que muestra cómo crear un contenedor de almacenamiento en Azure Portal.

Obtención del nombre y el espacio de nombres del Registro de esquemas

Para cargar el esquema en Operaciones de IoT de Azure, debe conocer el nombre y el espacio de nombres del Registro de esquemas. Puede obtener esta información mediante la CLI de Azure.

Ejecute el siguiente comando para obtener el nombre y el espacio de nombres del Registro de esquemas. Reemplace los marcadores de posición por sus valores.

az iot ops schema registry list -g <RESOURCE_GROUP> --query "[0].{name: name, namespace: properties.namespace}" -o tsv

Los resultados deberán tener un aspecto similar al siguiente:

<REGISTRY_NAME>    <SCHEMA_NAMESPACE>

Guarde los valores de los pasos siguientes.

Carga del esquema en Operaciones de IoT de Azure

En el inicio rápido, los datos procedentes del recurso del horno tienen el siguiente aspecto:

{
  "Temperature": {
    "SourceTimestamp": "2024-11-15T21:40:28.5062427Z",
    "Value": 6416
  },
  "FillWeight": {
    "SourceTimestamp": "2024-11-15T21:40:28.5063811Z",
    "Value": 6416
  },
  "EnergyUse": {
    "SourceTimestamp": "2024-11-15T21:40:28.506383Z",
    "Value": 6416
  }
}

El formato de esquema necesario para Delta Lake es un objeto JSON que sigue el formato de serialización del esquema de Delta Lake. El esquema debe definir la estructura de los datos, incluidos los tipos y propiedades de cada campo. Para obtener más información sobre el formato de esquema, consulte la documentación sobre el formato de serialización de esquemas de Delta Lake.

Sugerencia

Para generar el esquema a partir de un archivo de datos de ejemplo, use el asistente de generación de esquemas.

En este tutorial, el esquema de los datos tiene este aspecto:

{
  "$schema": "Delta/1.0",
  "type": "object",
  "properties": {
    "type": "struct",
    "fields": [
      {
        "name": "Temperature",
        "type": {
          "type": "struct",
          "fields": [
            {
              "name": "SourceTimestamp",
              "type": "timestamp",
              "nullable": false,
              "metadata": {}
            },
            {
              "name": "Value",
              "type": "integer",
              "nullable": false,
              "metadata": {}
            }
          ]
        },
        "nullable": false,
        "metadata": {}
      },
      {
        "name": "FillWeight",
        "type": {
          "type": "struct",
          "fields": [
            {
              "name": "SourceTimestamp",
              "type": "timestamp",
              "nullable": false,
              "metadata": {}
            },
            {
              "name": "Value",
              "type": "integer",
              "nullable": false,
              "metadata": {}
            }
          ]
        },
        "nullable": false,
        "metadata": {}
      },
      {
        "name": "EnergyUse",
        "type": {
          "type": "struct",
          "fields": [
            {
              "name": "SourceTimestamp",
              "type": "timestamp",
              "nullable": false,
              "metadata": {}
            },
            {
              "name": "Value",
              "type": "integer",
              "nullable": false,
              "metadata": {}
            }
          ]
        },
        "nullable": false,
        "metadata": {}
      }
    ]
  }
}

Guárdelo como un archivo denominado opcua-schema.json.

A continuación, cargue el esquema en Operaciones de IoT de Azure mediante la CLI de Azure. Reemplace los marcadores de posición por sus valores.

az iot ops schema create -n opcua-schema -g <RESOURCE_GROUP> --registry <REGISTRY_NAME> --format delta --type message --version-content opcua-schema.json --ver 1

Esto crea un esquema denominado opcua-schema en el registro de Operaciones de IoT de Azure con la versión 1.

Para comprobar que el esquema se carga, enumere las versiones de esquema mediante la CLI de Azure.

az iot ops schema version list -g <RESOURCE_GROUP> --schema opcua-schema --registry <REGISTRY_NAME>

Creación de un punto de conexión de flujo de datos

El punto de conexión del flujo de datos es el destino donde se envían los datos. En este caso, los datos se envían a Azure Data Lake Storage Gen2. El método de autenticación es una identidad administrada asignada por el sistema, que configuró para tener permisos adecuados para escribir en la cuenta de almacenamiento.

Cree un punto de conexión de flujo de datos mediante Bicep. Reemplace los marcadores de posición por sus valores.

// Replace with your values
param aioInstanceName string = '<AIO_INSTANCE_NAME>'
param customLocationName string = '<CUSTOM_LOCATION_NAME>'

// Tutorial specific values
param endpointName string = 'adls-gen2-endpoint'
param host string = 'https://<ACCOUNT>.blob.core.windows.net'

resource aioInstance 'Microsoft.IoTOperations/instances@2024-11-01' existing = {
  name: aioInstanceName
}

resource customLocation 'Microsoft.ExtendedLocation/customLocations@2021-08-31-preview' existing = {
  name: customLocationName
}

resource adlsGen2Endpoint 'Microsoft.IoTOperations/instances/dataflowEndpoints@2024-11-01' = {
  parent: aioInstance
  name: endpointName
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    endpointType: 'DataLakeStorage'
    dataLakeStorageSettings: {
      host: host
      authentication: {
        method: 'SystemAssignedManagedIdentity'
        systemAssignedManagedIdentitySettings: {}
      }
    }
  }
}

Guardar el archivo como adls-gen2-endpoint.bicep e implementarlo mediante la CLI de Azure

az deployment group create -g <RESOURCE_GROUP> --template-file adls-gen2-endpoint.bicep

Crear un flujo de datos

Para enviar datos a Azure Data Lake Storage Gen 2, debe crear un flujo de datos que lea los datos del servidor OPC UA y los escriba en la cuenta de almacenamiento. No se necesita ninguna transformación en este caso, por lo que los datos se escriben tal cual.

Cree un flujo de datos mediante Bicep. Reemplace los marcadores de posición por sus valores.

// Replace with your values
param aioInstanceName string = '<AIO_INSTANCE_NAME>'
param customLocationName string = '<CUSTOM_LOCATION_NAME>'
param schemaNamespace string = '<SCHEMA_NAMESPACE>'

// Tutorial specific values
param schema string = 'opcua-schema'
param schemaVersion string = '1'
param dataflowName string = 'tutorial-adls-gen2'
param assetName string = 'oven'
param endpointName string = 'adls-gen2-endpoint'
param containerName string = 'aiotutorial'
param serialFormat string = 'Delta'

resource aioInstance 'Microsoft.IoTOperations/instances@2024-11-01' existing = {
  name: aioInstanceName
}

resource customLocation 'Microsoft.ExtendedLocation/customLocations@2021-08-31-preview' existing = {
  name: customLocationName
}

// Pointer to the default dataflow profile
resource defaultDataflowProfile 'Microsoft.IoTOperations/instances/dataflowProfiles@2024-11-01' existing = {
  parent: aioInstance
  name: 'default'
}

resource adlsEndpoint 'Microsoft.IoTOperations/instances/dataflowEndpoints@2024-11-01' existing = {
  parent: aioInstance
  name: endpointName
}

resource defaultDataflowEndpoint 'Microsoft.IoTOperations/instances/dataflowEndpoints@2024-11-01' existing = {
  parent: aioInstance
  name: 'default'
}

resource asset 'Microsoft.DeviceRegistry/assets@2024-11-01' existing = {
  name: assetName
}

resource dataflow 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-11-01' = {
  // Reference to the parent dataflow profile, the default profile in this case
  // Same usage as profileRef in Kubernetes YAML
  parent: defaultDataflowProfile
  name: dataflowName
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    mode: 'Enabled'
    operations: [
      {
        operationType: 'Source'
        sourceSettings: {
          endpointRef: defaultDataflowEndpoint.name
          assetRef: asset.name
          dataSources: ['azure-iot-operations/data/${assetName}']
        }
      }
      // Transformation optional
      {
        operationType: 'BuiltInTransformation'
        builtInTransformationSettings: {
          serializationFormat: serialFormat
          schemaRef: 'aio-sr://${schemaNamespace}/${schema}:${schemaVersion}'
          map: [
            {
              type: 'PassThrough'
              inputs: [
                '*'
              ]
              output: '*'
            }
         ]
        }
      }
      {
        operationType: 'Destination'
        destinationSettings: {
          endpointRef: adlsEndpoint.name
          dataDestination: containerName
        }
      }
    ]
  }
}

Guardar el archivo como adls-gen2-dataflow.bicep e implementarlo mediante la CLI de Azure

az deployment group create -g <RESOURCE_GROUP> --template-file adls-gen2-dataflow.bicep

Comprobación de datos en Azure Data Lake Storage Gen 2

En la cuenta de almacenamiento, vaya a la hoja Contenedores y seleccione el contenedor aiotutorial que creó. Debería ver una carpeta denominada aiotutorial y dentro de ella, debería ver los archivos Parquet con los datos del servidor OPC UA. Los nombres de archivo tienen el formato part-00001-44686130-347f-4c2c-81c8-eb891601ef98-c000.snappy.parquet.

Captura de pantalla de Azure Portal en la que se muestran los archivos en el contenedor.

Para ver el contenido de los archivos, seleccione cada archivo y seleccione Editar.

Captura de pantalla de Azure Portal que muestra el propio archivo parquet.

El contenido no se representa correctamente en Azure Portal, pero puede descargar el archivo y abrirlo en una herramienta como Parquet Viewer.