Compartilhar 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 de Operações do Azure IoT 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 Os Hubs de Eventos. Essa abordagem requer a criação de um esquema Delta Lake que representa os dados, o upload do esquema para as Operações do Azure IoT e, em seguida, a criação de 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 que você armazene os dados diretamente em um data lake escaloná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 de Operações do Azure IoT. Verifique se você pode ver os dados nos Hubs de Eventos.

Criar uma conta de armazenamento com a funcionalidade do Data Lake Storage

Primeiro, siga as etapas para criar uma conta de armazenamento com a funcionalidade do 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 em que as Operações do Azure IoT estão em execução.
  • 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 sejam gravadas 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 das Operações do Azure IoT

No portal do Azure, localize a instância de Operações do Azure IoT que você criou no início rápido. Na folha Visão geral, localize a seção de extensão Arc e veja o nome da extensão. Ela deve ter aparência semelhante a azure-iot-operations-xxxxx.

Captura de tela do portal do Azure mostrando 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 do Azure IoT 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, pesquise a função Colaborador de Dados de Blobs 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, pesquise a identidade gerenciada da extensão das Operações do Azure IoT Arc chamada azure-iot-operations-xxxxx e selecione-a.

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

Conclua a atribuição 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. Selecione Criar para criar o contêiner.

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

Obter o nome e o namespace do registro de esquema

Para carregar o esquema nas Operações IoT do Azure, você precisa saber o nome e o namespace do registro de esquema. Você pode obter essas informações usando a CLI do Azure.

Execute o comando a seguir para obter o nome e o namespace do registro de esquema. Substitua os espaços reservados pelos seus valores.

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

O resultado deve ser assim:

<REGISTRY_NAME>    <SCHEMA_NAMESPACE>

Salve os valores para as próximas etapas.

Carregar esquema para operações de IoT do Azure

No início rápido, os dados provenientes 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 as propriedades de cada campo. Para obter mais detalhes sobre o formato de esquema, consulte a Documentação de formato de serialização de esquema do Delta Lake.

Dica

Para gerar o esquema de um arquivo de dados de exemplo, use o Auxiliar de Geração de Esquema.

Para este tutorial, o esquema dos 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 nas Operações de IoT do Azure usando a CLI do Azure. Substitua os espaços reservados pelos 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 chamado opcua-schema no Registro de Operações do Azure IoT com a versão 1.

Para verificar se o esquema foi carregado, liste as versões de 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 pelo sistema, que você configurou 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 espaços reservados pelos 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: {}
      }
    }
  }
}

Salvar o arquivo como adls-gen2-endpoint.bicep e implantá-lo usando a CLI do Azure

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

Criação de um fluxo de dados

Para enviar dados para o Azure Data Lake Storage Gen2, você precisa criar um fluxo de dados que leia dados do servidor OPC UA e os grave na conta de armazenamento. Nenhuma transformação é necessária nesse caso, portanto, os dados são gravados como estão.

Crie um fluxo de dados usando o Bicep. Substitua os espaços reservados pelos 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
        }
      }
    ]
  }
}

Salvar o arquivo como adls-gen2-dataflow.bicep e implantá-lo 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 Gen2

Na conta de armazenamento, vá para a folha Contêineres e selecione o contêiner aiotutorial que você criou. Você deve ver uma pasta chamada aiotutorial e, dentro dela, você deverá ver arquivos Parquet com os dados do servidor OPC UA. Os nomes de arquivo estão no formato part-00001-44686130-347f-4c2c-81c8-eb891601ef98-c000.snappy.parquet.

Captura de tela do portal do Azure mostrando os arquivos no contêiner.

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

Captura de tela do portal do Azure mostrando o próprio arquivo 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 Parquet Viewer.