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.
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
.
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ą.
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.
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 aiotutorial
nazwę . Wybierz pozycję Utwórz, aby utworzyć kontener.
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
.
Aby wyświetlić zawartość plików, wybierz każdy plik i wybierz pozycję Edytuj.
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.