Tutorial: Enviar dados de um servidor OPC UA para o Azure Data Lake Storage Gen 2
No início rápido, você criou um fluxo de dados que envia dados das Operações IoT do Azure para Hubs de Eventos e, em seguida, para o Microsoft Fabric por meio de EventStreams.
No entanto, também é possível enviar os dados diretamente para um ponto de extremidade de armazenamento sem usar Hubs de Eventos. Essa abordagem requer a criação de um esquema Delta Lake que representa os dados, carregar o esquema para as Operações IoT do Azure e, em seguida, criar um fluxo de dados que lê os dados do servidor OPC UA e os grava no ponto de extremidade de armazenamento.
Este tutorial baseia-se na configuração de início rápido e demonstra como bifurcar os dados para o Azure Data Lake Storage Gen 2. Essa abordagem permite armazenar os dados diretamente em um data lake escalável e seguro, que pode ser usado para análise e processamento adicionais.
Pré-requisitos
Conclua a segunda etapa do início rápido, que obtém os dados do servidor OPC UA para o agente MQTT do Azure IoT Operations. Certifique-se de que consegue ver os dados nos Hubs de Eventos.
Criar uma conta de armazenamento com o recurso de armazenamento Data Lake
Primeiro, siga as etapas para criar uma conta de armazenamento com o recurso Data Lake Storage Gen 2.
- Escolha um nome memorável, mas exclusivo para a conta de armazenamento, já que ele é necessário nas próximas etapas.
- Para obter melhores resultados, use um local próximo ao cluster do Kubernetes onde o Azure IoT Operations está sendo executado.
- Durante o processo de criação, habilite a configuração de namespace hierárquico. Essa configuração é necessária para que as Operações do Azure IoT gravem na conta de armazenamento.
- Você pode deixar outras configurações como padrão.
Na etapa Revisão, verifique as configurações e selecione Criar para criar a conta de armazenamento.
Obter o nome da extensão do Azure IoT Operations
No portal do Azure, localize a instância do Azure IoT Operations que você criou no início rápido. Na folha Visão geral, localize a seção Extensão Arc e veja o nome da extensão. Deve parecer com azure-iot-operations-xxxxx
.
Esse nome de extensão é usado nas próximas etapas para atribuir permissões à conta de armazenamento.
Atribuir permissão às Operações IoT do Azure para gravar na conta de armazenamento
Primeiro, na conta de armazenamento, vá para a folha Controle de acesso (IAM) e selecione + Adicionar atribuição de função. Na folha Adicionar atribuição de função, procure a função Colaborador de Dados de Blob de Armazenamento e selecione-a.
Em seguida, selecione Avançar para acessar a seção Membros .
Em seguida, escolha Selecionar membros e, na caixa Selecionar , procure a identidade gerenciada da extensão do Azure IoT Operations Arc nomeada azure-iot-operations-xxxxx
e selecione-a.
Termine a tarefa com Revisão + atribuição.
Criar um contêiner na conta de armazenamento
Na conta de armazenamento, vá para a folha Contêineres e selecione + Contêiner. Para este tutorial, nomeie o contêiner aiotutorial
como . Selecione Criar para criar o contentor.
Obter o nome do Registro do esquema e o namespace
Para carregar o esquema no Azure IoT Operations, você precisa saber o nome do Registro do esquema e o namespace. Você pode obter essas informações usando a CLI do Azure.
Execute o seguinte comando para obter o nome do Registro do esquema e o namespace. Substitua os marcadores de posição com os seus valores.
az iot ops schema registry list -g <RESOURCE_GROUP> --query "[0].{name: name, namespace: properties.namespace}" -o tsv
A saída deverá ter o seguinte aspeto:
<REGISTRY_NAME> <SCHEMA_NAMESPACE>
Salve os valores para as próximas etapas.
Carregar esquema para as Operações IoT do Azure
No início rápido, os dados que vêm do ativo do forno se parecem com:
{
"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
}
}
O formato de esquema necessário para Delta Lake é um objeto JSON que segue o formato de serialização de esquema Delta Lake. O esquema deve definir a estrutura dos dados, incluindo os tipos e propriedades de cada campo. Para obter mais detalhes sobre o formato do esquema, consulte a documentação do formato de serialização do esquema Delta Lake.
Gorjeta
Para gerar o esquema a partir de um arquivo de dados de exemplo, use o Schema Gen Helper.
Para este tutorial, o esquema para os dados tem esta aparência:
{
"$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": {}
}
]
}
}
Salve-o como um arquivo chamado opcua-schema.json
.
Em seguida, carregue o esquema para o Azure IoT Operations usando a CLI do Azure. Substitua os marcadores de posição com os seus 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
Isso cria um esquema nomeado opcua-schema
no registro do Azure IoT Operations com a versão 1
.
Para verificar se o esquema foi carregado, liste as versões do esquema usando a CLI do Azure.
az iot ops schema version list -g <RESOURCE_GROUP> --schema opcua-schema --registry <REGISTRY_NAME>
Criar ponto de extremidade de fluxo de dados
O ponto de extremidade do fluxo de dados é o destino para onde os dados são enviados. Nesse caso, os dados são enviados para o Azure Data Lake Storage Gen 2. O método de autenticação é a identidade gerenciada atribuída ao sistema, que você configura para ter permissões corretas para gravar na conta de armazenamento.
Crie um ponto de extremidade de fluxo de dados usando o Bicep. Substitua os marcadores de posição com os seus 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: {}
}
}
}
}
Salve o arquivo como adls-gen2-endpoint.bicep
e implante-o usando a CLI do Azure
az deployment group create -g <RESOURCE_GROUP> --template-file adls-gen2-endpoint.bicep
Criar um fluxo de dados
Para enviar dados para o Azure Data Lake Storage Gen 2, você precisa criar um fluxo de dados que lê dados do servidor OPC UA e os grava na conta de armazenamento. Nenhuma transformação é necessária neste caso, portanto, os dados são gravados como estão.
Crie um fluxo de dados usando o Bicep. Substitua os marcadores de posição com os seus 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
}
}
]
}
}
Salve o arquivo como adls-gen2-dataflow.bicep
e implante-o usando a CLI do Azure
az deployment group create -g <RESOURCE_GROUP> --template-file adls-gen2-dataflow.bicep
Verificar dados no Azure Data Lake Storage Gen 2
Na conta de armazenamento, vá para a folha Contêineres e selecione o contêiner aiotutorial
que você criou. Você deve ver uma pasta nomeada aiotutorial
e dentro dela, você deve ver arquivos Parquet com os dados do servidor OPC UA. Os nomes dos ficheiros estão no formato part-00001-44686130-347f-4c2c-81c8-eb891601ef98-c000.snappy.parquet
.
Para ver o conteúdo dos arquivos, selecione cada arquivo e selecione Editar.
O conteúdo não é renderizado corretamente no portal do Azure, mas você pode baixar o arquivo e abri-lo em uma ferramenta como o Parquet Viewer.