Freigeben über


Tutorial: Senden von Daten von einem OPC UA-Server an Azure Data Lake Storage Gen2

Im Schnellstart haben Sie einen Datenfluss erstellt, der Daten von Azure IoT Einsatz an Event Hubs und dann über EventStreams an Microsoft Fabric sendet.

Es ist jedoch auch möglich, die Daten direkt an einen Speicherendpunkt zu senden, ohne Event Hubs zu verwenden. Dieser Ansatz erfordert das Erstellen eines Delta Lake-Schemas, das die Daten darstellt, das Hochladen des Schemas in Azure IoT Einsatz und dann das Erstellen eines Datenflusses, der die Daten vom OPC UA-Server liest und an den Speicherendpunkt schreibt.

Dieses Tutorial baut auf dem Schnellstart zur Einrichtung auf und veranschaulicht, wie Sie die Daten in Azure Data Lake Storage Gen2 forken. Mit diesem Ansatz können Sie die Daten direkt in einem skalierbaren und sicheren Data Lake speichern, der zur weiteren Analyse und Verarbeitung verwendet werden kann.

Voraussetzungen

Beenden Sie den zweiten Schritt des Schnellstarts, in dem Sie die Daten vom OPC UA-Server zum MQTT-Broker von Azure IoT Einsatz übertragen. Stellen Sie sicher, dass die Daten in Event Hubs angezeigt werden.

Erstellen eines Speicherkontos mit Data Lake Storage-Funktion

Führen Sie zunächst die Schritte zum Erstellen eines Speicherkontos mit Data Lake Storage Gen2-Funktion aus.

  • Wählen Sie einen einprägsamen, aber eindeutigen Namen für das Speicherkonto aus, da Sie es in den nächsten Schritten benötigen.
  • Um optimale Ergebnisse zu erzielen, verwenden Sie einen Standort in der Nähe des Kubernetes-Clusters, in dem Azure IoT Einsatz ausgeführt wird.
  • Aktivieren Sie während des Erstellungsprozesses die Einstellung Hierarchischer Namespace. Diese Einstellung ist für Azure IoT Einsatz erforderlich, um in das Speicherkonto zu schreiben.
  • Für die anderen Einstellungen können Sie die Standardwerte beibehalten.

Überprüfen Sie im Schritt Überprüfung die Einstellungen, und wählen Sie Erstellen aus, um das Speicherkonto zu erstellen.

Screenshot der Seite „Überprüfung“ zum Erstellen des Speicherkontos mit aktiviertem hierarchischem Namespace

Abrufen des Erweiterungsnamens von Azure IoT Einsatz

Suchen Sie im Azure-Portal die Azure IoT Einsatz-Instanz, die Sie im Schnellstart erstellt haben. Suchen Sie auf dem Blatt Übersicht im Abschnitt Arc-Erweiterung den Namen der Erweiterung. Er sollte wie folgt aussehen: azure-iot-operations-xxxxx.

Screenshot der Suche nach dem Erweiterungsnamen im Azure-Portal

Dieser Erweiterungsname wird in den nächsten Schritten verwendet, um dem Speicherkonto Berechtigungen zuzuweisen.

Zuweisen der Berechtigung zum Schreiben in das Speicherkonto zu Azure IoT Einsatz

Wechseln Sie zunächst im Speicherkonto zum Blatt Zugriffssteuerung (IAM), und wählen Sie + Rollenzuweisung hinzufügen aus. Suchen Sie auf dem Blatt Rollenzuweisung hinzufügen nach der Rolle Mitwirkender an Storage-Blobdaten, und wählen Sie sie aus.

Screenshot der Auswahl der Rolle „Mitwirkender an Storage-Blobdaten“

Wählen Sie dann Weiter aus, um zum Abschnitt Mitglieder zu navigieren.

Wählen Sie als Nächstes Mitglieder auswählen aus, suchen Sie im Feld Auswählen nach der verwalteten Identität der Arc-Erweiterung von Azure IoT Einsatz namens azure-iot-operations-xxxxx, und wählen Sie sie aus.

Screenshot der Suche nach dem Namen der Arc-Erweiterung und ihrer Auswahl in IAM

Beenden Sie die Zuweisung mit Überprüfen + Zuweisen.

Erstellen eines Containers im Speicherkonto

Navigieren Sie im Speicherkonto zum Blatt Container, und wählen Sie + Container aus. Nennen Sie den Container für dieses Tutorial aiotutorial. Klicken Sie auf Erstellen, um den Container zu erstellen.

Screenshot der Erstellung eines Speichercontainers im Azure-Portal

Abrufen des Namens der Schemaregistrierung und des Namespace

Um das Schema in Azure IoT Einsatz hochzuladen, müssen Sie den Namen und den Namespace der Schemaregistrierung kennen. Sie können diese Informationen mithilfe der Azure-Befehlszeilenschnittstelle abrufen.

Führen Sie den folgenden Befehl aus, um den Namen und den Namespace der Schemaregistrierung abzurufen. Ersetzen Sie die Platzhalter durch Ihre Werte.

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

Die Ausgabe sollte wie folgt aussehen:

<REGISTRY_NAME>    <SCHEMA_NAMESPACE>

Speichern Sie die Werte für die nächsten Schritte.

Hochladen des Schemas in Azure IoT Einsatz

In diesem Schnellstart haben die Daten aus der Ofen-Ressource folgende Form:

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

Das erforderliche Schemaformat für Delta Lake ist ein JSON-Objekt, das dem Serialisierungsformat des Delta Lake-Schemas folgt. Das Schema sollte die Struktur der Daten definieren, einschließlich der Typen und Eigenschaften jedes Felds. Weitere Informationen zum Schemaformat finden Sie in der Dokumentation zum Serialisierungsformat des Delta Lake-Schemas.

Tipp

Um das Schema aus einer Beispieldatendatei zu generieren, verwenden Sie das Schema Gen-Hilfsprogramm.

In diesem Tutorial wird folgendes Schema für die Daten verwendet:

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

Speichern Sie es als Datei mit dem Namen opcua-schema.json.

Laden Sie dann das Schema mithilfe der Azure-Befehlszeilenschnittstelle in Azure IoT Einsatz hoch. Ersetzen Sie die Platzhalter durch Ihre Werte.

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

Dadurch wird in der Azure IoT Einsatz-Registrierung ein Schema namens opcua-schema mit der Version 1 erstellt.

Um zu überprüfen, ob das Schema hochgeladen wurde, listen Sie die Schemaversionen mithilfe der Azure-Befehlszeilenschnittstelle auf.

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

Erstellen eines Dataflowendpunkts

Der Datenflussendpunkt ist das Ziel, an das die Daten gesendet werden. In diesem Fall werden die Daten an Azure Data Lake Storage Gen2 gesendet. Die Authentifizierungsmethode ist die systemseitig zugewiesene verwaltete Identität, die Sie mit Schreibberechtigung im Speicherkonto eingerichtet haben.

Erstellen Sie einen Datenflussendpunkt mit Bicep. Ersetzen Sie die Platzhalter durch Ihre Werte.

// 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: {}
      }
    }
  }
}

Speichern der Datei als adls-gen2-endpoint.bicep und Bereitstellen mithilfe der Azure-Befehlszeilenschnittstelle

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

Erstellen eines Dataflows

Um Daten an Azure Data Lake Storage Gen2 zu senden, müssen Sie einen Datenfluss erstellen, der Daten vom OPC UA-Server liest und in das Speicherkonto schreibt. In diesem Fall ist keine Transformation erforderlich, sodass die Daten unverändert geschrieben werden.

Erstellen Sie einen Datenfluss mit Bicep. Ersetzen Sie die Platzhalter durch Ihre Werte.

// 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
        }
      }
    ]
  }
}

Speichern der Datei als adls-gen2-dataflow.bicep und Bereitstellen mithilfe der Azure-Befehlszeilenschnittstelle

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

Überprüfen von Daten in Azure Data Lake Storage Gen2

Wechseln Sie im Speicherkonto zum Blatt Container, und wählen Sie den von Ihnen erstellten Container aiotutorial aus. Es sollte ein Ordner mit dem Namen aiotutorial mit Parquet-Dateien mit den Daten vom OPC UA-Server angezeigt werden. Die Dateinamen haben das Format part-00001-44686130-347f-4c2c-81c8-eb891601ef98-c000.snappy.parquet.

Screenshot der Anzeige der Dateien im Container im Azure-Portal

Um den Inhalt der Dateien anzuzeigen, wählen Sie jede Datei und dann Bearbeiten aus.

Screenshot einer Parquet-Datei im Azure-Portal

Der Inhalt wird im Azure-Portal nicht ordnungsgemäß gerendert, aber Sie können die Datei herunterladen und in einem Tool wie Parquet Viewer öffnen.