Udostępnij za pośrednictwem


Samouczek: wysyłanie danych z serwera OPC UA do usługi Azure Data Lake Storage Gen 2

W przewodniku Szybki start utworzono przepływ danych, który wysyła dane z operacji usługi Azure IoT do usługi Event Hubs, a następnie do usługi Microsoft Fabric za pośrednictwem usługi EventStreams.

Można jednak również wysyłać dane bezpośrednio do punktu końcowego magazynu bez korzystania z usługi Event Hubs. Takie podejście wymaga utworzenia schematu usługi Delta Lake reprezentującego dane, przekazania schematu do operacji usługi Azure IoT, a następnie utworzenia przepływu danych, który odczytuje dane z serwera OPC UA i zapisuje je w punkcie końcowym magazynu.

Ten samouczek opiera się na konfiguracji przewodnika Szybki start i przedstawia sposób bifurcate danych do usługi Azure Data Lake Storage Gen 2. Takie podejście umożliwia przechowywanie danych bezpośrednio w skalowalnym i bezpiecznym magazynie data lake, które może służyć do dalszej analizy i przetwarzania.

Wymagania wstępne

Ukończ drugi krok przewodnika Szybki start, który pobiera dane z serwera OPC UA do brokera MQTT operacji usługi Azure IoT. Upewnij się, że dane są widoczne w usłudze Event Hubs.

Tworzenie konta magazynu przy użyciu możliwości usługi Data Lake Storage

Najpierw wykonaj kroki tworzenia konta magazynu z możliwością usługi Data Lake Storage Gen 2.

  • Wybierz pamiętną, ale unikatową nazwę konta magazynu, ponieważ jest ona potrzebna w następnych krokach.
  • Aby uzyskać najlepsze wyniki, użyj lokalizacji zbliżonej do klastra Kubernetes, w którym są uruchomione operacje usługi Azure IoT.
  • Podczas procesu tworzenia włącz ustawienie Hierarchiczna przestrzeń nazw . To ustawienie jest wymagane, aby operacje usługi Azure IoT zapisywały na koncie magazynu.
  • Możesz pozostawić inne ustawienia jako domyślne.

W kroku Przegląd sprawdź ustawienia i wybierz pozycję Utwórz, aby utworzyć konto magazynu.

Zrzut ekranu przedstawiający stronę przeglądu dotyczącą tworzenia konta magazynu z włączoną hierarchiczną przestrzenią nazw.

Uzyskiwanie nazwy rozszerzenia operacji usługi Azure IoT

W witrynie Azure Portal znajdź wystąpienie operacji usługi Azure IoT utworzone w przewodniku Szybki start. W bloku Przegląd znajdź sekcję Rozszerzenia arc i zobacz nazwę rozszerzenia. Powinien wyglądać następująco: azure-iot-operations-xxxxx.

Zrzut ekranu witryny Azure Portal przedstawiający miejsce znalezienia nazwy rozszerzenia.

Ta nazwa rozszerzenia jest używana w następnych krokach w celu przypisania uprawnień do konta magazynu.

Przypisywanie uprawnień do operacji usługi Azure IoT w celu zapisu na koncie magazynu

Najpierw na koncie magazynu przejdź do bloku Kontrola dostępu (zarządzanie dostępem i tożsamościami) i wybierz pozycję + Dodaj przypisanie roli. W bloku Dodawanie przypisania roli wyszukaj rolę Współautor danych obiektu blob usługi Storage i wybierz ją.

Zrzut ekranu przedstawiający sposób wybierania roli współautora danych obiektu blob magazynu.

Następnie wybierz przycisk Dalej , aby przejść do sekcji Członkowie .

Następnie wybierz pozycję Wybierz elementy członkowskie , a następnie w polu Wybierz wyszukaj tożsamość zarządzaną rozszerzenia Azure IoT Operations Arc o nazwie azure-iot-operations-xxxxx i wybierz je.

Zrzut ekranu przedstawiający sposób wyszukiwania nazwy rozszerzenia Arc i wybierania go w funkcji Zarządzanie dostępem i tożsamościami.

Zakończ przypisanie za pomocą polecenia Przejrzyj i przypisz.

Tworzenie kontenera na koncie magazynu

Na koncie magazynu przejdź do bloku Kontenery i wybierz pozycję + Kontener. Na potrzeby tego samouczka nadaj kontenerowi aiotutorialnazwę . Wybierz pozycję Utwórz, aby utworzyć kontener.

Zrzut ekranu przedstawiający sposób tworzenia kontenera magazynu w witrynie Azure Portal.

Pobieranie nazwy rejestru schematu i przestrzeni nazw

Aby przekazać schemat do operacji usługi Azure IoT, musisz znać nazwę rejestru schematu i przestrzeń nazw. Te informacje można uzyskać przy użyciu interfejsu wiersza polecenia platformy Azure.

Uruchom następujące polecenie, aby uzyskać nazwę rejestru schematu i przestrzeń nazw. Zastąp tekst zastępczy własnymi wartościami.

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

Dane wyjściowe powinny wyglądać podobnie do poniższych:

<REGISTRY_NAME>    <SCHEMA_NAMESPACE>

Zapisz wartości dla następnych kroków.

Przekazywanie schematu do operacji usługi Azure IoT

W przewodniku Szybki start dane pochodzące z zasobu piekarnika wyglądają następująco:

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

Wymagany format schematu dla usługi Delta Lake to obiekt JSON zgodny z formatem serializacji schematu usługi Delta Lake. Schemat powinien definiować strukturę danych, w tym typy i właściwości każdego pola. Aby uzyskać więcej informacji na temat formatu schematu, zobacz dokumentację formatu serializacji schematu usługi Delta Lake.

Napiwek

Aby wygenerować schemat na podstawie przykładowego pliku danych, użyj pomocnika generacji schematu.

Na potrzeby tego samouczka schemat danych wygląda następująco:

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

Zapisz go jako plik o nazwie opcua-schema.json.

Następnie przekaż schemat do operacji usługi Azure IoT przy użyciu interfejsu wiersza polecenia platformy Azure. Zastąp tekst zastępczy własnymi wartościami.

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

Spowoduje to utworzenie schematu o nazwie opcua-schema w rejestrze operacji usługi Azure IoT z wersją 1.

Aby sprawdzić, czy schemat został przekazany, wyświetl listę wersji schematu przy użyciu interfejsu wiersza polecenia platformy Azure.

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

Tworzenie punktu końcowego przepływu danych

Punkt końcowy przepływu danych to miejsce docelowe, w którym są wysyłane dane. W takim przypadku dane są wysyłane do usługi Azure Data Lake Storage Gen 2. Metoda uwierzytelniania to tożsamość zarządzana przypisana przez system, która została skonfigurowana tak, aby mieć odpowiednie uprawnienia do zapisu na koncie magazynu.

Utwórz punkt końcowy przepływu danych przy użyciu Bicep. Zastąp tekst zastępczy własnymi wartościami.

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

Zapisz plik jako adls-gen2-endpoint.bicep i wdróż go przy użyciu interfejsu wiersza polecenia platformy Azure

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

Utwórz przepływ danych

Aby wysłać dane do usługi Azure Data Lake Storage Gen 2, musisz utworzyć przepływ danych, który odczytuje dane z serwera OPC UA i zapisuje je na koncie magazynu. W tym przypadku nie jest wymagana żadna transformacja, więc dane są zapisywane zgodnie z rzeczywistymi danymi.

Tworzenie przepływu danych przy użyciu Bicep. Zastąp tekst zastępczy własnymi wartościami.

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

Zapisz plik jako adls-gen2-dataflow.bicep i wdróż go przy użyciu interfejsu wiersza polecenia platformy Azure

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

Weryfikowanie danych w usłudze Azure Data Lake Storage Gen 2

Na koncie magazynu przejdź do bloku Kontenery i wybierz utworzony kontener aiotutorial . Powinien zostać wyświetlony folder o nazwie aiotutorial i wewnątrz niego powinny być widoczne pliki Parquet z danymi z serwera OPC UA. Nazwy plików mają format part-00001-44686130-347f-4c2c-81c8-eb891601ef98-c000.snappy.parquet.

Zrzut ekranu witryny Azure Portal przedstawiający pliki w kontenerze.

Aby wyświetlić zawartość plików, wybierz każdy plik i wybierz pozycję Edytuj.

Zrzut ekranu witryny Azure Portal przedstawiający sam plik parquet.

Zawartość nie jest poprawnie renderowana w witrynie Azure Portal, ale możesz pobrać plik i otworzyć go w narzędziu, na przykład Parquet Viewer.