Partilhar via


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.

Captura de tela mostrando a página de revisão para criar a conta de armazenamento com namespace hierárquico habilitado.

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.

Captura de ecrã do portal do Azure a mostrar onde encontrar o nome da extensão.

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.

Captura de tela mostrando como selecionar a função de colaborador de dados de blob de armazenamento.

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.

Captura de tela mostrando como procurar o nome da extensão Arc e selecioná-lo no IAM.

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 aiotutorialcomo . Selecione Criar para criar o contentor.

Captura de tela mostrando como criar um contêiner de armazenamento no portal do Azure.

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.

Captura de ecrã do portal do Azure a mostrar os ficheiros no contentor.

Para ver o conteúdo dos arquivos, selecione cada arquivo e selecione Editar.

Captura de ecrã do portal do Azure a mostrar o próprio ficheiro parquet.

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.