Zelfstudie: Gegevens verzenden van een OPC UA-server naar Azure Data Lake Storage Gen 2
In de quickstart hebt u een gegevensstroom gemaakt waarmee gegevens van Azure IoT Operations worden verzonden naar Event Hubs en vervolgens naar Microsoft Fabric via EventStreams.
Het is echter ook mogelijk om de gegevens rechtstreeks naar een opslageindpunt te verzenden zonder Event Hubs te gebruiken. Voor deze aanpak moet u een Delta Lake-schema maken dat de gegevens vertegenwoordigt, het schema uploadt naar Azure IoT Operations en vervolgens een gegevensstroom maakt waarmee de gegevens van de OPC UA-server worden gelezen en naar het opslageindpunt worden geschreven.
Deze zelfstudie bouwt voort op de quickstart-installatie en laat zien hoe u de gegevens kunt bifureren naar Azure Data Lake Storage Gen 2. Met deze aanpak kunt u de gegevens rechtstreeks opslaan in een schaalbare en veilige Data Lake, die kan worden gebruikt voor verdere analyse en verwerking.
Vereisten
Voltooi de tweede stap van de quickstart waarmee u de gegevens van de OPC UA-server naar de Azure IoT Operations MQTT-broker kunt ophalen. Zorg ervoor dat u de gegevens in Event Hubs kunt zien.
Een opslagaccount maken met Data Lake Storage-mogelijkheid
Voer eerst de stappen uit om een opslagaccount te maken met data lake storage Gen 2-functionaliteit.
- Kies een gedenkwaardige maar unieke naam voor het opslagaccount, omdat dit nodig is in de volgende stappen.
- Gebruik voor de beste resultaten een locatie dicht bij het Kubernetes-cluster waarop Azure IoT Operations wordt uitgevoerd.
- Schakel tijdens het maken de instelling hiërarchische naamruimte in. Deze instelling is vereist om Azure IoT-bewerkingen naar het opslagaccount te schrijven.
- U kunt andere instellingen standaard laten staan.
Controleer in de stap Controleren de instellingen en selecteer Maken om het opslagaccount te maken.
De extensienaam van Azure IoT-bewerkingen ophalen
Zoek in Azure Portal het Azure IoT Operations-exemplaar dat u in de quickstart hebt gemaakt. Zoek op de blade Overzicht de sectie Arc-extensie en bekijk de naam van de extensie. Het moet er als azure-iot-operations-xxxxx
volgt uitzien.
Deze extensienaam wordt gebruikt in de volgende stappen om machtigingen toe te wijzen aan het opslagaccount.
Machtiging toewijzen aan Azure IoT-bewerkingen om naar het opslagaccount te schrijven
Ga eerst in het opslagaccount naar de blade Toegangsbeheer (IAM) en selecteer + Roltoewijzing toevoegen. Zoek in de blade Roltoewijzing toevoegen naar de rol Inzender voor opslagblobgegevens en selecteer deze.
Selecteer vervolgens Volgende om naar de sectie Leden te gaan.
Kies vervolgens Leden selecteren en zoek in het vak Selecteren naar de beheerde identiteit van de Azure IoT Operations Arc-extensie met de naam azure-iot-operations-xxxxx
en selecteer deze.
Voltooi de opdracht met Beoordelen en toewijzen.
Een container maken in het opslagaccount
Ga in het opslagaccount naar de blade Containers en selecteer + Container. Geef voor deze zelfstudie de container aiotutorial
een naam. Selecteer Maken om de container te maken.
De schemaregisternaam en -naamruimte ophalen
Als u het schema wilt uploaden naar Azure IoT-bewerkingen, moet u de naam en naamruimte van het schemaregister weten. U kunt deze informatie ophalen met behulp van de Azure CLI.
Voer de volgende opdracht uit om de naam en naamruimte van het schemaregister op te halen. Vervang de tijdelijke aanduidingen door de waarden.
az iot ops schema registry list -g <RESOURCE_GROUP> --query "[0].{name: name, namespace: properties.namespace}" -o tsv
De uitvoer moet er ongeveer als volgt uitzien:
<REGISTRY_NAME> <SCHEMA_NAMESPACE>
Sla de waarden voor de volgende stappen op.
Schema uploaden naar Azure IoT-bewerkingen
In de snelstart ziet de gegevens uit de ovenasset er als volgt uit:
{
"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
}
}
De vereiste schema-indeling voor Delta Lake is een JSON-object dat de serialisatie-indeling van het Delta Lake-schema volgt. Het schema moet de structuur van de gegevens definiëren, inclusief de typen en eigenschappen van elk veld. Zie de documentatie over de serialisatie-indeling van Delta Lake-schema's voor meer informatie over de schema-indeling.
Tip
Als u het schema wilt genereren op basis van een voorbeeldgegevensbestand, gebruikt u de Helper voor Schema Gen.
Voor deze zelfstudie ziet het schema voor de gegevens er als volgt uit:
{
"$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": {}
}
]
}
}
Sla het bestand op als een bestand met de naam opcua-schema.json
.
Upload vervolgens het schema naar Azure IoT Operations met behulp van de Azure CLI. Vervang de tijdelijke aanduidingen door de waarden.
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
Hiermee maakt u een schema met de naam opcua-schema
in het Azure IoT Operations-register met versie 1
.
Als u wilt controleren of het schema is geüpload, vermeldt u de schemaversies met behulp van de Azure CLI.
az iot ops schema version list -g <RESOURCE_GROUP> --schema opcua-schema --registry <REGISTRY_NAME>
Gegevensstroomeindpunt maken
Het eindpunt van de gegevensstroom is het doel waar de gegevens worden verzonden. In dit geval worden de gegevens verzonden naar Azure Data Lake Storage Gen 2. De verificatiemethode is door het systeem toegewezen beheerde identiteit, die u hebt ingesteld om over de juiste machtigingen te beschikken om naar het opslagaccount te schrijven.
Maak een gegevensstroomeindpunt met Bicep. Vervang de tijdelijke aanduidingen door de waarden.
// 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: {}
}
}
}
}
Sla het bestand op als adls-gen2-endpoint.bicep
en implementeer het met behulp van de Azure CLI
az deployment group create -g <RESOURCE_GROUP> --template-file adls-gen2-endpoint.bicep
Een gegevensstroom maken
Als u gegevens wilt verzenden naar Azure Data Lake Storage Gen 2, moet u een gegevensstroom maken waarmee gegevens van de OPC UA-server worden gelezen en naar het opslagaccount worden geschreven. In dit geval is er geen transformatie nodig, dus de gegevens worden als zodanig geschreven.
Maak een gegevensstroom met Bicep. Vervang de tijdelijke aanduidingen door de waarden.
// 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
}
}
]
}
}
Sla het bestand op als adls-gen2-dataflow.bicep
en implementeer het met behulp van de Azure CLI
az deployment group create -g <RESOURCE_GROUP> --template-file adls-gen2-dataflow.bicep
Gegevens verifiëren in Azure Data Lake Storage Gen 2
Ga in het opslagaccount naar de blade Containers en selecteer de container aiotutorial
die u hebt gemaakt. Als het goed is, ziet u een map met de naam aiotutorial
en hierin ziet u Parquet-bestanden met de gegevens van de OPC UA-server. De bestandsnamen hebben de indeling part-00001-44686130-347f-4c2c-81c8-eb891601ef98-c000.snappy.parquet
.
Als u de inhoud van de bestanden wilt zien, selecteert u elk bestand en selecteert u Bewerken.
De inhoud wordt niet goed weergegeven in Azure Portal, maar u kunt het bestand downloaden en openen in een hulpprogramma zoals Parquet Viewer.